无法使用PDFBox将图像添加到PDF

29
我正在编写一个使用pdfbox库从头创建PDF的Java应用程序。
我需要在其中一页中放置一个jpg图像。
我正在使用以下代码:
PDDocument document = new PDDocument();
PDPage page = new PDPage(PDPage.PAGE_SIZE_A4);
document.addPage(page); 
PDPageContentStream contentStream = new PDPageContentStream(document, page);

/* ... */ 
/* code to add some text to the page */
/* ... */

InputStream in = new FileInputStream(new File("c:/myimg.jpg"));
PDJpeg img = new PDJpeg(document, in);
contentStream.drawImage(img, 100, 700);
contentStream.close();
document.save("c:/mydoc.pdf");
当我运行该代码时,它成功终止,但是如果我使用Acrobat Reader打开生成的pdf文件,则页面完全白色,图像未放置在其中。
相反,文本正确地放置在页面上。
有什么提示可以将我的图像放入pdf中吗?
3个回答

53

一定要将页面添加到文档中。你会想这么做,但我也注意到如果你在创建PDJpeg之前创建PDPageContentStream,PDFBox不会写出图片。为什么会这样还没有解释,但是如果你仔细查看ImageToPDF的源代码,就会发现他们是这么做的。在创建PDJpeg之后创建PDPageContentStream,它就神奇地工作了。

...
PDJpeg img = new PDJpeg(document, in);
PDPageContentStream stream = new PDPageContentStream( doc, page );
...

4
将PDJpeg的创建放在PDPageContentStream之前解决了我的问题,非常感谢。 - Davide Gualano
1
哎呀,我也一直在与这个问题斗争,但是这个解决方案解决了它,谢谢。看起来像是我的书中的一个错误...至少应该给出一个警告! - Michael Berry
你救了我!谢谢。我花了一个小时才弄清楚为什么我的图像从ByteArrayInputStream中没有显示出来...原来是PDJpeg和PDPageContentStream的顺序问题... - Mircea Stanciu
2
我发现只有在PDPageContentStream之后创建的第一个 PDJpeg 会出现问题。我正在写入3张图像,第一张图像无法显示在PDF上,但其他两个没有问题。为了解决这个问题,我创建了第一个 PDJpeg,然后再创建一个具有相同图像的新的 PDJpeg 对象并进行写入。然后我顺利地写入了另外两个图像。不太方便,但是它能够正常工作。 - Niro
谢谢!我和我的同事都快疯了 :) - lbrutti

6

看起来你只是缺少一个 document.addPage(page) 的调用。

另外,PDFBox 中的 ImageToPDF 示例类提供了一些样例代码。


页面已经添加到实际代码中的文档中,我忘记粘贴那行代码了,我正在更正原始帖子。 - Davide Gualano

2

这是 PDPageContentStream 的默认构造函数:

public PDPageContentStream(PDDocument document, PDPage sourcePage) throws IOException
{
    this(document, sourcePage, AppendMode.OVERWRITE, true, false);
}

我的问题是使用另一个带有参数PDPageContentStream.AppendMode.APPEND的构造函数解决了AppendMode.OVERWRITE的问题。

对我来说,这个方法起作用:

PDPageContentStream contentStream =
        new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, false);

1
这应该是被接受的答案。当向现有页面添加内容时,它解决了空白页面问题。 - Guillermo Gefaell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接