web-dev-qa-db-ja.com

PDFSharpを使用して複数のPDFを組み合わせる

複数のPDFを1つのPDFに結合しようとしています。 PDFは、私が処理したいくつかのLocalReportsのSSRSから取得されます。 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をマージするための他の提案を受け入れていますが、PDFSharpはプロジェクトですでに使用されています。

重要な場合は、Win7マシンでVS2010Proを使用しています。

編集:例外からスタックを呼び出す:

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を1つのPDFに結合する他の方法はありますか?

17

PDFSharpで破損しているか、読み取れないのは入力PDFである可能性があると私は信じるようになりました。 SSRS PDFがPDFライブラリやAdobeのリーダーでさえ読めない例がいくつかあります。例:ここ:

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レポートはありませんが)

8
asgerhallas

答えがわかりません。自分を読んでください。

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のバージョンを確認したところ、最新のビルドと同じでした。たぶん彼らはバージョンをインクリメントせずに何かを修正しましたか?

とにかく、あなたの援助に感謝します。感謝の気持ちを表す答えとしてあなたの投稿を受け入れました。