web-dev-qa-db-ja.com

iTextSharp例外:PDFヘッダー署名が見つかりません

[〜#〜] pdf [〜#〜]ドキュメントの内容を読み取るためにiTextSharpを使用しています:

  PdfReader reader = new PdfReader(pdfPath);

                using (StringWriter output = new StringWriter())
                {
                    for (int i = 1; i <= reader.NumberOfPages; i++)
                        output.WriteLine(PdfTextExtractor.GetTextFromPage(reader, i, new SimpleTextExtractionStrategy()));

                    reader.Close();
                    pdfText = output.ToString();
                }

99%正常に動作する時間。ただし、この例外がある場合があります[〜#〜] pdf [〜#〜]ファイルがあります。

PDFヘッダーの署名が見つかりません。 StackTrace:at iTextSharp.text.pdf.PdfReader.ReadPdf()at iTextSharp.text.pdf.PdfReader..ctor(String filename、Byte [] ownerPassword)at Reader.PDFのiTextSharp.text.pdf.PRTokeniser.CheckPdfHeader() .DownloadPdf(String url)in C:\ Documents\Visual Studio

厄介なのは、エラーを常に再現できるとは限らないことです。うまくいくこともあれば、うまくいかないこともあります。誰かがこの問題に遭遇しましたか?

15
broke

調査の結果、この問題はPDF生成中にファイルが破損しているか、PDF規格に準拠していないドキュメント内のオブジェクトに関連するエラーであることがわかりました。 iTextSharpに実装されています。また、ディスクからPDFファイルから読み取る場合にのみ発生するようです。

この問題の完全な解決策は見つかりませんでしたが、回避策しかありません。私がやったことは、PdfReader itextsharpオブジェクトを使用してPDFドキュメントを読み取り、通常の操作でファイルを読み取る前にエラーまたは例外が発生するかどうかを確認することです。

したがって、次のようなものを実行します。

private bool IsValidPdf(string filepath)
{
    bool Ret = true;

    PdfReader reader = null;

    try
    {
        reader = new PdfReader(filepath);
    }
    catch
    {
        Ret = false;
    }

    return Ret;
}
17

ファイルの終わりにPDFストリーム位置を指定してnew PdfReader(pdf)を呼び出していたためです。位置をゼロに設定することにより、問題が解決しました。

前:

// Throws: InvalidPdfException: PDF header signature not found.
var pdfReader = new PdfReader(pdf);

後:

// Works correctly.
pdf.Position = Number.Zero;
var pdfReader = new PdfReader(pdf);
1
Bern