Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Combining multiple PDFs using PDFSharp

I am trying to combine multiple PDFs into a single PDF. The PDFs come from SSRS, from some LocalReports that I processed. I am using PDFSharp, because it is already used through out the project. However, the outputDocument.addPage(page) methods throws an InvalidOperationException("Cannot change document.") exception. I have tried many different way of doing this, but I can't get it to work...

Here my method, where all the inputs have already been checked:

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

From the examples I saw on the web, this seems to be the right way of doing this... I am opened to other suggestions for merging my PDFs, but I would rather not use another 3rd party lib, like ITextSharp, because PDFSharp is already used in the project.

If it matters, I am using VS2010 Pro on a Win7 machine.

EDIT : Call stack from the exception :

at PdfSharp.Pdf.PdfObject.set_Document(PdfDocument value)  
at PdfSharp.Pdf.PdfObject.ImportClosure(PdfImportedObjectTable importedObjectTable, PdfDocument owner, PdfObject externalObject)  
at PdfSharp.Pdf.PdfPages.CloneElement(PdfPage page, PdfPage importPage, String key, Boolean deepcopy)  
at PdfSharp.Pdf.PdfPages.ImportExternalPage(PdfPage importPage)  
at PdfSharp.Pdf.PdfPages.Insert(Int32 index, PdfPage page)  
at PdfSharp.Pdf.PdfPages.Add(PdfPage page)  
at PdfSharp.Pdf.PdfDocument.AddPage(PdfPage page)  
at Something.saveFile(String fileName, Byte[][] bytes)  

Is the problem me? Isn't this the way this is supposed to be done? Or is there any other way of combining multiple LocalReport into a single PDF?

like image 867
Pierre-Olivier Goulet Avatar asked Feb 14 '11 17:02

Pierre-Olivier Goulet


People also ask

Is PDFsharp free?

PDFsharp and MigraDoc Foundation are published Open Source and under the MIT License and are free to use.

Is PDFsharp good?

Excellent software that we used for merging pdf documents. Very simple to use and build from source if needed. And it's free for commercial use! I use this quite a lot.


3 Answers

I have come to believe that it might be the input PDFs that are corrupt or unreadable to PDFSharp. There are several examples of SSRS PDFs not being readable to PDF-libraries or even Adobe's Reader. For example here:

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

... and here:

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

... AND most importantly on the PDFSharp forum:

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

I don't know if this is the bug you're encountering - the message is strange - but it seems likely to have something to do with that, when you take in to consideration that your code sample works flawlessly with any PDF I tried (I don't have any SQL Server Reports to try out, though)

like image 69
asgerhallas Avatar answered Oct 04 '22 17:10

asgerhallas


I don't sure about my answer. Please read your self.

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");
}
like image 23
Siwakorn.Apichit Avatar answered Oct 04 '22 17:10

Siwakorn.Apichit


First of all, thank you for your feedback. The problem doesn't come from the compression because I have <humanreadalble>true</humanreadable> in my device info string, otherwise PDFSharp just can't see anything in the PDF.

I tried recompiling PDFSharp from the latest source code, and it worked... It doesn't throw the exception anymore. The weird thing is that I checked the version of my dll and it was the same as the latest build. Maybe they fixed something without incrementing the version ?

Anyway, thanks for your assistance. I accepted your post as the answer to show my appreciation.

like image 21
Pierre-Olivier Goulet Avatar answered Oct 04 '22 17:10

Pierre-Olivier Goulet