Объединение нескольких PDF-файлов с помощью PDFSharp

Я пытаюсь объединить несколько PDF-файлов в один PDF-файл. PDF-файлы приходят в SSRS, от некоторых LocalReports, что я обработал. Я использую PDFSharp, потому что он уже используется через проект. Однако outputDocument.методы addPage (page) вызывают исключение InvalidOperationException ("невозможно изменить документ.") исключение. Я пробовал много разных способов сделать это, но я не могу заставить его работать...

здесь мой метод, где все входные данные уже были проверено:

private static void saveFile(string fileName, params byte[][] bytes)
{
    try
    {
        PdfDocument outputDocument = new PdfDocument();
        for (int i = 0; i < bytes.Length; i++)
        {
            using (MemoryStream stream = new MemoryStream(bytes[i]))
            {
                PdfDocument inputDocument = PdfReader.Open(stream, PdfDocumentOpenMode.Import);
                foreach (PdfPage page in inputDocument.Pages)
                {
                    outputDocument.AddPage(page); //throws the exception !!!
                }
            }
        }
        outputDocument.Save(fileName);  
    }
    catch (Exception ex)
    {
        throw new Exception("Erreur lors de l'enregistrement du fichier", ex);
    }
}

из примеров, которые я видел в интернете, это, кажется, правильный способ делать это... Я открыт для других предложений по слиянию моих PDF-файлов, но я бы предпочел не использовать другой сторонний lib, например ITextSharp, потому что PDFSharp уже используется в проекте.

Если это имеет значение, я использую VS2010 Pro на машине Win7.

EDIT: стек вызовов из исключения:
на PdfSharp.Документ pdf.PdfObject.set_Document (значение PdfDocument)
в PdfSharp.Документ pdf.PdfObject.ImportClosure(importedObjectTable PdfImportedObjectTable, владелец документа PDF PdfObject externalObject)
в PdfSharp.Документ pdf.PdfPages.CloneElement (pdfpage page, pdfpage importPage, String key, Boolean deepcopy)
в PdfSharp.Документ pdf.PdfPages.ImportExternalPage(importPage PdfPage)
в PdfSharp.Документ pdf.PdfPages.Insert (индекс Int32, страница PdfPage)
на PdfSharp.Документ pdf.PdfPages.Добавьте(страница PdfPage)
в PdfSharp.Документ pdf.Документы PDF.AddPage (страница PdfPage)
на нечто.saveFile (строковое имя файла, байт[][] байт)

проблема во мне ? Разве не так это должно быть сделано ? Или есть ли другой способ объединения нескольких LocalReport в один PDF-файл ?

3 ответов


Я пришел к выводу, что это могут быть входные PDF-файлы, которые повреждены или нечитаемы для PDFSharp. Существует несколько примеров того, как PDF-файлы SSRS не читаются в PDF-библиотеках или даже в Adobe Reader. Например здесь:

http://www.sqldev.org/sql-server-reporting-services/export-pdf-in-ssrs-2008-vs-ssrs-2005--pdf-is-different-wont-work-with-itextsharp-possibly-other-13968.shtml

... и здесь:

https://stackoverflow.com/questions/2393175/ssrs-2008-pdf-files-cannot-be-opened

... И самое главное на форуме PDFSharp:

http://forum.pdfsharp.net/viewtopic.php?f=2&t=674

Я не знаю, является ли это ошибкой, с которой вы сталкиваетесь - сообщение странное - но, похоже, это имеет какое-то отношение к этому, когда вы принимаете во внимание, что ваш образец кода работает безупречно с любой PDF, который я пробовал (у меня нет отчетов SQL Server, чтобы попробовать)


Я не уверен в моем ответе. Пожалуйста, прочтите себя.

http://www.go4coding.com/post/2011/05/26/Merging-PDF-files-into-single-PDF-in-CSharp-using-PDFSharp.aspx

private static void MergeMultiplePDFIntoSinglePDF(string outputFilePath, string[] pdfFiles)
        {
            Console.WriteLine("Merging started.....");
            PdfDocument outputPDFDocument = new PdfDocument(); 
            foreach (string pdfFile in pdfFiles)
            {
                PdfDocument inputPDFDocument = PdfReader.Open(pdfFile, PdfDocumentOpenMode.Import);
                outputPDFDocument.Version = inputPDFDocument.Version; 
                foreach (PdfPage page in inputPDFDocument.Pages)
                {
                    outputPDFDocument.AddPage(page);
                }
            }
            outputPDFDocument.Save(outputFilePath); 
            Console.WriteLine("Merging Completed");
        }

прежде всего, спасибо за Ваш отзыв. Проблема не возникает из-за сжатия, потому что у меня есть <humanreadalble>true</humanreadable> в строке информации о моем устройстве, иначе PDFSharp просто ничего не видит в PDF.

Я попытался перекомпилировать PDFSharp из последнего исходного кода, и это сработало... Это больше не исключение. Странно то, что я проверил версию своей dll, и она была такой же, как и последняя сборка. Может быть, они что-то исправили, не увеличивая версия ?

в любом случае, спасибо за вашу помощь. Я принял ваш пост в качестве ответа, чтобы показать свою признательность.