我正在尝试将多个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?
答案 0 :(得分:7)
我开始相信它可能是PDFSharp损坏或不可读的输入PDF。有几个SSRS PDF的例子不能被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报告)
答案 1 :(得分:3)
我不确定我的答案。请自己阅读。
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的版本,它与最新的版本相同。也许他们修改了一些东西而不增加版本?
无论如何,谢谢你的帮助。我接受了你的帖子作为表达我的感谢的答案。