使用PDFSharp组合多个PDF

时间:2011-02-14 17:35:18

标签: c# ssrs-2008 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的其他建议持开放态度,但我宁愿不使用其他第三方库,如ITextSharp,因为PDFSharp已经在项目中使用。

如果重要,我在Win7机器上使用VS2010 Pro。

编辑:从例外调用堆栈:
   at PdfSharp.Pdf.PdfObject.set_Document(PdfDocument value)
   at PdfSharp.Pdf.PdfObject.ImportClosure(PdfImportedObjectTable importedObjectTable,PdfDocument owner,PdfObject externalObject)
   在PdfSharp.Pdf.PdfPages.CloneElement(PdfPage页面,PdfPage importPage,String键,布尔深度复制)
   在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)

问题是我吗?这不是应该这样做的方式吗? 或者有没有其他方法将多个LocalReport组合成单个PDF?

3 个答案:

答案 0 :(得分:7)

我开始相信它可能是PDFSharp损坏或不可读的输入PDF。有几个SSRS PDF的例子不能被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报告)

答案 1 :(得分:3)

我不确定我的答案。请自己阅读。

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

答案 2 :(得分:1)

首先,感谢您的反馈。问题不是来自压缩,因为我的设备信息字符串中有<humanreadalble>个真</humanreadable>,否则PDFSharp在PDF中看不到任何内容。

我尝试从最新的源代码重新编译PDFSharp,它工作了......它不再抛出异常了。奇怪的是,我检查了我的dll的版本,它与最新的版本相同。也许他们修改了一些东西而不增加版本?

无论如何,谢谢你的帮助。我接受了你的帖子作为表达我的感谢的答案。