2016-04-22 12 views
10

Tôi sử dụng PDFsharp (v1.32) để hợp nhất một số tệp PDF. Tôi mở các tài liệu sử dụng mã này:'PDFsharp không thể xử lý tính năng PDF này được giới thiệu với lỗi Acrobat 6' khi mở tệp PDF

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

Và trong khi mở một tài liệu (với phiên bản PDF 1.5 (Acrobat 6.x)) tôi nhận được một ngoại lệ:

Một ngoại lệ unhandled của loại 'PDFSharp. Pdf.IO.PdfReaderException 'xảy ra trong PdfSharp.dll Thông tin bổ sung: Không thể xử lý luồng iref. Việc triển khai PDFsharp hiện tại không thể xử lý tính năng PDF này được giới thiệu với Acrobat 6.

Tôi có thể làm gì với ứng dụng này? Tôi cần hợp nhất tất cả các tệp, tôi không thể bỏ qua nó. Tôi đã cố gắng để tìm giải pháp, nhưng tìm thấy không trả lời hoặc chỉ phản hồi rất cũ từ đội PDFsharp rằng họ sẽ "sửa chữa nó".

Trả lời

0

Bạn có thể sử dụng iText5 hoặc iText7 để loại bỏ các dòng iref.

iText5 khối dưới đây được kéo từ 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; 
    } 

tôi phải viết lại nó cho iText7 (vẫn sử dụng PDFSharp cũ):

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

Tôi hy vọng điều này sẽ giúp ai đó ngoài kia đi thông qua cùng một nỗi đau tôi đã, và tiết kiệm cho họ một vài ngày !!!

+0

Op rõ ràng sử dụng pdfsharp, không phải iText. Trong trường hợp này, nó được coi là kiểu xấu để trả lời bằng một giải pháp dựa trên thư viện pdf khác nhau. – mkl

Các vấn đề liên quan