ITextSharp合并了pdf大小增加

时间:2017-01-05 20:05:17

标签: c# pdf-generation itext

以下代码用于将多个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方法,最终结果相同。

1 个答案:

答案 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用来减小文件大小的技巧之一)。