【发布时间】:2018-06-02 22:37:27
【问题描述】:
PDDocument document = PDDocument.load(file);
if( document.isEncrypted() )
{
document.setAllSecurityToBeRemoved(false);
}
PDFTextStripper stripper = new PDFTextStripper();
//stripper.setSortByPosition( true );
String text = stripper.getText(document);
System.out.println(text);
OutputStreamWriter writer =
new OutputStreamWriter(new FileOutputStream("C:\\preface.txt"), StandardCharsets.UTF_8);
writer.write(text);
writer.flush();
writer.close();
我正在尝试从使用 Dejavu Sans Condensed 和 DejaVu Sans Condensed-Bold 编码的 PDF 文件中提取文本,但它会引发以下错误:
SEVERE: Could not read ToUnicode CMap in font DejaVuSansCondensed
java.io.IOException: Error: expected the end of a dictionary.
at org.apache.fontbox.cmap.CMapParser.parseNextToken(CMapParser.java:477)
at org.apache.fontbox.cmap.CMapParser.parse(CMapParser.java:112)
at org.apache.pdfbox.pdmodel.font.CMapManager.parseCMap(CMapManager.java:75)
at org.apache.pdfbox.pdmodel.font.PDFont.readCMap(PDFont.java:197)
at org.apache.pdfbox.pdmodel.font.PDFont.<init>(PDFont.java:137)
at org.apache.pdfbox.pdmodel.font.PDType0Font.<init>(PDType0Font.java:176)
at org.apache.pdfbox.pdmodel.font.PDFontFactory.createFont(PDFontFactory.java:83)
at org.apache.pdfbox.pdmodel.PDResources.getFont(PDResources.java:146)
at org.apache.pdfbox.contentstream.operator.text.SetFontAndSize.process(SetFontAndSize.java:60)
at org.apache.pdfbox.contentstream.PDFStreamEngine.processOperator(PDFStreamEngine.java:848)
at org.apache.pdfbox.contentstream.PDFStreamEngine.processStreamOperators(PDFStreamEngine.java:503)
at org.apache.pdfbox.contentstream.PDFStreamEngine.processStream(PDFStreamEngine.java:477)
at org.apache.pdfbox.contentstream.PDFStreamEngine.processPage(PDFStreamEngine.java:150)
at org.apache.pdfbox.text.LegacyPDFStreamEngine.processPage(LegacyPDFStreamEngine.java:139)
at org.apache.pdfbox.text.PDFTextStripper.processPage(PDFTextStripper.java:391)
at org.apache.pdfbox.text.PDFTextStripper.processPages(PDFTextStripper.java:319)
at org.apache.pdfbox.text.PDFTextStripper.writeText(PDFTextStripper.java:266)
at org.apache.pdfbox.text.PDFTextStripper.getText(PDFTextStripper.java:227)
at Library.main(Library.java:32)
Jun 03, 2018 1:30:59 AM org.apache.pdfbox.pdmodel.font.PDCIDFontType2 <init>
INFO: OpenType Layout tables used in font DejaVuSansCondensed are not implemented in PDFBox and will be ignored
Jun 03, 2018 1:30:59 AM org.apache.pdfbox.pdmodel.font.PDType0Font toUnicode
WARNING: No Unicode mapping for CID+98 (98) in font DejaVuSansCondensed
Jun 03, 2018 1:30:59 AM org.apache.pdfbox.pdmodel.font.PDType0Font toUnicode
WARNING: No Unicode mapping for CID+105 (105) in font DejaVuSansCondensed
我还发现该特定 pdf 文件集没有 unicode 映射。请帮助编写此程序的 unicode 映射
附:我是 PDFBox 的新手
【问题讨论】:
-
堆栈跟踪听起来像是您文件中的字体确实具有损坏或无效的 ToUnicode 映射,或者与 pdfbox 的预期不同。因此,为了进一步分析,请分享一个示例 pdf。
-
实际上我不能在这里发布 pdf,因为它是机密文件,谁能告诉我如何将 unicode 映射添加到 PDFBox?我是否将其添加到 PDFBox 中的 attributes.txt 中?
-
我发布的链接说明了这一点。是的,这是一个巨大的痛苦。顺便说一句,请确保您使用的是最新版本的 PDFBox,即 2.0.9。
-
我正在使用最新版本的 pdfbox,即 2.0.9,我无法使用 pdf 调试器打开当前的 pdf 文件,我会设法解决它