如何使用PDFBox精确定位现有PDF页面中的图像?

问题描述:

我可以插入现有的PDF文档中的图像,但问题是,如何使用PDFBox精确定位现有PDF页面中的图像?

  1. 图像被放置在页面的底部,并
  2. 页面变成白色与新添加的文本显示它。

我正在使用以下代码。

List<PDPage> pages = pdDoc.getDocumentCatalog().getAllPages(); 

if(pages.size()>0){ 

PDJpeg img = new PDJpeg(pdDoc, in); 
PDPageContentStream stream = new PDPageContentStream(pdDoc, pages.get(0)); 
stream.drawImage(img, 60, 60); 
stream.close(); 
} 

我希望在第一页上的图像。

PDFBox是一个使用PDF文件的底层库。您需要负责更多高级功能。因此,在本例中,您将图像从文档的左下角开始放置在(60, 60)处。这就是stream.drawImage(img, 60, 60);所做的。

如果您想将图片移动到其他地方,您必须计算并提供想要的位置(可能从page.findCropBox()获得的尺寸或手动输入您的位置)。

至于文字,PDF文档元素是绝对定位的。没有用于重新流动文本,浮动或类似的低级功能。如果您将文字写在图像顶部,则将会写在您的图像上方

最后,为了让您的页面变白 - 您正在创建一个新的内容流,并覆盖原来的页面。您应该附加到已经可用的流。

相关线上:

PDPageContentStream stream = new PDPageContentStream(pdDoc, pages.get(0)); 

你应该做的是这样调用它:

PDPageContentStream stream = new PDPageContentStream(pdDoc, pages.get(0), true, true); 

第一true是是否追加内容,并最终true(不这里至关重要)是是否压缩这个流。

看看AddImageToPDF样本可从PDFBox sources

试试这个

doc = PDDocument.load(inputFileName); 
PDXObjectImage ximage = null; 
ximage = new PDJpeg(doc, new FileInputStream(image) 
PDPage page = (PDPage)doc.getDocumentCatalog().getAllPages().get(0); 
PDPageContentStream contentStream = new PDPageContentStream(doc, page, true, true); 
contentStream.drawImage(ximage, 425, 675); 
contentStream.close(); 

打印在第一页的图像。如果你想在所有页面上打印,只需要以页数作为限制条件放置一个for循环。 这对我很好!

link给你详细介绍有关类PrintImageLocations。 这个PrintImageLocations会给你图像的x和y坐标。

用法:java org.apache.pdfbox.examples.util.PrintImageLocations input-pdf