如何设置 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
中的 EncryptedDocumentException
或 CryptographyException
。
它以前工作正常,但是当我们将 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 版本发布之前使用本地构建在本地修补问题。
我们使用 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
中的 EncryptedDocumentException
或 CryptographyException
。
它以前工作正常,但是当我们将 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 版本发布之前使用本地构建在本地修补问题。