所以我正在使用10000页2页pdf文件并将它们合并到iTextSharp中. 这是我正在做的一些松散的代码: Document document = new Document();using(PdfWriter writer = PdfWriter.GetInstance(document, new FileStream("merged.p
这是我正在做的一些松散的代码:
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分钟.
所以我终于解决了这个问题以下是我的表现结果,其中包含以下获胜方法的代码:我在所有这三个测试中使用了相同的机器
> iTextSharp – 直接在pdfwriter上的内容构建器
> Windows 2008 64位
> NTFS分区
>在处理过程中每秒合并约30页
关闭pdfwriter时,最终会有很大的开销
全部> 25页/秒
> iTextSharp – PDFCopy
> Windows 2008 64位
> NTFS分区
>将输出写入磁盘而不是内存,因此最后没有开销
>每秒40页
> iText(java) – PDFCopy(完全相同的代码,只是移植到java)
> Ubuntu 12.04 64位服务器版
> EXT3分区(即将试用ext4)
>还在处理期间将输出写入磁盘
>每秒250页
没有试过弄清楚为什么相同的代码在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(); } }