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 的任何提示?

4

3 回答 3

53

绝对将页面添加到文档中。你会想要这样做,但我也注意到如果你在 PDJpeg 之前创建 PDPageContentStream,PDFBox 不会写出图像。无法解释为什么会这样,但是如果您仔细查看 ImageToPDF 的源代码,他们就是这样做的。在 PDJpeg 之后创建 PDPageContentStream ,它可以神奇地工作。

...
PDJpeg img = new PDJpeg(document, in);
PDPageContentStream stream = new PDPageContentStream( doc, page );
...
于 2011-12-22T00:22:26.130 回答
6

看起来你只是错过了一个document.addPage(page)电话。

另请参阅 PDFBox 中的ImageToPDF示例类以获取一些示例代码。

于 2011-12-21T23:15:30.417 回答
1

这是PDPageContentStream的默认构造函数的样子:

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

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

对我来说,这很有效:

PDPageContentStream contentStream =
        new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, false);
于 2020-05-11T16:42:59.890 回答