2016-04-22 52 views
10

Uso PDFsharp (v1.32) per unire più file PDF. Apro documenti utilizzando questo codice:'PDFsharp non può gestire questa funzione PDF introdotta con l'errore di Acrobat 6' durante l'apertura del file PDF

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

E durante l'apertura di un documento (con PDF versione 1.5 (Acrobat 6.x)) ricevo un'eccezione:

un'eccezione non gestita di tipo 'PDFsharp. Pdf.IO.PdfReaderException 'si è verificato in PdfSharp.dll Ulteriori informazioni: Impossibile gestire flussi iref. L'attuale implementazione di PDFsharp non può gestire questa funzione PDF introdotta con Acrobat 6.

Cosa posso fare con esso? Ho bisogno di unire tutti i file, non posso semplicemente saltarlo. Ho cercato di trovare una soluzione, ma non ho trovato risposta o feedback molto vecchi da parte di PDFsharp Team che stanno per "risolverlo".

risposta

0

È possibile utilizzare iText5 o iText7 per rimuovere i flussi Iref.

blocco iText5 sotto è tirato da 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; 
    } 

ho dovuto riscrivere per iText7 (ancora utilizzando il vecchio 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; 
} 

Spero che questo aiuta qualcuno là fuori corso attraverso lo stesso dolore ero, e li salva un paio di giorni !!!

+0

L'op usa chiaramente pdfsharp, non iText. In tal caso è considerato di cattivo stile rispondere con una soluzione basata su quella libreria pdf diversa. – mkl