如何使用PDFBox精确定位现有PDF页面中的图像?
问题描述:
我可以插入现有的PDF文档中的图像,但问题是,如何使用PDFBox精确定位现有PDF页面中的图像?
- 图像被放置在页面的底部,并
- 页面变成白色与新添加的文本显示它。
我正在使用以下代码。
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