1

複数の PDF ファイルをマージできる簡単な方法を作成しました。以下は私のコードです:

private void Merge(List<string> src, string dest)
{
    Stopwatch sw = new Stopwatch();
    sw.Start();
    PdfDocument pdfDocument1 = new PdfDocument(new PdfReader(src[0]), new PdfWriter(dest));

    for (int i = 1,max=src.Count; i < max; i++)
    {
        PdfDocument pdfDocument2 = new PdfDocument(new PdfReader(src[i]));
        var pagesCount = pdfDocument2.GetNumberOfPages();
        pdfDocument2.CopyPagesTo(1, pagesCount, pdfDocument1);
        pdfDocument2.Close();
    }
    pdfDocument1.Close();
    sw.Stop();
    Debug.WriteLine(sw.Elapsed);
}

コードは iText ブックの例に基づいています: http://developers.itextpdf.com/examples/merging-pdf-documents/clone-merging-documents-bookmarks

テスト目的で、そのメソッドをボタンにアタッチし、次のように呼び出しています。

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        string dest = @"E:\final.pdf";
        var files = Directory.GetFiles(@"E:\PDFS", "*.pdf").Take(100).ToList();
        Merge(files,dest);
    }
    catch (Exception exception)
    {
        Console.WriteLine(exception);
    }
}

時々(そのボタンをn回クリックした後)、次のような例外が発生します。

「iText.Kernel.Pdf.PdfNumber」から「iText.Kernel.Pdf.PdfStream」にキャストできません。

また、最初にアプリケーションをクリックすると約 100MB のメモリが必要になり、次にクリックすると 150MB に増加し、次にクリックすると 230MB のメモリが使用されるため、メモリが解放されていないように見えます。

iTextSharp 7 を使用して複数の PDF を 1 つにマージするより良い方法はありますか?

リクエストに応じて、StackTrace を追加しています。

w iText.Kernel.Pdf.PdfPage.GetContentStream(Int32 index)
w iText.Kernel.Pdf.PdfPage.Flush(Boolean flushXObjects)
w iText.Kernel.Pdf.PdfPage.Flush()
w iText.Kernel.Pdf.PdfDocument.Close()
w iTextSharp7_Merge.Form1.Merge(List`1 src, String dest)
w c:\Users\Misiu\Documents\Visual Studio 2013\Projects\iTextSharp7_Merge\Form1.cs:wiersz 75

例外の詳細は次のとおりです。 ここに画像の説明を入力

編集:

ボタンのクリック機能を変更したので、ディレクトリから 100 個のファイル名をロードMergeし、同じリストでメソッドを 10 回呼び出します。

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        string dest = @"E:\final.pdf";
        var files = Directory.GetFiles(@"E:\PDFS", "*.pdf").OrderBy(x => x).Skip(0).Take(100).ToList();

        Stopwatch sw = new Stopwatch();
        sw.Start();

        for (int i = 1; i <= 10; i++)
        {
            Debug.WriteLine(i);
            Merge(files, dest1);
        }
        sw.Stop();
        Debug.WriteLine(sw.Elapsed);

    }
    catch (Exception exception)
    {
        Console.WriteLine(exception);
    }
}

このようにして、ランダムな並べ替えを除外しましたDirectory.GetFiles

Visual Studio からの出力例を次に示します。

'iTextSharp7_Merge.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll'
1
'iTextSharp7_Merge.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\Users\Misiu\documents\visual studio 2013\Projects\iTextSharp7_Merge\bin\Debug\itext.kernel.dll'
'iTextSharp7_Merge.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\Users\Misiu\documents\visual studio 2013\Projects\iTextSharp7_Merge\bin\Debug\itext.io.dll'
A first chance exception of type 'System.NullReferenceException' occurred in itext.kernel.dll
2
3
The thread '<No Name>' (0x2dd0) has exited with code 0 (0x0).
4
5
A first chance exception of type 'System.InvalidCastException' occurred in itext.kernel.dll
4

0 に答える 0