所以我正在使用10000页2页pdf文件并将它们合并到iTextSharp中。
这是我正在做的一些松散的代码:
Document document = new Document();
using(PdfWriter writer = PdfWriter.GetInstance(document, new FileStream("merged.pdf", FileMode.Create)))
{
PdfContentByte cb = writer.DirectContent;
PdfReader reader = null;
foreach(string thisFile in files)
{
reader = new PdfReader(thisFile);
var page1 = writer.GetImportedPage(reader, 1);
var page2 = writer.GetImportedPage(reader, 2);
cb.AddTemplate(page1, 1f, 0, 0, 1f, 0, 0);
cb.AddTemplate(page2, 1f, 0, 0, 1f, 0, 0);
}
}
我试图了解两个地方的瓶颈所在。我运行了一些性能测试,最慢的进程自然地在每个文件中读取PdfReader以及保存文件的dispose,它是从使用PdfWriter块调用的。
对于此过程,我在所有16个核心上的利用率约为25%。我尝试使用固态驱动器而不是我的SATA 7.2k rpm驱动器,它的速度几乎完全相同。
如何加快这个过程?没有分发任务,因为计算机之间的读取速度会更慢。即使这意味着改变到另一种语言,库或写下这个较低级别,我需要比现在更快地完成这个过程。现在合并大约需要10分钟。
答案 0 :(得分:2)
所以我终于解决了这个问题。以下是我的表现结果,其中包含以下获胜方法的代码: 我在所有这三个测试中使用了相同的机器
没有试过弄清楚为什么相同的代码在Ubuntu上运行得更快但是我会接受它。一般来说,我定义了此函数之外的所有主要变量,因为在此过程中它被调用了36000次。
public void addPage(String inputPdf, String barcodeText, String pageTitle)
{
try
{
//read in the pdf
reader = new PdfReader(inputPdf);
//all pdfs must have 2 pages (front and back).
//set to throw an out of bounds error if not. caught up stream
for (int i = 1; i <= Math.Min(reader.NumberOfPages,2); i++)
{
//import the page from source pdf
copiedPage = copyPdf.GetImportedPage(reader, i);
// add the page to the new document
copyPdf.AddPage(copiedPage);
}
//cleanup this page, keeps a big memory leak away
copyPdf.FreeReader(reader);
copyPdf.Flush();
}
finally
{
reader.Close();
}
}
答案 1 :(得分:0)
尝试PdfSmartCopy。不确定它是否更快。
Document document = new Document();
using(PdfWriter writer = new PdfSmartCopy(document, new FileStream("merged.pdf", FileMode.Create)))
{
document.Open();
PdfReader reader = null;
foreach(string thisFile in files)
{
reader = new PdfReader(thisFile);
((PdfSmartCopy)writer).AddPage(writer.GetImportedPage(reader , 1));
((PdfSmartCopy)writer).AddPage(writer.GetImportedPage(reader , 2));
}
if(reader != null)
{
reader.Close();
}
}
document.Close();