IT小春子 2023-11-28 18:30 采纳率: 69.6%
浏览 56
已结题

想实现找到pdf中的印章字样,然后在印章字样上插入一个图片,并设置图片浮于文字上方

想实现找到pdf中的印章字样,然后在印章字样上插入一个图片,并设置图片浮于文字上方

当前不能找到到印章字样
经查,读取pdf得到的字样为如下:
{


}
{


}
{


}


所以 只能查找到印或章字样,且找到后图片没有浮于文字上方

img

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.pdfbox.text.TextPosition;

import java.io.File;
import java.io.IOException;
import java.util.List;
public class pdfyinzhang {
    private static final String SEARCH_TEXT = "章"; // 搜索的关键字
    private static final float IMAGE_WIDTH = 50; // 图片宽度,单位为点
    private static final float IMAGE_HEIGHT = 50; // 图片高度,单位为点
    private static final String IMAGE_PATH = "d:\\index.gif"; // 图片文件路径
    private static final float IMAGE_XOFFSET = -5; // 图片X偏移量,单位为点
    private static final float IMAGE_YOFFSET = -5; // 图片Y偏移量,单位为点
    public static void main(String[] args) throws IOException {
        // 读取PDF文件
        PDDocument pdfDocument = PDDocument.load(new File("d:\\input.pdf"));
        try {
            // 遍历所有页面
            for (int i = 0; i < pdfDocument.getNumberOfPages(); i++) {
                PDPage page = pdfDocument.getPage(i);

                // 获取页面大小
                PDRectangle pageSize = page.getMediaBox();
                float pageWidth = pageSize.getWidth();
                float pageHeight = pageSize.getHeight();
                // 搜索关键字
                PDFTextStripper stripper = new PDFTextStripper() {
                    @Override
                    protected void writeString(String text, List<TextPosition> textPositions) throws IOException {
                        super.writeString(text, textPositions);
                        for (TextPosition textPosition : textPositions) {
                            String textChunk = textPosition.getUnicode();
                            System.out.println(textChunk);
                            if (textChunk.contains(SEARCH_TEXT)) {
                                System.out.println("找到关键字");
                                // 找到关键字位置后添加图片印章
                                PDImageXObject image = PDImageXObject.createFromFile(IMAGE_PATH, pdfDocument);
                                PDPageContentStream contentStream = new PDPageContentStream(pdfDocument, page, PDPageContentStream.AppendMode.APPEND, true);
                                float x = pageWidth - textPosition.getX() + IMAGE_XOFFSET;
                                float y = pageHeight - textPosition.getY() + IMAGE_YOFFSET;
                                contentStream.drawImage(image, x, y, IMAGE_WIDTH, IMAGE_HEIGHT);
                                contentStream.close();
                            }
                        }
                    }
                };
                stripper.setStartPage(i + 1);
                stripper.setEndPage(i + 1);
                stripper.getText(pdfDocument);
            }
            // 保存修改后的PDF文件
            pdfDocument.save("d:\\inputnewPdf.pdf");
        } finally {
            pdfDocument.close();
        }
    }
}
  • 写回答

3条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-29 22:38
    关注

    【相关推荐】



    • 这篇文章:浏览器打印出完整的知乎文章为PDF文件 也许能够解决你的问题,你可以看下
    • 除此之外, 这篇博客: PDF电子签章,用鼠标拖动印章到指定的位置, 一种在网页PDF中电子签章定位方法中的 三、解决思路 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

             这个问题困扰我一周,网上各种资料翻了个遍,都没有解决方案,实在没办法,读了pdf.js 的源码,了解在不同分辨率下,坐标的转换,有了以下思路。

        1、在html中,<iframe id='pdffile' src="" name="mainFrame" frameborder="1" width="100%" height="100%" scrolling="auto" noresize="noresize"> </iframe> 用来显示pdf文件,然后利用      viewer.html?file= + encodeURIComponent(src1); 的方式加载文件,这个可以去参考其他文章。

      2、在js里,取得viewer里PDFviewer的宽度和高度,注意一下,这个高度是pdf文件的合计高度,比如PDF有10页,高度为7000,那么用这个高度除以总页数,就是每页在浏览器显示的高度了,这个数值是浏览器的坐标体系。方法很简单:

      var iFrame = document.getElementById('pdffile'); 

      PagesCount  =  $.session.get("PagesCount");//总页数

      viewerContainer = iFrame.contentDocument.getElementById('viewer');

      var previewheight  = $(viewerContainer).height();
      var previewwidth =  $(viewerContainer).width();

      previewheight = previewheight / PagesCount;

      3、在viewer.js里,取pdf文档每页的宽度 pagewidth和高度pagehight,这个数值是pdf的坐标体系。这个需要viewer.js里取,然后传回到自己的js里。目的是点击pdf时,取点击页的宽度和高度,用来计算。

      4、进行坐标转换计算,鼠标点击后,取得鼠标点击坐标。利用Pageheight / previewheight 计算出一个缩放比例,那么

                 pdf的X坐标 = 鼠标点击的坐标(positionX) * 缩放比例 就可以了.当然要考虑超出pdf文档的范围,这个自己考虑下就好了,就是判断鼠标位置是否超出了pdf文档的宽度。

                  var targetX = positionX * ( Pageheight / previewheight )

                 pdf的Y坐标 就比较麻烦了,因为在pdf里,(0,0)是左下角,鼠标点击在网页时,(0,0)是左上角。所以 pdf的Y坐标的计算方法:

      var mousepage =  Math.ceil(positionY/previewheight);//判断点击了第几页

      var mouse_page_y =  previewheight *  mousepage -  positionY;//转换成点击pdf页的高度

      var targetY  = mouse_page_y  * ( Pageheight / previewheight ) - dragImageHeight (dragImageHeight是图章的高度)

      还有点小问题 就是如果把鼠标样式变成图章形状(圆形的),点击位置和显示位置有点微小差别,需要微调一下就好。

      至此 大概的解决办法就完成了。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 12月23日
  • 已采纳回答 12月15日
  • 创建了问题 11月28日