java - 如何从 .jar 文件中读取 PDF

标签 java maven pdfbox

在我的 Maven 项目中,我有一个位于 resources 文件夹中的 PDF 文件。我的函数从 resources 文件夹中读取 PDF 文件,并根据用户的数据在文档中添加一些值。

此项目使用 mvn clean install 打包为 .jar 文件,并在我的其他 spring boot 应用程序中用作依赖项。

在我的 spring boot 项目中,我创建了将对 PDF 执行一些工作的类的实例。完成 PDF 文件上的所有作业后,当 PDF 文件保存在文件系统上时,它始终是空的(所有页面都是空白的)。我的印象是 mvn clean install 对 PDF 文件做了一些事情。到目前为止,这是我尝试过的:

第一种方式

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
File file= new ClassPathResource("/pdfs/testpdf.pdf").getFile();//Try to get PDF file

PDDocument pdf = PDDocument.load(file);//Load PDF document from the file
List<PDField> fields = forms.getFields();//Get input fields that I want to update in the PDF    
fieldsMap.forEach(throwingConsumerWrapper((field,value) -> changeField(fields,field,value)));//Set input field values

pdf.save(byteArrayOutputStream);//Save value to the byte array

这很好用,但是一旦项目被打包到 .jar 文件中,我就会得到异常 new ClassPathResource("/pdfs/testpdf.pdf").getFile() ; 找不到指定的文件。

这是正常的,因为 File 类无法访问 .jar 文件中的任何内容(它只能访问 .jar 文件本身) 这很清楚。

因此,该问题的解决方案是使用 InputStream 而不是 File。这是我所做的:

第二种方式

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
InputStream inputStream = new ClassPathResource("/pdfs/testpdf.pdf").getInputStream();//Try to get input stream

PDDocument pdf = PDDocument.load(inputStream );//Load PDF document from the input stream
List<PDField> fields = forms.getFields();//Get input fields that I want to update in the PDF    
fieldsMap.forEach(throwingConsumerWrapper((field,value) -> changeField(fields,field,value)));//Set input field values

pdf.save(byteArrayOutputStream);//Save value to the byte array

这次 getInputStream() 没有抛出错误并且 inputStream 对象不是 null。但是保存在我的文件系统上的 PDF 文件是空的,这意味着所有页面都是空的。

我什至尝试复制完整的 inputStream 并将其逐字节保存到文件中,但我注意到每个字节都等于 0。这是我所做的:

第三种方式

InputStream inputStream = new ClassPathResource("/pdfs/test.pdf").getInputStream();
byte[] buffer = new byte[inputStream.available()];
inputStream.read(buffer);

File targetFile = new File(OUTPUT_FOLDER);
OutputStream outStream = new FileOutputStream(targetFile);
outStream.write(buffer);

复制的 test.pdf 已保存,但在使用 Adob​​e Reader 打开时报告为已损坏。

有人知道如何解决这个问题吗?

最佳答案

你必须像这样加载它:

InputStream inputStream = this.getClass().getClassloader().getResourceAsStream("/pdfs/testpdf.pdf");

如果您通过 ClassLoader 加载它,则路径从类路径的根开始。

关于java - 如何从 .jar 文件中读取 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59346914/

相关文章:

java - 了解 ZooKeeper 启动命令行

java - 如何在文本文件中的两个日期之间进行搜索??? HashMap ?

java - 替换pom.xml中的参数

java - Spring Boot、AWS 应用程序上的 Jackson 数据绑定(bind)依赖项错误

java - Apache PDFBOX - 使用 split(PDDocument 文档)时出现 java.lang.OutOfMemoryError

pdf - 如何使用PDFBox在pdf中查找表格边框线?

java - 数据库连接 ClassNotfoundException

java - 集成测试服务器的数据库填充

java - 为什么在笔记本电脑上成功创建了我的Java docker镜像,但是上传到Google Cloud时却失败了?

java - PdfBox 2.0.3 NullPointerException 在 Linux 上的字体编码