我们正在使用Apache Tika解析器从各种文档中提取内容,并检测文档是否受密码保护(PDF,MS Office文档等)。使用Tika 1.6,我们使用了以下Scala代码(简化):
val stream: InputStream = ...
val textHandler = new BodyContentHandler(-1) // unlimited write buffer
val metadata = new Metadata()
val parser = new AutoDetectParser(new DefaultDetector())
val text = parser.parse(stream, textHandler, metadata, new ParseContext())
并抓住EncryptedDocumentException
或CryptographyException
包裹在TikaException
。
它曾经工作正常,但是当我们将Tika升级到1.7时检测被破坏了。例如,现在对于受保护的PDF,我们将IOException
包含在TikaException
中:
java.io.IOException: null
at org.apache.pdfbox.filter.FlateFilter.decode(FlateFilter.java:109) ~[tika-app-1.7.jar:1.7]
at org.apache.pdfbox.cos.COSStream.doDecode(COSStream.java:379) ~[tika-app-1.7.jar:1.7]
at org.apache.pdfbox.cos.COSStream.doDecode(COSStream.java:291) ~[tika-app-1.7.jar:1.7]
at org.apache.pdfbox.cos.COSStream.getUnfilteredStream(COSStream.java:225) ~[tika-app-1.7.jar:1.7]
at org.apache.pdfbox.pdfparser.PDFStreamParser.<init>(PDFStreamParser.java:117) ~[tika-app-1.7.jar:1.7]
Caused by: java.util.zip.DataFormatException: incorrect header check
at java.util.zip.Inflater.inflateBytes(Native Method) ~[na:1.7.0_71]
at java.util.zip.Inflater.inflate(Inflater.java:259) ~[na:1.7.0_71]
at java.util.zip.Inflater.inflate(Inflater.java:280) ~[na:1.7.0_71]
at org.apache.pdfbox.filter.FlateFilter.decompress(FlateFilter.java:128) ~[tika-app-1.7.jar:1.7]
at org.apache.pdfbox.filter.FlateFilter.decode(FlateFilter.java:101) ~[tika-app-1.7.jar:1.7]
我们在Tika解析器设置中缺少什么来正确检测受保护的文档?
提前感谢任何提示。
答案 0 :(得分:3)
很难100%确定,但这个问题可能是由以下原因引起的:
http://issues.apache.org/jira/browse/TIKA-1548
此问题出现在1.7中,但似乎已在主分支上解决1.8
关于开源的好处在于它是开放的,所以如果需要,应该可以在本地构建本地修补问题,直到官方1.8发布。