Объединение нескольких 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. Например здесь:
... и здесь:
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, чтобы попробовать)
Я не уверен в моем ответе. Пожалуйста, прочтите себя.
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, и она была такой же, как и последняя сборка. Может быть, они что-то исправили, не увеличивая версия ?
в любом случае, спасибо за вашу помощь. Я принял ваш пост в качестве ответа, чтобы показать свою признательность.