.net - 使用 itextsharp 阅读 PDF,其中 PDF 语言为非英语

标签 .net c#-4.0 pdf ms-word itextsharp

我正在尝试阅读 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(以及 Adob​​e Reader!)正是其字体信息中的文档所声称的正确内容。

造成这种情况的原因是字体定义中的误导性映射信息,因此整个文档存在误解也就不足为奇了。

关于.net - 使用 itextsharp 阅读 PDF,其中 PDF 语言为非英语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15385270/

相关文章:

.net - 无效的用户输入是否是引发异常的有效原因?

c# - 在 c# .Net 4 中替代 LoadingCache (guava)

php - Laravel 邮件附件超时

C# AD 用户密码过期

javascript - 有什么方法可以在 native react 中选择突出显示pdf文件中的文本

javascript - iFrame 中的 PDF 不适用于 iOS

c# - 在预定义的时间高效运行数十万个函数

c# - 通过匿名类型的帮助缩短此 LINQ 查询?

c# - 0x80000000 == 2147483648 在 C# 但不是在 VB.NET

c#-4.0 - 我的自定义 Windows 服务未写入我的自定义事件日志