SQL Server,C#和iTextSharp。什么是加入pdfs的最佳方式

时间:2016-08-11 22:11:10

标签: c# sql-server pdf itext

我有一个sql server db。在那里有很多很多行。每行都有一个包含存储的pdf的列 db是一个大小的演出。因此,我们可以预期大约一半的大小是由pdfs引起的 现在我要求将所有这些pdf加入到1 pdf中。不要问为什么。 您能否提出最好的前进方向,哪种组件最适合这项工作。有很多答案可供选择:

How can I join two PDF's using iTextSharp?
Merge memorystreams to one itext document
How to merge multiple pdf files (generated in run time)?

关于如何加入两个(或更多pdf)。但我要求的是性能方面。我们确实需要将大约5万个pdf合并为1个全能的pdf

[编辑解决方案]花费时间合并1000个pdf,从4分30秒到21分

public void MergePDFs(string targetPDF, string sourceDir)
        {
            using (FileStream stream = new FileStream(targetPDF, FileMode.Create))
            {
                var files = Directory.GetFiles(sourceDir);

                Document pdfDoc = new Document(PageSize.A4);
                PdfCopy pdf = new PdfCopy(pdfDoc, stream);
                pdfDoc.Open();

                Console.WriteLine("Merging files count: " + files.Length);
                int i = 1;
                var watch = System.Diagnostics.Stopwatch.StartNew();
                foreach (string file in files)
                {
                    Console.WriteLine(i + ". Adding: " + file);
                    pdf.AddDocument(new PdfReader(file));
                    i++;
                }

                if (pdfDoc != null)
                    pdfDoc.Close();

                watch.Stop();
                var elapsedMs = watch.ElapsedMilliseconds;
                MessageBox.Show(elapsedMs.ToString());
            }
        }

1 个答案:

答案 0 :(得分:0)

我刚刚使用PDFSharp做了一个C#/ Winforms项目,并将图像合并到PDF中,它与传统的文件夹结构非常相似。我想它可以与数据存储的PDF类似地工作,只要你可以先将它们拉入内存流然后合并它们。

一些建议: 1)建议在多线程环境中执行此操作,以便您可以一次处理多个PDF。 2)只打开您需要的东西,并在操作完成后立即关闭。所以说你有三个文件需要合并成一个。创建一个空白PDF。先打开一个内存流,打开空白。首先附加为空白。先关闭,保存空白,关闭空白。重复第二和第三。这样,您可以控制在任何一个时间点占用的内存量。通过这种方式,我能够追加数百万张图像,但控制内存使用量。 3)确保在使用对象时使用Using语句。这将有助于内存清理并消除调用被忽视的垃圾收集器的需要。 4)尽可能将您的业务(工作)与用户界面分开,以便您可以随时取消操作,或查看当前状态。 5)记录所做的所有事情,以便您可以返回并更正一次性完成第一次通过的PDF。