我创建了一个简单的方法,允许我合并多个 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 合并为一个?
根据要求,我正在添加 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