无法将“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
答案 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.