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

.net 使用itextsharp阅读PDF,其中PDF语言为非英语,.net,c#-4.0,pdf,ms-word,itextsharp,.net,C# 4.0,Pdf,Ms Word,Itextsharp,我正在尝试使用C#中的itextsharp读取PDF,它将此PDF转换为word文件。它还需要在word中维护表格格式和字体 当我尝试使用英文pdf时,它将非常有效,但使用一些印度语言,如印地语、马拉地语,它就不起作用了 public string ReadPdfFile(string Filename) { string strText = string.Empty; StringBuilder text = new Stri

我正在尝试使用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(); ;
        }
publicstringreadpdffile(字符串文件名)
{
string strText=string.Empty;
StringBuilder text=新的StringBuilder();
尝试
{
PdfReader reader=新的PdfReader((字符串)文件名);
if(File.Exists(Filename))
{
PdfReader PdfReader=新PdfReader(文件名);

对于@mkl所说的(int page=1;page),我们需要更多关于为什么事情不起作用的信息

首先,
simpletextractionstrategy
非常简单

如果PDF以非自上而下的方式呈现文本,这将导致文本无法真实表示其在PDF中的显示方式

这意味着,尽管PDF看起来应该从上到下阅读,但它可能是以不同的顺序编写的。您引用的PDF实际上先编写了第二个可视行。请参阅my,它尝试从上到下返回文本。当我针对您的PDF的第一页运行代码时,它似乎会将每个文本都拉出“行”正确

第二,PDF没有表格的概念。它们只是在某些位置绘制文本和线条,它们彼此都不相关。这意味着你需要计算每一行并构建自己的表格概念,你在iTextSharp中找不到任何代码为你做这件事。我个人不会这么做我甚至懒得写一本


第三,文本提取用于提取与字体无关的文本。如果你想这样做,你必须自己构建这种逻辑。请参阅my以了解最基本的开始。

我检查了你的文件,特别关注了你的示例”मतद|र“提取为”मतदरर“在文档页面的最顶行中

简言之:

您的文档本身提供了一些信息,例如“符号”मतद|र“在标题行中表示文本”मतदरर“。您应该向文档的来源询问一个文档版本,该版本的字体信息不会产生误导。如果不可能,您应该使用OCR

详细内容:

第一页的顶行由页面内容流中的以下操作生成:

/9 280 Tf
(-12"!%$"234%56*5) Tj
第一行选择大小为280的名为/9的字体(页面开头的操作会将所有内容按0.05的系数进行缩放;因此,文件中的有效大小为14个单位)

第二行打印字形。这些字形在括号中使用该字体的自定义编码引用

当程序试图提取文本时,它必须使用字体中的信息从这些字形引用中推断出实际字符

PDF第一页上的字体/9是使用以下对象定义的:

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 
因此,从第一个文档页面的标题中提取的文本iTextSharp(以及Adobe Reader!)正是该文档在其字体信息中声称的正确内容


由于字体定义中存在误导性的映射信息,因此文档中到处都存在误解也就不足为奇了。

不幸的是,您只是说它不起作用,但并不是出了什么问题。尽管如此,当使用Acrobat Reader从文档中复制和粘贴时,我得到的字符是ich显然与原始PDF内容不同。由于Acrobat Reader有一台相当好的文本提取机器,我假设您的PDF中的印度语文本没有包含除OCR之外的文本提取所需的所有信息。@mkl感谢您的回复。问题是它正在读wordमतदरर 实际单词是मतद|र. pdf中的所有单词都发生了这种情况。因此,单词的实际含义发生了变化。您对此有何建议?我将研究pdf。但是,即使adobe reader没有正确地从pdf中提取文本,我假设您的pdf中的印度文文本没有包含除OCR之外的所有文本提取所需的信息。@mkl那么这是否意味着此PDF将不会转换为word文件?+1;不过,有一句话是这样的:
simpletextractionstrategy
虽然简单,但对于某些文档来说可能仍然是最佳选择;特别是在多栏文本的情况下,只要文本在阅读时已添加到内容中,就不容易识别列分隔顺序。一个人必须根据每个文档来决定。@Chris Haas谢谢你的回答问题是它正在阅读wordमतदरर 实际单词在哪里मतद|र. pdf中的所有单词都会出现这种情况。因此,单词的实际含义发生了变化。正如@mkl所说,即使是Adobe的程序也认为它是错误的文本,这说明可能存在一个很大的问题。更好的解决方案是使用适当的源文件。OCR的工作原理是将pdf页面呈现为位图图形(例如,使用PDFBox)我没有哪种OCR软件适合这项工作的经验。如果你想接受dare,你可能想创建一些代码,只渲染给定PDF中字体中包含的字形,对其进行OCR,导出正确的/ToUnicode表,并将这些表添加到相应PDF中的字体中。@mkl是获取ToUnicode的任何java代码都包含(-12”!%%“234%56*5)我想使用pdf附件中的java代码获取内容流->“/9280 Tf(-12”!%%“234%56*5)Tj”
<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>
- = 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