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