PDF文件是否包含iref流?

Jac*_*cek 7 c# pdf pdfsharp

我仍然与PDF文件中的读取数据作斗争.
我使用PDFsharp,如何在不使用方法Open的情况下检查文件是否包含iref流.如果文件包含iref流,则方法Open抛出异常.

Tob*_*bon 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 将您的所有来电更改PdfReader.OpenCompatiblePdfReader.Open.

它对我来说就像一个魅力,希望这对你有所帮助.

  • @StuartMoore链接版本在MPL/LGPLv2下 (3认同)
  • 希望我可以多次投票!当你知道如何简单!! (2认同)
  • 答案看起来不错 - 但值得注意的是,iTextSharp 使用 AGPL,因此对于大多数商业运营来说,需要支付许可费。 (2认同)

Je *_*not 10

PDFsharp 1.32及更早版本不支持iref流.

自2015年12月起,我们拥有支持iref流的PDFsharp 1.50.

  • 在撰写本文时,您需要从NuGet中选择预发布版本... (2认同)