【问题标题】:Can't add an image to a pdf using PDFBox无法使用 PDFBox 将图像添加到 pdf
【发布时间】:2012-01-21 05:16:27
【问题描述】:

我正在编写一个使用 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 的任何提示?

【问题讨论】:

    标签: java pdf pdfbox


    【解决方案1】:

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

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

    【讨论】:

    • 在 PDPageContentStream 解决我的问题之前移动 PDJpeg 创建,非常感谢。
    • Dah,我也一直在与这个作斗争,这解决了它,谢谢。似乎是我书中的一个错误......至少应该发出警告!
    • 你救了我!肿瘤坏死因子。工作了一个小时才弄清楚为什么我的图像没有从 ByteArrayInputStream 显示...是 PDJpeg 和 PDPageContentStream 的顺序...
    • 我发现它只是PDPageContentStream之后创建的第一个PDJpeg。我正在写 3 张图片,第一张不会显示在 pdf 上,但另外两张没有问题。为了解决这个问题,我创建了第一个PDJpeg,然后用相同的图像创建了一个新的PDJpeg 对象并写入它。然后我毫无问题地写了另外两张图片。不方便,但可以。
    • 谢谢!我和我的同事都快疯了:)
    【解决方案2】:

    您似乎只错过了一个 document.addPage(page) 电话。

    有关示例代码,另请参阅 PDFBox 中的 ImageToPDF 示例类。

    【讨论】:

    • 页面在实际代码中添加到文档中,我忘记粘贴那行代码了,我正在更正原帖。
    【解决方案3】:

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

    【讨论】:

    • 这应该是被接受的答案。这解决了向现有页面添加内容时的空白页面问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多