【问题标题】:'PDFsharp cannot handle this PDF feature introduced with Acrobat 6' error while opening PDF file打开 PDF 文件时出现“PDFsharp 无法处理 Acrobat 6 引入的此 PDF 功能”错误
【发布时间】:2016-08-15 18:50:12
【问题描述】:

我使用 PDFsharp (v1.32) 来合并多个 PDF 文件。我使用此代码打开文档:

PdfDocument inputDocument = PdfReader.Open(pdfFilePath, PdfDocumentOpenMode.Import);

在打开一个文档(使用 PDF 版本 1.5 (Acrobat 6.x))时,我收到一个异常:

在 PdfSharp.dll 中出现“PdfSharp.Pdf.IO.PdfReaderException”类型的未处理异常 附加信息:无法处理 iref 流。 PDFsharp 的当前实现无法处理 Acrobat 6 引入的此 PDF 功能。

我能用它做什么?我需要合并所有文件,我不能跳过它。我试图找到解决方案,但发现 PDFsharp 团队没有回答或只是非常旧的反馈,他们将“修复它”。

【问题讨论】:

    标签: c# .net pdf pdfsharp


    【解决方案1】:

    【讨论】:

    • @SiyavashHamdi 方法FromGdiPlusImage 仅适用于 GDI+ 构建,不适用于 Core 构建或 WPF 构建。使用 GDI 项目或 GDI NuGet 包。
    【解决方案2】:

    您可以使用 iText5 或 iText7 来删除 iref 流。

    下面的iText5块是从http://forum.pdfsharp.net/viewtopic.php?f=2&t=693拉出来的

    static public PdfDocument Open(MemoryStream sourceStream)
      {
         PdfDocument outDoc = null;
         sourceStream.Position = 0;
    
         try
         {
            outDoc = PdfReader.Open(sourceStream, PdfDocumentOpenMode.Import);
         }
         catch (PdfSharp.Pdf.IO.PdfReaderException)
         {
            //workaround if pdfsharp doesn't support this pdf
            sourceStream.Position = 0;
            MemoryStream outputStream = new MemoryStream();
            iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(sourceStream);
            iTextSharp.text.pdf.PdfStamper pdfStamper = new iTextSharp.text.pdf.PdfStamper(reader, outputStream);
            pdfStamper.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;
      }
    

    我不得不为 iText7 重新编写它(仍然使用旧的 PDFSharp):

    static PdfDocument CompatibleOpen(MemoryStream inputStream, PdfDocumentOpenMode openMode)
    {
     PdfDocument pdfDocument = null;
     inputStream.Position = 0;
    
     try
     {
        pdfDocument = PdfReader.Open(inputStream, openMode);
     }
     catch (PdfSharp.Pdf.IO.PdfReaderException)
     {
        inputStream.Position = 0;
        MemoryStream outputStream = new MemoryStream();
    
        iText.Kernel.Pdf.WriterProperties writerProperties = new iText.Kernel.Pdf.WriterProperties();
        writerProperties.SetPdfVersion(iText.Kernel.Pdf.PdfVersion.PDF_1_4);
    
        iText.Kernel.Pdf.PdfReader pdfReader = new iText.Kernel.Pdf.PdfReader(inputStream);
    
        iText.Kernel.Pdf.PdfDocument pdfStamper = new iText.Kernel.Pdf.PdfDocument(pdfReader, new iText.Kernel.Pdf.PdfWriter(outputStream, writerProperties)); 
    
        iText.Forms.PdfAcroForm pdfForm = iText.Forms.PdfAcroForm.GetAcroForm(pdfStamper, true);
        if (!pdfForm.IsNull())
        {
           pdfForm.FlattenFields();
        }
        writerProperties.SetFullCompressionMode(false);
    
        pdfStamper.GetWriter().SetCloseStream(false);           
        pdfStamper.Close();
    
        pdfDocument = PdfReader.Open(outputStream, openMode);
     }
     return pdfDocument;
    }
    

    我希望这可以帮助那些经历与我一样痛苦的人,并为他们节省几天的时间!!!

    【讨论】:

    • 该操作显然使用 pdfsharp,而不是 iText。在这种情况下,使用基于不同 pdf 库的解决方案来回答被认为是不好的风格。
    • 来自 knitTheCode 的回答是相关的,因为没有办法仅使用 PDFSharp 解决此问题(测试版除外,但不能在生产环境中使用),如 PDFSharp 管理员在提供的链接中所述.我最终也实现了这个解决方案,即使你必须使用另一个库,它也能很好地工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多