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

Я пытаюсь объединить несколько PDF файлов в один PDF файл. PDF файлы поступают из SSRS, из некоторых обработанных мной LocalReports. Я использую PDFSharp, потому что он уже используется через проект. Однако методы outputDocument.addPage(страница) генерируют исключение 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 файлов, но я бы предпочел не использовать другую стороннюю библиотеку, такую ​​как ITextSharp, потому что PDFSharp уже используется в проекте.

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

EDIT: стек вызовов из исключения:
 в PdfSharp.Pdf.PdfObject.set_Document (значение PdfDocument)
 в PdfSharp.Pdf.PdfObject.ImportClosure(PdfImportedObjectTable импортированныйObjectTable, владелец PdfDocument, внешний объект PdfObject)
 в PdfSharp.Pdf.PdfPages.CloneElement(страница PdfPage, PdfPage importPage, строковый ключ, булевская глубокая копия)
 в PdfSharp.Pdf.PdfPages.ImportExternalPage(PdfPage importPage)
 в PdfSharp.Pdf.PdfPages.Insert(индекс Int32, страница PdfPage)
 на странице PdfSharp.Pdf.PdfPages.Add(страница PdfPage)
 на странице PdfSharp.Pdf.PdfDocument.AddPage(страница PdfPage)
 в Something.saveFile(String fileName, Byte [] [] bytes)

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

Ответы

Ответ 1

Я пришел к выводу, что это могут быть входные 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, чтобы попробовать, хотя)

Ответ 2

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

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

Ответ 3

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

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

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