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

时间:2012-02-17 10:05:05

标签: pdfbox

我可以在现有的pdf文档中插入一个Image,但问题是,

  1. 图片位于页面底部
  2. 页面变为白色,并在其上显示新添加的文字。
  3. 我正在使用以下代码。

    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();
    }
    

    我希望第一页上有图片。

5 个答案:

答案 0 :(得分:8)

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样本。

答案 1 :(得分:1)

试试这个

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循环进行打印。 这对我很有用!

答案 2 :(得分:1)

这么晚的答案,但这是给谁在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()

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

我正在创建一个新的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();