web-dev-qa-db-fra.com

'PDFsharp ne peut pas gérer cette erreur PDF introduite avec Acrobat 6' lors de l'ouverture PDF

J'utilise PDFsharp (v1.32) pour fusionner plusieurs fichiers PDF. J'ouvre des documents en utilisant ce code:

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

Et lors de l'ouverture d'un document (avec PDF version 1.5 (Acrobat 6.x)) je reçois une exception:

Une exception non gérée de type "PdfSharp.Pdf.IO.PdfReaderException" s'est produite dans PdfSharp.dll Informations supplémentaires: Impossible de gérer les flux iref. L'implémentation actuelle de PDFsharp ne peut pas gérer cette fonction PDF introduite avec Acrobat 6.

Que puis-je en faire? J'ai besoin de fusionner tous les fichiers, je ne peux pas simplement le sauter. J'ai essayé de trouver une solution, mais je n'ai pas trouvé de réponse ou tout simplement de très vieux commentaires de la part de l'équipe PDFsharp qui vont "résoudre le problème".

17
user2216
28
Vive la déraison

Vous pouvez utiliser iText5 ou iText7 pour supprimer les flux iref.

le bloc iText5 ci-dessous est extrait de http://forum.pdfsharp.net/viewtopic.php?f=2&t=69

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;
  }

J'ai dû le réécrire pour iText7 (toujours en utilisant l'ancien 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;
}

J'espère que cela aide quelqu'un là-bas à traverser la même douleur que moi et lui fait gagner quelques jours !!!

3
knitTheCode