SQL 服务器、C# 和 iTextSharp。什么是加入 pdf 的最佳方式
SQL Server, C# and iTextSharp. Whats best way to join pdfs
我有一个 sql 服务器数据库。里面有很多很多行。每行有一列,其中包含一个存储的 pdf。
数据库的规模很大。所以我们可以预期大约一半的大小是由于 pdf 造成的。
现在我需要将所有这些 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。但我要求的是性能方面的。我们实际上处理了大约 50 000 个需要合并成 1 个全能 pdf
的 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());
}
}
我刚刚使用 PDFSharp 完成了一个 C#/Winforms 项目,并将图像合并为 PDF,它在传统文件夹结构中表现出色。我想它与数据存储的 PDF 的工作方式类似,只要您可以先将它们拉入内存流然后合并它们。
一些建议:
1) 建议在多线程环境中执行此操作,以便您可以一次处理多个 PDF。
2) 只打开你需要的,并在操作完成后立即关闭。假设您有三个文档需要合并为一个。创建空白 PDF。先打开一个内存流,打开空白。首先追加到空白处。先关闭,保存空白,关闭空白。重复第二个和第三个。通过这种方式,您可以控制在任何一个时间点占用的内存量。通过这种方式,我能够附加数百万张图像,但可以控制内存使用。
3) 确保在使用对象时使用 Using 语句。这将有助于内存清理并消除调用被看不起的垃圾收集器的需要。
4) 尽可能将您的业务(工作)与 UI 分开,以便您可以随时取消操作,或查看当前状态。
5) 记录所有已完成的操作,以便您可以返回并一次性更正未通过第一遍的 PDF。
我有一个 sql 服务器数据库。里面有很多很多行。每行有一列,其中包含一个存储的 pdf。
数据库的规模很大。所以我们可以预期大约一半的大小是由于 pdf 造成的。
现在我需要将所有这些 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。但我要求的是性能方面的。我们实际上处理了大约 50 000 个需要合并成 1 个全能 pdf
的 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());
}
}
我刚刚使用 PDFSharp 完成了一个 C#/Winforms 项目,并将图像合并为 PDF,它在传统文件夹结构中表现出色。我想它与数据存储的 PDF 的工作方式类似,只要您可以先将它们拉入内存流然后合并它们。
一些建议: 1) 建议在多线程环境中执行此操作,以便您可以一次处理多个 PDF。 2) 只打开你需要的,并在操作完成后立即关闭。假设您有三个文档需要合并为一个。创建空白 PDF。先打开一个内存流,打开空白。首先追加到空白处。先关闭,保存空白,关闭空白。重复第二个和第三个。通过这种方式,您可以控制在任何一个时间点占用的内存量。通过这种方式,我能够附加数百万张图像,但可以控制内存使用。 3) 确保在使用对象时使用 Using 语句。这将有助于内存清理并消除调用被看不起的垃圾收集器的需要。 4) 尽可能将您的业务(工作)与 UI 分开,以便您可以随时取消操作,或查看当前状态。 5) 记录所有已完成的操作,以便您可以返回并一次性更正未通过第一遍的 PDF。