C# 是否使用iTextSharp(PDF到文本)修复错误?

C# 是否使用iTextSharp(PDF到文本)修复错误?,c#,pdf,text,itext,extract,C#,Pdf,Text,Itext,Extract,我正在尝试使用iTextSharp(NuGet)以以下方式从PDF文件中恢复文本: this.Cursor = Cursors.WaitCursor; string LOC_DOC = @"C:\PDF_files"; string[] PDFs = Directory.GetFiles(LOC_DOC, "*.pdf", SearchOption.AllDirectories); foreach (string PDF in PDFs)

我正在尝试使用iTextSharp(NuGet)以以下方式从PDF文件中恢复文本:

this.Cursor = Cursors.WaitCursor;
string LOC_DOC = @"C:\PDF_files";

string[] PDFs = Directory.GetFiles(LOC_DOC, "*.pdf", SearchOption.AllDirectories);

    foreach (string PDF in PDFs)
    {

         PdfReader reader = new PdfReader(@PDF);
             
         for (int page = 1; page <= reader.NumberOfPages; page++)
         {
             string pageText = PdfTextExtractor.GetTextFromPage(reader, page);
         }

    }

 this.Cursor = Cursors.Default;
this.Cursor=Cursors.WaitCursor;
字符串LOC_DOC=@“C:\PDF_文件”;
string[]PDFs=Directory.GetFiles(LOC_DOC,“*.pdf”,SearchOption.AllDirectories);
foreach(PDF格式的字符串PDF)
{
PdfReader reader=新的PdfReader(@PDF);
对于(int page=1;页面分析
您共享的PDF在第6页的内容流中有错误,在这种情况下会导致异常:

0.1-16td-3.796tw
[(.)2.943 Tw(……]TJ
-0.138-16 TD-3.796 Tw
[(.)2.943 Tw(……]TJ
0.112-16 TD-3.45 Tw
[(.)3.05 Tw(……)]TJ
TJ指令各自数组参数中的Tws无效,该数组只能包含字符串(圆括号或尖括号)和数字,参见规范:

排列 TJ 显示一个或多个文本字符串,允许单独的字形定位。数组的每个元素应为字符串或数字。如果元素为字符串,则此运算符应显示字符串。如果是数字,则运算符应按该数量调整文本位置

(ISO 32000-1,表109–显示操作员的文本)

如果您的其他文档导致相同的异常(包括类似的堆栈跟踪),则它们很可能在某些TJ指令中也包含此类无效的非字符串、非数字文本

因此,请文档源提供这些文档的固定副本

变通 在你提到的评论中

然而,这些都是旧文件,我不可能要求更正版本

如果在示例文件中发现的内容流错误类型是文件中唯一的内容错误类型,并且忽略该额外文本始终是处理该错误的适当方法,则可以将iText text extraction中的
IContentOperator
processingTJ指令包装到另一个进行筛选的运算符中参数中不需要的文字:

PdfReader reader=new PdfReader(@“d:\Issues\stackoverflow\Fix the error with iTextSharp(PDF to text)\2-30-SL-manual-DE.PDF”);

对于(int page=1;听起来像是PDF内容流中的一个错误的页面;在应该有数字的地方,还有其他东西。虽然PDF查看者倾向于尝试忽略这些错误,但PDF处理库在这里通常会很快失败。如果您共享一个PDF示例,我们可以更仔细地分析问题。@mkl我不能,3500 PDF有点敏感。另一方面,我发现PDF导致了相同的错误:这可能是问题的原因。但是这些是旧文档,我不可能要求更正版本。有没有办法让iTextSharp忽略此错误?当然,您可以更改itext代码,以某种方式忽略此问题,这是错误的或者,如果您不想更改itext程序集,您可以将用于文本提取的相关类复制到您自己的命名空间中,并更改该副本。如果您的所有问题文档的基本问题都是包含非字符串、非数字文本的TJ指令,则还可以为其插入包装器删除这些文本的相应内容运算符,请参见“编辑我的答案”。不过,请注意,这是修复单个类型(或最多修复少数类型)的选项内容流错误。我是一个业余爱好者,我不知道你是怎么做的,更不用说修改源代码了,但是…它工作得非常完美,我可以得到我需要的所有信息!非常感谢!你的代码工作得非常完美,非常容易使用!