我正在使用ITextSharp并列出代码从pdf中提取文本。 但我发现有些行给出了错误的结果:
又一个例子:
经过调查,我发现pdf文件包含 法国脚本-MT-58fbba579ea99.ttf
using (PdfReader reader = new PdfReader(pfile.path)){
StringBuilder text = new StringBuilder();
if (pagenum == 0)
{
for (int i = 1; i <= reader.NumberOfPages; i++)
{
string page = "";
page = PdfTextExtractor.GetTextFromPage(reader, i, new
iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy());
string stringOutput = page;
string[] lines = stringOutput.Split('\n');
allData.Add(lines);
output = lines;
}
}
}
答案 0 :(得分:0)
所有带有英镑货币符号“£”的条目都是使用字体(分别命名为 C2_0 和 C2_2 )绘制的,而不包含PDF文本提取所需的信息,如PDF规范ISO 32000-1第9.10节“文本内容的提取”:它们使用编码 Identity-H (这并不意味着任何映射到Unicode)并且没有 ToUnicode 映射。
用于其他条目的字体使用有意义的编码( T1_0 和 T1_1 使用 WinAnsiEncoding )或使用 ToUnicode 地图( C2_1 )。
由于iText中的文本提取基本上遵循第9.10节中的描述,因此iText无法提取这些£条目的实际文本,而是返回原始字形代码,就像Adobe Reader copy&amp; paste一样。
通常这意味着必须使用OCR,或者整个页面使用OCR提取所有文本,或者单独提取相关字体的字符以构建 ToUnicode 表格那些字体,然后如上提取文本。
在这种情况下, C2_0 和 C2_2 嵌入式字体程序本身包含将包含的字形映射到Unicode代码点的信息。因此,还可以使用这些字体程序中的信息构建 ToUnicode 表。可以使用可以处理真实字体的字体库从字体程序中读取这些信息。