如何设置 Tika 解析器以检测受密码保护的文档

How to setup Tika parser to detect password protected docs

我们使用 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())

并且正在捕获包裹在 TikaException 中的 EncryptedDocumentExceptionCryptographyException

它以前工作正常,但是当我们将 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 解析器设置中缺少什么来正确检测受保护的文档?

提前感谢您的任何提示。

很难 100% 确定,但此问题可能由以下原因引起或与之相关:

http://issues.apache.org/jira/browse/TIKA-1548

此问题在 1.7 中存在,但似乎已在 1.8 的主分支上得到解决

开源的伟大之处在于它很好、开放,因此如果需要,应该可以在正式 1.8 版本发布之前使用本地构建在本地修补问题。