【发布时间】:2020-04-08 08:14:29
【问题描述】:
在我的 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 已保存,但使用 Adobe Reader 打开时报告为已损坏。
有人知道如何解决这个问题吗?
【问题讨论】:
-
我不建议使用“可用”,使用
InputStream.readAllBytes()