我有一个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());
}
}
答案 0 :(得分:0)
我刚刚使用PDFSharp做了一个C#/ Winforms项目,并将图像合并到PDF中,它与传统的文件夹结构非常相似。我想它可以与数据存储的PDF类似地工作,只要你可以先将它们拉入内存流然后合并它们。
一些建议: 1)建议在多线程环境中执行此操作,以便您可以一次处理多个PDF。 2)只打开您需要的东西,并在操作完成后立即关闭。所以说你有三个文件需要合并成一个。创建一个空白PDF。先打开一个内存流,打开空白。首先附加为空白。先关闭,保存空白,关闭空白。重复第二和第三。这样,您可以控制在任何一个时间点占用的内存量。通过这种方式,我能够追加数百万张图像,但控制内存使用量。 3)确保在使用对象时使用Using语句。这将有助于内存清理并消除调用被忽视的垃圾收集器的需要。 4)尽可能将您的业务(工作)与用户界面分开,以便您可以随时取消操作,或查看当前状态。 5)记录所做的所有事情,以便您可以返回并更正一次性完成第一次通过的PDF。