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

时间:2015-04-09 17:18:37

标签: scala pdf password-protection apache-tika

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

并抓住EncryptedDocumentExceptionCryptographyException包裹在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解析器设置中缺少什么来正确检测受保护的文档?

提前感谢任何提示。

1 个答案:

答案 0 :(得分:3)

很难100%确定,但这个问题可能是由以下原因引起的:

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

此问题出现在1.7中,但似乎已在主分支上解决1.8

关于开源的好处在于它是开放的,所以如果需要,应该可以在本地构建本地修补问题,直到官方1.8发布。