使用PdfStamper的文件大小很大

时间:2017-04-13 13:53:49

标签: c# itext

我使用iTextSharp从文档中提取一页。 原始文件的大小为1.1 MiB,共有74页。 当我只提取一页时,生成的PDF的大小为1.2 MiB。

我使用此代码:

using (MemoryStream ms = new MemoryStream())
{
    using (PdfReader readerTemp = new PdfReader(btFile))
    {                                        
        readerTemp.SelectPages(new int[] {1});
        using (PdfStamper stamper = new PdfStamper(readerTemp, ms))
                                    { }
    }
    bt = ms.ToArray();
}

我也尝试Jay R answer's同样的结果。

为什么文件大小如此之大?

- 编辑 - 我也尝试了同样的结果:

using (MemoryStream ms = new MemoryStream())
{
    using (PdfReader readerTemp = new PdfReader(btFile))
    {
        reader.SetPageContent(1, reader.GetPageContent(1), PdfStream.BEST_COMPRESSION, true);
        readerTemp.SelectPages(new int[] {1});
        using (PdfStamper stamper = new PdfStamper(readerTemp, ms, PdfWriter.VERSION_1_5))
        {
            stamper.SetFullCompression();
        }
}

2 个答案:

答案 0 :(得分:1)

使用

        stamper.SetFullCompression();

减少文件大小。

答案 1 :(得分:1)

想象一下包含10个页面的3000 KB文档和以下对象:

  • 每页使用四个字体子集,每个字体子集大约50 KB
  • 在单个页面上显示的十个图像,每个图像大约200 KB(每页一个图像)
  • 每页上显示的四张图片,每张图片大约50 KB
  • 十页,内容流各约25 KB
  • 目录,信息词典,页面树,交叉引用表等对象的大约350 KB ...

单页至少需要: - 四个字体子集:4倍50 KB - 单张图片:1次200 KB - 四张图片:4次50 KB - 单个内容流:1次50 KB - 略微减少的交叉引用表,略微缩小的页面树,几乎相同的目录,相同大小的信息字典,... 200 KB

总共850 KB。这意味着如果将10页3000 KB PDF文档拆分为10个单独的页面,最终会得到8500 KB(10倍850 KB)。

在您的情况下,共享资源非常庞大。我假设您有一张使用扫描图像创建的发票,该图像充当每个页面的背景。扫描的背景确定了文件大小的大部分。

如果1页文档不使用压缩对象/压缩外部参照表,则1页文档的文件大小可能高于具有多页文档的文件大小,而具有多页的文档则。您可以通过引入stamper.SetFullCompression();

来压缩对象和外部参照表