以下代码用于将多个pdf文件合并为单个文件
public byte[] MergePdfFiles(IEnumerable<byte[]> files)
{
using (var stream = new MemoryStream())
{
var pdfDoc = new iTextSharp.text.Document();
var pdf = new PdfCopy(pdfDoc, stream);
pdf.SetMergeFields();
pdfDoc.Open();
foreach (var file in files)
{
try
{
pdf.AddDocument(new PdfReader(file));
}
catch (InvalidPdfException ex)
{
_loggingServiceClient.Log(LogLevel.Error, ex);
throw;
}
}
pdfDoc.Close();
return stream.GetBuffer();
}
}
代码工作正常,但生成的文件大小几乎是所有合并文件总大小的两倍。我尝试添加一些压缩指令,例如pdf.CompressionLevel = PdfStream.BEST_COMPRESSION;
和pdf.SetFullCompression();
,但没有成功。
请注意,从生成的文件中在acrobat reader中执行简单的saveAs会生成具有合适大小的新文件(每个合并文件的组合大小)。
我还尝试了其他合并文件的方法,例如使用addPage方法,最终结果相同。
答案 0 :(得分:0)
请试一试:
public byte[] MergePdfFiles(IEnumerable<byte[]> files)
{
using (var stream = new MemoryStream())
{
var pdfDoc = new iTextSharp.text.Document();
var pdf = new PdfSmartCopy(pdfDoc, stream);
pdf.SetMergeFields();
pdfDoc.Open();
foreach (var file in files)
{
try
{
pdf.AddDocument(new PdfReader(file));
}
catch (InvalidPdfException ex)
{
_loggingServiceClient.Log(LogLevel.Error, ex);
throw;
}
}
pdfDoc.Close();
return stream.GetBuffer();
}
}
如果您没有立即看到自己代码的不同之处:我将PdfCopy
更改为PdfSmartCopy
。如果这没有帮助(以及使用完全压缩),那么很少有人可以做到。主要原因可能是iText无法将不同文件的字体子集合并为一种新字体(这是Acrobat用来减小文件大小的技巧之一)。