如何使用PDFBox在现有PDF页面中准确定位图像



我可以在现有的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(此处不关键)是是否压缩流。

看看PDFBox来源的AddImageToPDF示例。

试试这个

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循环。这对我很有效!

答案太晚了,但这是为2020年使用Kotlin进行研究的人准备的:drawImage()正在获取内部的浮点值,所以试试这个:

val file = File(getPdfFile(FILE_NAME))
val document = PDDocument.load(file)
val page = document.getPage(0)
val contentStream: PDPageContentStream
contentStream = PDPageContentStream(document, page, true, true)
// Define a content stream for adding to the PDF
val bitmap: Bitmap? =        ImageSaver(this).setFileName("sign.png").setDirectoryName("signature").load()
val mediaBox: PDRectangle = page.mediaBox
val ximage: PDImageXObject = JPEGFactory.createFromImage(document, bitmap)
           
contentStream.drawImage(ximage, mediaBox.width - 4 * 65, 26f)
// Make sure that the content stream is closed:
contentStream.close()
// Save the final pdf document to a file
pdfSaveLocation = "$directoryPDF/$UPDATED_FILE_NAME"
val pathSave = pdfSaveLocation
document.save(pathSave)
document.close()

我正在创建一个新的PDF,并在下面的代码中循环运行-每页添加一个图像,坐标和高度和宽度值对我来说都很好。

其中out是BufferedImage参考变量

    PDPage page = new PDPage();
    outputdocument.addPage(page);
    PDPageContentStream contentStream = new PDPageContentStream(outputdocument, page, AppendMode.APPEND, true);
    PDImageXObject pdImageXObject = JPEGFactory.createFromImage(outputdocument, out);
    contentStream.drawImage(pdImageXObject, 5, 2, 600, 750);
    contentStream.close();

链接为您提供有关ClassPrintImageLocations的详细信息。此PrintImageLocations将为您提供图像的x和y坐标。

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

最新更新