我尝试使用iText7 for .NET将文档合并为单个文件,在收到错误后我创建了第二个应用程序,但使用的是iTextSharp 5.5.9。
令我惊讶的是,相同的功能比新版本快4倍。
以下是我的第5版代码:
private bool Merge5(IEnumerable<string> fileNames, string targetPdf)
{
bool merged = true;
using (FileStream stream = new FileStream(targetPdf, FileMode.Create))
{
Document document = new Document();
PdfCopy pdf = new PdfCopy(document, stream);
PdfReader reader = null;
try
{
document.Open();
foreach (string file in fileNames)
{
reader = new PdfReader(file);
//not needed I guess
reader.ConsolidateNamedDestinations();
pdf.AddDocument(reader);
reader.Close();
}
}
catch (Exception)
{
merged = false;
if (reader != null)
{
reader.Close();
}
}
finally
{
if (pdf != null)
{
pdf.Close();
}
if (document != null)
{
document.Close();
}
}
}
return merged;
}
和版本7的代码:
private void Merge7(List<string> src, string dest)
{
PdfDocument pdfDocument1;
try
{
pdfDocument1 = new PdfDocument(new PdfReader(src[0]), new PdfWriter(dest));
}
catch (Exception e)
{
Debug.WriteLine(e);
throw;
}
var path = string.Empty;
for (int i = 1, max = src.Count; i < max; i++)
{
path = src[i];
try
{
PdfDocument pdfDocument2 = new PdfDocument(new PdfReader(path));
var pagesCount = pdfDocument2.GetNumberOfPages();
pdfDocument2.CopyPagesTo(1, pagesCount, pdfDocument1);
pdfDocument2.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
try
{
pdfDocument1.Close();
}
catch (Exception e)
{
Debug.WriteLine("Dest: " + dest);
Debug.WriteLine("Src: " + path);
Console.WriteLine(e);
}
}
我的电话如下:
string dest = @"E:\TEST\final.pdf";
var files = Directory.GetFiles(@"E:\TEST\PDFS", "*.pdf").OrderBy(x => x).Take(1000).ToList();
Stopwatch sw = new Stopwatch();
sw.Start();
Merge5(files, dest);
sw.Stop();
Debug.WriteLine(sw.Elapsed);
第一次测试:
对于1000个PDF文件(相同文件,但复制1000次,大小370 KB),我得到了这样的结果:
| 1 pass | 2 pass | 3 pass |
---------------------------------------------------------------------------
iText7 for .NET | 00:00:13.4088770 | 00:00:13.5490370 | 00:00:14.2491171
iTextSharp 5.5.9 | 00:00:03.5330538 | 00:00:03.2058272 | 00:00:03.2854776
第二次测试:
对于1000个PDF文件(相同的文件,但复制了1000次,大小为606 KB),我得到了这样的结果:
| 1 pass | 2 pass | 3 pass |
---------------------------------------------------------------------------
iText7 for .NET | 00:00:25.5538607 | 00:00:24.6525861 | 00:00:26.7326629
iTextSharp 5.5.9 | 00:00:06.0918370 | 00:00:05.5687955 | 00:00:06.0283861
我的性能差异可能是什么原因? 我可以优化合并功能,使其更快(与版本5一样快)? 我想使用版本7,但由于性能原因,我可能会使用旧版本。