提取文本时出错

时间:2013-03-20 23:11:48

标签: itextsharp

无法将“iTextSharp.text.pdf.PdfLiteral”类型的对象转换为“iTextSharp.text.pdf.PdfNumber”。

CODE:

StringBuilder text = new StringBuilder();

SimpleTextExtractionStrategy strategy = new SimpleTextExtractionStrategy();

for (int p = 1; p <= reader.NumberOfPages; p++)
{

    text.AppendLine(PdfTextExtractor.GetTextFromPage(reader, p, strategy));
}
reader.Close();
return text.ToString();

只有极少数pdf才会出现此错误。有什么想法吗?

STACK TRACE:

   at iTextSharp.text.pdf.parser.PdfContentStreamProcessor.ShowTextArray.Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List`1 operands)
   at iTextSharp.text.pdf.parser.PdfContentStreamProcessor.InvokeOperator(PdfLiteral oper, List`1 operands)
   at iTextSharp.text.pdf.parser.PdfContentStreamProcessor.ProcessContent(Byte[] contentBytes, PdfDictionary resources)
   at iTextSharp.text.pdf.parser.PdfReaderContentParser.ProcessContent[E](Int32 pageNumber, E renderListener)
   at iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(PdfReader reader, Int32 pageNumber, ITextExtractionStrategy strategy)
   at DCS.Common.PDF.Functions.GetTextPdf(PdfReader reader) in C:\Users\rmaldonado\Documents\Visual Studio 2008\Projects\DCS\Contract\Common\PDF\Functions.cs:line 35
   at DCS.Common.PDF.Functions.ParsePDF(Byte[] bytes) in C:\Users\rmaldonado\Documents\Visual Studio 2008\Projects\DCS\Contract\Common\PDF\Functions.cs:line 23
   at DCS.CAPPS.BLL.Common.Attachment.ReParseText() in C:\Users\rmaldonado\Documents\Visual Studio 2008\Projects\DCS\Contract\ContractBLL\Common\Common.cs:line 1120

3 个答案:

答案 0 :(得分:1)

从pdf中提取文本,请尝试使用下面给出的代码

PdfTextExtractor.GetTextFromPage(reader, p, new LocationTextExtractionStrategy())

答案 1 :(得分:1)

正如@mkl所说,PDf中也可能存在错误。尝试将文本内容从PDf复制粘贴到记事本。是否空白。检查内容是图像格式还是其他格式。并尽可能提供完整的代码。

答案 2 :(得分:1)

文档Mod 2.pdf的页面内容完全被破坏。它实际上已经破坏了Adobe Preflight(来自Acrobat 9.5.4),就像iText在尝试分析它时遇到错误一样。

手动检查表明最明显的错误与注入 TJ 操作的操作数数组的操作有关,例如

[(OMB) 0.0 Tc -278.0 (Approval) 0.0 Tc -278.0 (2700-0042) ] TJ

[(AMENDMENT) 0.0 Tc -278.0 (OF) 0.0 Tc -278.0 (SOLICITATION/MODIFICATION)
 0.0 Tc -278.0 (OF) 0.0 Tc -278.0 (CONTRACT) ] TJ

此模式仍在继续,即每个非平凡的 [...] TJ 操作都包含注入的 0.0 Tc 操作。

这是错的,参见PDF规范ISO 32000-1:2008的第7.8.2节:

  

在PDF中,操作员所需的所有操作数应紧接在该操作符之前。运算符不返回结果,操作符完成执行时不应遗留操作数。

这使PdfContentStreamProcessor.ShowTextArray.Invoke(负责处理 TJ 操作)遇到错误。由于 TJ 的操作数数组可能只包含字符串和数字,因此非PdfString,的所有内容都会转换为PdfNumber,但 Tc 运算符是PdfLiteral.

的实例