打开PDF文件时,"PDFsharp无法处理随Acrobat 6引入的PDF功能"错误

use*_*216 17 .net c# pdf pdfsharp

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

PdfDocument inputDocument = PdfReader.Open(pdfFilePath, PdfDocumentOpenMode.Import);
Run Code Online (Sandbox Code Playgroud)

在打开一个文档(PDF版本1.5(Acrobat 6.x))时,我收到一个例外:

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

我该怎么办?我需要合并所有文件,我不能跳过它.我试图找到解决方案,但发现没有回答,或者只是来自PDFsharp团队的非常老的反馈意见,他们将"修复它".

小智 6

您可以使用 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;
  }
Run Code Online (Sandbox Code Playgroud)

我不得不为 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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 该操作显然使用 pdfsharp,而不是 iText。在这种情况下,使用基于不同 pdf 库的解决方案来回答被认为是不好的风格。 (3认同)
  • knitTheCode 的答案是相关的,因为没有办法仅使用 PDFSharp 来解决此问题(测试版除外,但其不能在生产环境中使用),如 PDFSharp 管理员在提供的链接中所述。我最终也实现了这个解决方案,即使您必须使用另一个库,它也能很好地工作 (2认同)