[英]End of file exception - Merge pdf using pdfbox
我在 S3 上有 pdf 文件,想合并到一个 pdf 中。
我正在使用输入流数组从 s3 读取文件,然后使用 pdf 合并实用程序进行合并。 下面的代码在一次添加所有输入流时工作正常(在 for 循环之后),但不适用于单个输入流。 在输入流上的 IO 操作上缺少某些内容,例如关闭 stream:(
for (PS3ObjectStream pFileS3Obj: PS3ObjectStream ) {
try {
pdfMerger.addSource(pFileS3Obj.getS3ObjectInputStream());
}catch(Exception e) {
e.printStackTrace();
}
pdfMerger.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly());
}
不工作:
for (PS3ObjectStream pFileS3Obj: PS3ObjectStream ) {
try {
pdfMerger.addSource(pFileS3Obj.getS3ObjectInputStream());
pdfMerger.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly());
}catch(Exception e) {
e.printStackTrace();
}
}
我收到错误:文件结束,预期的行异常。
关于我应该如何研究这个问题的任何指示。
java.io.IOException: Error: End-of-File, expected line
at org.apache.pdfbox.pdfparser.BaseParser.readLine(BaseParser.java:1107)
at org.apache.pdfbox.pdfparser.COSParser.parseHeader(COSParser.java:2650)
at org.apache.pdfbox.pdfparser.COSParser.parsePDFHeader(COSParser.java:2633)
at org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:219)
at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1230)
at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1148)
at org.apache.pdfbox.multipdf.PDFMergerUtility.legacyMergeDocuments(PDFMergerUtility.java:455)
at org.apache.pdfbox.multipdf.PDFMergerUtility.mergeDocuments(PDFMergerUtility.java:346)
at com.djcs.pslintegration.pdfutility.mergeService.MergePdfFileService.mergePDfFiles(MergePdfFileService.java:92)
at com.djcs.pslintegration.pdfutility.mergeService.MergePdfFileService.combinePdfFiles(MergePdfFileService.java:47)
at com.djcs.pslintegration.pdfutility.controller.PDFUtilityController.combinePdfFiles(PDFUtilityController.java:98)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:681)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743)
这是因为PDFMergerUtility
保留了一个源列表,并且在mergeDocuments()
完成后不会重置它,因此您在第二个代码段中所做的是在同一输入流列表上重新运行几次合并,尽管第一个输入 stream 已经被消耗。
我的要求是一次合并一个文件并将任何失败的文件捕获到响应 object 中,使用第二个选项我将无法捕获任何失败的文件
因此,如果您想一次合并一个文件,那么最好使用appendDocument()
方法而不是mergeDocuments()
方法(并从空 PDDocument 开始,并在调用之前从 s3 加载当前 PDDocument) .
这是一个代码尝试(我无法测试它,因为我不使用 s3;如果目标中使用任何资源,也存在过早关闭source
的风险)。
PDDocument destination = new PDDocument();
for (PS3ObjectStream pFileS3Obj : PS3ObjectStream)
{
PDFMergerUtility pdfMerger = new PDFMergerUtility();
PDDocument source;
try (InputStream is = pFileS3Obj.getS3ObjectInputStream())
{
source = PDDocument.load(is);
}
catch (IOException)
{
// do something
}
try
{
appendDocument(destination, source);
}
catch (Exception e)
{
// do something
}
finally
{
source.close();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.