PDFTextStripper使用错误的编码进行解析

时间:2013-07-15 07:55:06

标签: java pdf pdfbox pdf-parsing

PDFTextStripper stripper = new PDFText2HTML(encoding);
String result = stripper.getText(document).trim();

结果包含类似

的内容
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd"> <html><head><title>Inserat
 SeLe EE rev</title> <meta http-equiv="Content-Type"
 content="text/html; charset=utf-8"> </head> <body> <div
 style="page-break-before:always;
 page-break-after:always"><div><p>&#0;&#1;&#2;&#3;&#4;&#5;&#6;&#7;&#...

而不是

 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd"> <html><head><title>Inserat
 SeLe EE rev</title> <meta http-equiv="Content-Type"
 content="text/html; charset=utf-8"> </head> <body> <div
 style="page-break-before:always; page-break-after:always"><div><p>any
 blablabla characters...

当我将编码更改为windows-1252或utf-8结果未更改时。错误的pdf网址http://www.permaco.ch/fileadmin/user_upload/jobs/Inserat_SeLe_EE_rev.pdf

如何解析这个pdf?

1 个答案:

答案 0 :(得分:3)

  

如何解析this pdf

没有OCR,你就没有。

有问题的PDF不包含提取文本所需的信息,而不至少进行一些OCR(至少OCR使用所用字体的每个字符来查找从字形到字符的映射),这需要额外的库和代码

作为文本提取的要求,PDF规范ISO 32000-1:2008在第9.10.2节中正确地指出用于提取文本的字体需要

  • 包含 ToUnicode CMap - 文档中使用的字体不包含
  • 是一种复合字体,它使用表118中列出的预定义CMap之一(Identity-H和Identity-V除外)或其后代CIDFont使用Adobe-GB1,Adobe-CNS1,Adobe-Japan1,或Adobe-Korea1字符集 - 文档中使用的字体不是 -
  • 是一种使用预定义编码 MacRomanEncoding之一的简单字体, MacExpertEncoding, WinAnsiEncoding,或具有差异数组的编码仅包含取自Adobe标准拉丁字符集的字符名称和名称字符集的编码符号字体 - 文档中使用的字体既不使用其中一种预定义编码,也不使用其差异数组中的字符名称:所使用的名称为 / 0 ,< strong> / 1 ,..., / 155

通常,良好的第一个测试是尝试使用Adobe Reader复制和粘贴文本,因为Reader的代码中有很多文本提取经验。在尝试这样做的时候,你会发现你只会得到垃圾。