【问题标题】:PDFBox: Loading an Image Into PDF From a JAR ResourcePDFBox:将图像从 JAR 资源加载到 PDF
【发布时间】:2020-09-29 18:49:13
【问题描述】:

下午好。我有一个 JAR 文件,我将一些图像作为资源附加到一个名为 logos 的文件夹中。由于安全限制,我被告知这样做(我们不希望图像文件与 JAR 在同一文件夹中公开)。我首先尝试将这些图像加载为文件对象,但这显然不起作用。我现在正在尝试使用 InputStream 将图像加载到所需的 PDImageXObject 中,但图像没有呈现到 PDF 中。这是我正在使用的代码的 sn-p:

String logoName = "aLogoName.png";
PDDocument document = new PDDocument(); 

// the variable "generator" is an object used for operations in generating the PDF
InputStream logoFileAsStream = generator.getClass().getResourceAsStream("/" + logoName);
PDStream logoStream = new PDStream(document, logoFileAsStream);
PDImageXObject logoImage = new PDImageXObject(logoStream, new PDResources());

PDPage page = new PDPage(new PDRectangle(PDRectangle.A4.getHeight(), PDRectangle.A4.getWidth()));
document.addPage(page);
PDPageContentStream contentStream = new PDPageContentStream(document, page);
contentStream.drawImage(logoImage, 500, 100);

请注意,我已验证资源已正确加载,因为使用 logoFileAsStream.available() 会为各种徽标返回不同的值。运行此代码后,图像实际上并没有在 PDF 上绘制,并且在打开它时,错误消息“此页面存在错误。Acrobat 可能无法正确显示该页面。请联系创建 PDF 文档的人以纠正问题。”出现。有人可以帮我弄清楚代码 sn-p/a 不同的解决方案将我的图像作为 JAR 中的资源加载的问题吗?非常感谢。如果需要/澄清更多细节,请告诉我。

【问题讨论】:

  • 这不是创建图像的方式。请改用 PDImageXObject 的静态方法。完成后关闭 contentStream。
  • 我很想使用这些静态方法(就像我对其他项目所做的那样),但它们需要使用特定的文件路径或 File 对象,我不能这样做,因为我想要的图像引用在 JAR 内部作为资源。鉴于我的限制,您知道使用这些方法的方法吗?你指的PDImageXObject具体是哪个静态方法?
  • PDImageXObject.createFromByteArray() 与 IOUtils.toByteArray() 结合使用。或者将 LosslessFactory.createFromImage() 与 ImageIO.read() 结合使用。
  • 我正在查看旧版本的参考资料,认为我的 PDFBox 版本较旧,所以我没有看到该功能。非常感谢您的回复,做到了!!有没有一种方法可以让我为您提供解决此问题的正确解决方案??
  • 很高兴听到这个消息。我刚刚发布了一个答案,所以点击复选标记。最新版本是2.0.21,是目前最好的:-)

标签: java pdf pdfbox


【解决方案1】:

此 PDImageXObject 构造函数仅供内部 PDFBox 使用。你可以使用

PDImageXObject.createFromByteArray(document, IOUtils.toByteArray(logoFileAsStream), logoName /* optional, can be null */)

为了最大的灵活性,或者如果您知道它始终是 PNG 文件

LosslessFactory.createFromImage(document, ImageIO.read(logoFileAsStream))

不要忘记关闭 logoFileAsStream 和 contentStream。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 2011-08-13
    相关资源
    最近更新 更多