- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所以,我正在这样做:
PDFMergerUtility mergePdf = new PDFMergerUtility();
for (int i = 0; i < filePaths.size(); i++)
mergePdf.addSource(filePaths.get(i));
mergePdf.setDestinationFileName(tempFile.getAbsolutePath());
mergePdf.mergeDocuments();
这非常有效,直到在无法解析的 PDF 上引发异常(损坏的 PDF 或 PDFBox 无法处理的内容)。这种情况并不经常发生。
我希望能够知道它在哪些源上失败,在后续合并中排除它们,并告诉用户哪些文档失败。
这可以做到吗?
更新:
这是我的异常(exception):
java.io.IOException: Error: Expected a long type at offset 591535, instead got 'E^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^UZí^KÄ@©¢^X<8d>G §ÑE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^TQE^T<84>f<96><8a>'
at org.apache.pdfbox.pdfparser.BaseParser.readLong(BaseParser.java:1695)
at org.apache.pdfbox.pdfparser.BaseParser.readObjectNumber(BaseParser.java:1623)
at org.apache.pdfbox.pdfparser.PDFParser.parseObject(PDFParser.java:614)
at org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:203)
at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1220)
at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1187)
at org.apache.pdfbox.util.PDFMergerUtility.mergeDocuments(PDFMergerUtility.java:237)
at org.apache.pdfbox.util.PDFMergerUtility.mergeDocuments(PDFMergerUtility.java:194)
at myapp.util.DocumentImage.combinePDFs(DocumentImage.java:289)
at myapp.webapp.download.DownloadLatestForCLO.generate(DownloadLatestForCLO.java:73)
at myapp.webapp.download.DownloadLatestForCLO.getFileSize(DownloadLatestForCLO.java:64)
at myapp.webapp.download.DownloadServlet.handleRequest(DownloadServlet.java:58)
at myapp.webapp.download.DownloadServlet.doGet(DownloadServlet.java:32)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:200)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
最佳答案
幸运的是PDFBox是开源所以已经下载了最新的源代码(在撰写本文时为2.00 RC3)并在文件中\pdfbox-2.0.0-RC3\pdfbox\src\main\java\org\apache\pdfbox\multipdf\PDFMergerUtility.java
(第 188 行左右)
我们可以看到它从较低级别向上抛出此异常,并且没有捕获它并添加导致错误的文件的详细信息。
在修复此问题之前,您必须在代码中捕获此错误,并迭代加载和关闭它们的每个源文件,直到找到无法处理的文件并自行报告此问题。
如果您有兴趣从源头解决问题(在 PDFBox 内),那么您需要进行编辑并提交给 PDFBox 项目团队。当该修复程序合并到构建中并且您升级到该版本时,您可以安全地删除迭代代码:
try
{
MemoryUsageSetting partitionedMemSetting = memUsageSetting != null ?
memUsageSetting.getPartitionedCopy(sources.size()+1) :
MemoryUsageSetting.setupMainMemoryOnly();
Iterator<InputStream> sit = sources.iterator();
destination = new PDDocument(partitionedMemSetting);
while (sit.hasNext())
{
sourceFile = sit.next();
source = PDDocument.load(sourceFile, partitionedMemSetting);
tobeclosed.add(source);
appendDocument(destination, source);
}
if (destinationStream == null)
{
destination.save(destinationFileName);
}
else
{
destination.save(destinationStream);
}
}
finally
{
....}
关于java - PDFBox PDFMergerUtility : how do I tell which sources failed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35373787/
有什么区别?据我了解,Tell (object, IActorRef) 发送原始发件人。但为什么不只使用 Forward 方法呢? 谢谢 最佳答案 您可以将actorRef.Tell(msg) 视为a
我是 akka 的初学者。有人可以向我解释为什么 tell 方法定义如下: receiver.tell(msg, sender); 在我看来,有人向其他人发送消息,在 OOP 中它会这样: sende
每次运行此脚本时,我都会收到此错误:系统事件出现错误:“Test123”不理解通知消息。 代码: --more code... tell application "System Events"
在 Core Python Programming 这本书中,有以下示例 - >>> f = open('/tmp/x', 'w+')>>> f.tell()0>>> f.write('test li
能否请您告诉我 off_t tell(int fd) 函数在 Mac OS X 中的何处定义?它不在 fcntl.h 中,也不在 unistd.h 中,它在 UNIX 中定义...我不能使用 >fte
Python tell()函数:获得当前读取位置 文件可以被看作是字节流或者字符流。第一个读入的字符是在该流的第 0 个位置上。如果读入了 5 个字符,则现在在该流的第 5 个位置上。 我们可以用 t
版本 3.1.3(如果相关)。 这个建议现在可能有效,但将来会有效吗? NSString *device = [UIDevice currentDevice].model; if([device is
docker异常停止时,第一时间找不到。 有没有办法在它停止时通过邮件或其他任何方式发送给我? 我用shipyard来管理,但是没有这个功能。 我能否找到一种方法来监控docker意外停止并向用户发送
我在使用 Java 套接字 API 时遇到了一些问题。我正在尝试显示当前连接到我的游戏的玩家数量。很容易确定玩家何时已连接。然而,使用套接字 API 来确定玩家何时断开连接似乎不必要地困难。 在已远程
我在使用 Java 套接字 API 时遇到了一些问题。我正在尝试显示当前连接到我的游戏的玩家数量。很容易确定玩家何时已连接。然而,使用套接字 API 来确定玩家何时断开连接似乎不必要地困难。 在已远程
我正在尝试复制 Compass 应用程序中的功能 - 但我卡在了一个特定的位置:我如何确定界面中的“向上”方向? 我在屏幕上有一个标签,并且我有以下代码可以在设备四处移动时使其保持水平: self.m
我开始学习Akka并从official guid下载了示例: 我不明白tell方法第二个参数的用法: 在main方法中写入: howdyGreeter.tell(new WhoToGreet("Akk
我想在我的应用程序中添加一个“告诉 friend ”选项,允许用户选择多个联系人向他们发送电子邮件。联系人需要过滤为仅拥有电子邮件地址的联系人。 有谁知道我可以重复使用的现成示例吗? 最佳答案 我最近
我不明白为什么 tell() 函数在这种情况下不起作用。让我们创建一个包含字符串“1\n2\n3\n4\n”的文件: f=open('test.tmp','w') f.write('1\n2\n3\n
我正在尝试打开一个文件并从上次读取的点开始读取。我的文件相当大(20 Mb 到 ~ 1 Gb) 经过一些研究后,似乎 tell() 和 seek() 将是执行此操作的最有效方法之一。我试过下面的代码
我在使用 Java 套接字 API 时遇到了一些问题。我正在尝试显示当前连接到我的游戏的玩家数量。很容易确定玩家何时已连接。然而,使用套接字 API 来确定玩家何时断开连接似乎不必要地困难。 在已远程
我在 Windows 上使用 Python 2.7,我是 Python 的新手,如果这很简单,请原谅我。 我读过的所有内容都说 tell() 返回“位置”,我相信这基本上是我们当前在阅读中所处的光标位
有没有人碰巧知道为什么要以这种方式遍历文件: 输入: f = open('test.txt', 'r') for line in f: print "f.tell(): ",f.tell()
试图在读取一行后使用tell() 获取光标位置。 text mode 和 \r 似乎有问题。我是在滥用该方法还是它是一个错误?谢谢。 用 python2.6、2.7、3.3 测试,输出相同。 impo
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭12 年前。 Improve th
我是一名优秀的程序员,十分优秀!