7

私はまだPDFファイルからの読み取りデータと戦っています。
私はPDFsharpを使用しています.Openメソッドを使用せずにファイルにirefストリームが含まれているかどうかを確認するにはどうすればよいですか. ファイルにiref streamが含まれている場合、メソッド Open は例外をスローします。

4

4 に答える 4

20

iref を含む pdf ファイルを開くことを許可する既知の回避策があります。これに関する完全なスレッドをここで見つけることができます。

ソリューションを要約するだけです:

  1. iTextSharp 4.1.6 ライブラリをダウンロードして含める
  2. コード ファイル内の次のコードをプロジェクトに貼り付けます。

-

using System;
using System.IO;

namespace PdfSharp.Pdf.IO
{
    static public class CompatiblePdfReader
    {
        /// <summary>
        /// uses itextsharp 4.1.6 to convert any pdf to 1.4 compatible pdf, called instead of PdfReader.open
        /// </summary>
        static public PdfDocument Open(string pdfPath)
        {
            using (var fileStream = new FileStream(pdfPath, FileMode.Open, FileAccess.Read))
            {
                var len = (int)fileStream.Length;
                var fileArray = new Byte[len];
                fileStream.Read(fileArray, 0, len);
                fileStream.Close();

                return Open(fileArray);
            }
        }

        /// <summary>
        /// uses itextsharp 4.1.6 to convert any pdf to 1.4 compatible pdf, called instead of PdfReader.open
        /// </summary>
        static public PdfDocument Open(byte[] fileArray)
        {
            return Open(new MemoryStream(fileArray));
        }

        /// <summary>
        /// uses itextsharp 4.1.6 to convert any pdf to 1.4 compatible pdf, called instead of PdfReader.open
        /// </summary>
        static public PdfDocument Open(MemoryStream sourceStream)
        {
            PdfDocument outDoc;
            sourceStream.Position = 0;

            try
            {
                outDoc = PdfReader.Open(sourceStream, PdfDocumentOpenMode.Import);
            }
            catch (PdfReaderException)
            {
                //workaround if pdfsharp doesn't support this pdf
                sourceStream.Position = 0;
                var outputStream = new MemoryStream();
                var reader = new iTextSharp.text.pdf.PdfReader(sourceStream);
                var pdfStamper = new iTextSharp.text.pdf.PdfStamper(reader, outputStream) {FormFlattening = true};
                pdfStamper.Writer.SetPdfVersion(iTextSharp.text.pdf.PdfWriter.PDF_VERSION_1_4);
                pdfStamper.Writer.CloseStream = false;
                pdfStamper.Close();

                outDoc = PdfReader.Open(outputStream, PdfDocumentOpenMode.Import);
            }

            return outDoc;
        }
    }
}
  1. PdfReader.Openへのすべての通話をに変更しますCompatiblePdfReader.Open

それは私にとって魅力のように機能します。これがお役に立てば幸いです。

于 2013-09-27T13:26:12.470 に答える
10

PDFsharp 1.32 以前は iref ストリームをサポートしていませんでした。

2015 年 12 月以降、iref ストリームをサポートする PDFsharp 1.50 がリリースされました。

于 2016-04-22T13:38:30.577 に答える
-1

回避策は、をキャッチしPdfSharp.Pdf.IO.PdfReaderException、そのような例外の原因となっているファイルを無視することです。

PdfDocument inputPDFDocument = new PdfDocument();
try
{
    inputPDFDocument = PdfReader.Open(pdfFile, PdfDocumentOpenMode.Import);
}
catch (PdfSharp.Pdf.IO.PdfReaderException)
{
    //
}
于 2013-08-25T08:34:10.097 に答える