【问题标题】:Unable to Insert image from classpath into PDF using PDFBox无法使用 PDFBox 将类路径中的图像插入 PDF
【发布时间】:2021-07-01 07:10:49
【问题描述】:

我有一个 springBoot 项目,我正在尝试使用 PDFBox 库将图像插入 PDF。该图像位于 src/main/resources/image 文件夹 (myImage.jpg) 中。实现代码如下。在运行程序时,我收到一个错误,即在指定路径中找不到图像。在这种情况下,从类路径中检索图像的正确方法是什么。

public class PDFImageService {  
  
public void insertImage() throws IOException {  
              
    //Loading an existing document   
      File file = new File("/eclipse-workspace/blank.pdf");  
      PDDocument doc = PDDocument.load(file);  
  
//Retrieving the page  
      PDPage page = doc.getPage(1);  
  
//Creating PDImageXObject object  
      PDImageXObject pdImage = PDImageXObject.createFromFile("/image/myImage.jpg",doc);  
  
//creating the PDPageContentStream object  
      PDPageContentStream contents = new PDPageContentStream(doc, page);  

//Drawing the image in the PDF document  
contents.drawImage(pdImage, 250, 300);  

      System.out.println("Image inserted Successfully.");  
  
//Closing the PDPageContentStream object  
contents.close();         
  
//Saving the document  
doc.save("/eclipse-workspace/blank.pdf");  
  
//Closing the document  
doc.close();  
}  

}

如果我给出完全指定的图像路径,它工作正常

PDImageXObject pdImage = PDImageXObject.createFromFile("C:\Users\Dell\Desktop\PDF\myImage.jpg",doc);  

【问题讨论】:

  • 我从未尝试过以这种方式加载资源,我会使用PDFImageService.class.getResourceAsStream("/image/myImage.jpg"),然后将其放入字节数组中,然后使用PDImageXObject.createFromByteArray()
  • @TilmanHausherr:我尝试使用 PDImageXObject.createFromByteArray(document, byteArray, "myImage");我收到图像类型 myImage 不支持错误。我也尝试通过将第三个参数传递为 null 但仍然得到相同的错误。
  • 那么它要么是空的(你是否正确复制了流,检查错误结果?)或者它不是一个有效的图像,或者你有资源过滤。
  • @TilmanHausherr:它与 IOUtils.toByteArray 一起使用。 InputStream imageAsStream = this.getClass().getResourceAsStream(/image/myImage.jpg); PDImageXObject.createFromByteArray(document, IOUtils.toByteArray(imageAsStream), null)。谢谢你的帮助!!

标签: java spring spring-boot classpath pdfbox


【解决方案1】:

正如 cmets 中所讨论的,它通过使用来工作

PDImageXObject img;
try (InputStream is = PDFImageService.class.getResourceAsStream("/image/myImage.jpg");
{
    // check whether InputStream is null omitted
    byte [] ba = IOUtils.toByteArray(imageAsStream);
    img = PDImageXObject.createFromByteArray(document, ba, "myImage.jpg");
}

【讨论】:

    【解决方案2】:

    除非 eclipse-workspace 文件夹位于 /(根)操作系统的顶部文件中,否则它将是隐含的并且错误地说明,当您安装配置的 eclipse 时,它​​通常会断言用户主文件夹以将工作空间放入其中。如果它在 root / 那么我建议你在 IOException 之前添加一个 FileNotFoundException。

    【讨论】:

      猜你喜欢
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 2017-02-26
      • 1970-01-01
      相关资源
      最近更新 更多