PDFBox:从 ​​JAR 资源将图像加载到 PDF

PDFBox: Loading an Image Into PDF From a JAR Resource

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

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() returns 为各种徽标设置了不同的值。 运行 此代码后,图像实际上并没有绘制到 PDF 上,打开它时,出现错误消息“此页面上存在错误。Acrobat 可能无法正确显示该页面。请联系创建者PDF 文档以更正问题。”出现。有人可以帮我弄清楚该代码有什么问题 snippet/a 将我的图像作为资源从 JAR 加载的不同解决方案吗?非常感谢。如果有更多详细信息 needed/clarification.

,请告诉我

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

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

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

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

别忘了关闭 logoFileAsStream 和 contentStream。