iTextSharp PdfTextExtractor GetTextFromPage抛出NullReferenceException

时间:2015-03-23 11:53:54

标签: c# pdf pdf-generation itextsharp

我正在使用iTextSharp阅读PDF文档,但最近似乎我得到了

  

{"对象引用未设置为对象的实例。"}

从PdfReader的页面获取文本时出现

或NullReferenceException。在它工作之前,但在这一天之后,它还没有工作。我没有改变我的代码。

以下是我的代码:

for (int i = 1; i <= reader.NumberOfPages; i++)
        {
            ITextExtractionStrategy its = new SimpleTextExtractionStrategy();
            string currentText = PdfTextExtractor.GetTextFromPage(reader, i, its);
            if (currentText.Contains("ADVANCES"))
            {
                return i;
            }
        }

        return 0;

上面的代码抛出一个空引用异常,reader不是null,我显然不是null。

我正在从输入流中实例化PDFreader

PdfReader reader = new PdfReader(_stream)

下面是堆栈跟踪:

  at iTextSharp.text.pdf.parser.PdfContentStreamProcessor.DisplayXObject(PdfName xobjectName)
   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)

简单来说,我试图创建一个简单的控制台应用程序,它只读取PDF文件中的所有文本并显示它。下面是代码。结果与上面相同,它给出NullReferenceException。

class Program
    {



 static void Main(string[] args)
    {
        Console.WriteLine(ExtractTextFromPdf(@"stockQuotes_03232015.pdf"));
    }

    public static string ExtractTextFromPdf(string path)
    {
        using (PdfReader reader = new PdfReader(path))
        {
            StringBuilder text = new StringBuilder();

            for (int i = 1; i <= reader.NumberOfPages; i++)
            {
                text.Append(PdfTextExtractor.GetTextFromPage(reader, i));
            }

            return text.ToString();
        }
    }
}

有谁知道这里会发生什么,或者我如何解决它?

2 个答案:

答案 0 :(得分:1)

总结在问题评论中发现的内容......

简而言之

最初使用的OP无效的PDF:它错过了解析器感兴趣的所需对象。

由于他最终抓住了有效版本,他现在能够成功解析。

详细

根据请求的时间和方式,the web site the PDFs in question were requested from会返回同一文档的不同版本,有时会完整,有时会以无效的方式完成。

测试文件是stockQuotes_03232015.pdf,即包含测试日生成的数据的PDF:

完整文件已经可以通过大小识别,在我的下载中它是250933字节长,而我的不完整文件是81062字节长。

检查文件看起来不完整的文件是通过某个工具从完整的文件中导出的,该工具删除了重复的图像流,但忘记通过引用保留的流对象来更改对删除的流的引用。

答案 1 :(得分:-1)

请在下面的代码中阅读PDF格式的文字。它在RichTextBox中显示来自PDF的文本,即richTextBox1。

参考Youtube:https://www.youtube.com/watch?v=22C9N4WP4-s

        using (OpenFileDialog ofd = new OpenFileDialog() { Filter = "PDF files|*.pdf", ValidateNames = true, Multiselect = false })
        {
            if(ofd.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(ofd.FileName);
                    StringBuilder sb = new StringBuilder();
                    for(int i = 1; i<reader.NumberOfPages; i++)
                    {
                        sb.Append(iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(reader,i));
                    }
                    richTextBox1.Text = sb.ToString();
                    reader.Close();

                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }