我正在尝试阅读 this在 C# 中使用 itextsharp 的 PDF,它将将此 pdf 转换为 word 文件。还需要在word中维护表格格式和字体
当我尝试使用英语 pdf 时,它会完美运行,但使用某些印度语言(如印地语、马拉地语)却无法正常工作。
public string ReadPdfFile(string Filename)
{
string strText = string.Empty;
StringBuilder text = new StringBuilder();
try
{
PdfReader reader = new PdfReader((string)Filename);
if (File.Exists(Filename))
{
PdfReader pdfReader = new PdfReader(Filename);
for (int page = 1; page <= pdfReader.NumberOfPages; page++)
{ ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
string currentText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy);
text.Append(currentText);
pdfReader.Close();
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
textBox1.Text = text.ToString();
return text.ToString(); ;
}
最佳答案
我检查了您的文件,特别关注您的样本“मतद|र”在文档页面的最上面一行被提取为“मतदरर”。
简而言之:
您的文件本身提供的信息,例如标题行中的字形“मतद|र”代表文本“मतदरर”。您应该向文档来源询问字体信息不会误导的文档版本。如果这是不可能的,你应该去 OCR。
详细:
第一页的顶行由页面内容流中的以下操作生成:
/9 280 Tf
(-12"!%$"234%56*5) Tj
第一行选择名为 的字体/9 大小为 280(页面开头的操作将所有内容按 0.05 倍缩放;因此,有效大小为您在文件中观察到的 14 个单位)。
第二行导致打印字形。这些字形使用该字体的自定义编码在括号之间引用。
当程序试图提取文本时,它必须使用来自字体的信息从这些字形引用中推断出实际字符。
字体/9 在您的 PDF 的第一页上是使用这些对象定义的:
242 0 obj<<
/Type/Font/Name/9/BaseFont 243 0 R/FirstChar 33/LastChar 94
/Subtype/TrueType/ToUnicode 244 0 R/FontDescriptor 247 0 R/Widths 248 0 R>>
endobj
243 0 obj/CDAC-GISTSurekh-Bold+0
endobj
247 0 obj<<
/Type/FontDescriptor/FontFile2 245 0 R/FontBBox 246 0 R/FontName 243 0 R
/Flags 4/MissingWidth 946/StemV 0/StemH 0/CapHeight 500/XHeight 0
/Ascent 1050/Descent -400/Leading 0/MaxWidth 1892/AvgWidth 946/ItalicAngle 0>>
endobj
所以没有/编码 元素,但至少有一个对 的引用/ToUnicode map 。因此,提取文本的程序必须依赖于给定的 /ToUnicode 映射。
引用的流/ToUnicode 从 (-12"!%$"234%56*5) 中提取文本时包含以下感兴趣的映射:
<21> <21> <0930>
<22> <22> <0930>
<24> <24> <091c>
<25> <25> <0020>
<2a> <2a> <0031>
<2d> <2d> <092e>
<31> <31> <0924>
<32> <32> <0926>
<33> <33> <0926>
<34> <34> <002c>
<35> <35> <0032>
<36> <36> <0030>
(已经在这里你可以看到多个字符代码被映射到同一个 unicode 代码点......)
因此,文本提取必须导致:
- = 0x2d -> 0x092e = म
1 = 0x31 -> 0x0924 = त
2 = 0x32 -> 0x0926 = द
" = 0x22 -> 0x0930 = र instead of |
! = 0x21 -> 0x0930 = र
% = 0x25 -> 0x0020 =
$ = 0x24 -> 0x091c = ज
" = 0x22 -> 0x0930 = र
2 = 0x32 -> 0x0926 = द
3 = 0x33 -> 0x0926 = द
4 = 0x34 -> 0x002c = ,
% = 0x25 -> 0x0020 =
5 = 0x35 -> 0x0032 = 2
6 = 0x36 -> 0x0030 = 0
* = 0x2a -> 0x0031 = 1
5 = 0x35 -> 0x0032 = 2
因此,从第一个文档页面的标题中提取的文本 iTextSharp(以及 Adobe Reader!)正是其字体信息中的文档所声称的正确内容。
造成这种情况的原因是字体定义中的误导性映射信息,因此整个文档存在误解也就不足为奇了。
关于.net - 使用 itextsharp 阅读 PDF,其中 PDF 语言为非英语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15385270/