2016-04-22 8 views
10

Używam PDFsharp (v1.32) do łączenia kilku plików PDF. Otwieram dokumentów za pomocą tego kodu:"PDFsharp nie może obsłużyć tej funkcji PDF wprowadzonej z błędem programu Acrobat 6" podczas otwierania pliku PDF

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

I podczas otwierania jednego dokumentu (z pliku PDF w wersji 1.5 (Acrobat 6.x)) otrzymuję wyjątek:

nieobsługiwany wyjątek typu „PdfSharp. Pdf.IO.PdfReaderException 'wystąpił w PdfSharp.dll Dodatkowe informacje: Nie można obsłużyć strumieni IRF. Obecna implementacja PDFsharp nie może obsłużyć tej funkcji PDF wprowadzonej w programie Acrobat 6.

Co mogę z tym zrobić? Muszę scalić wszystkie pliki, nie mogę tego po prostu pominąć. Próbowałem znaleźć rozwiązanie, ale znalazłem brak odpowiedzi lub po prostu bardzo stare opinie od zespołu PDFsharp, że zamierzają je "naprawić".

Odpowiedz

0

Można użyć iText5 lub iText7 usunąć strumienie Iref.

iText5 blok poniżej są pobierane z 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; 
    } 

musiałem ponownie zapisać go na iText7 (nadal używa starej 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; 
} 

mam nadzieję, że to pomoże ktoś tam dzieje przez ten sam ból byłem i ratowałem ich kilka dni !!!

+0

Operacja wyraźnie wykorzystuje pdfsharp, a nie iText. W takim przypadku za zły styl odpowiada odpowiedź oparta na tej innej bibliotece pdf. – mkl

Powiązane problemy