【发布时间】: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,是目前最好的:-)