19

我正在尝试将多个 PDF 合并为一个 PDF。PDF 来自 SSRS,来自我处理的一些 LocalReports。我正在使用 PDFSharp,因为它已经在整个项目中使用。但是,这些outputDocument.addPage(page)方法会引发InvalidOperationException("Cannot change document.")异常。我已经尝试了许多不同的方法来做到这一点,但我无法让它工作......

这是我的方法,已经检查了所有输入:

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

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

4

3 回答 3

8

我开始相信它可能是输入的 PDF 文件损坏或对 PDFSharp 不可读。有几个 SSRS PDF 示例无法被 PDF 库甚至 Adob​​e 的阅读器读取。例如这里:

http://www.sqldev.org/sql-server-reporting-services/export-pdf-in-ssrs-2008-vs-ssrs-2005--pdf-is-different-wont-work-with-itextsharp-可能-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 报告可供试用)

于 2011-02-14T21:38:43.950 回答
5

我不确定我的回答。请阅读你的自我。

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");
}
于 2013-07-14T14:35:14.933 回答
1

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

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

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

于 2011-02-15T14:09:04.903 回答