C# 使用PdfStamper的巨大文件大小

C# 使用PdfStamper的巨大文件大小,c#,itext,C#,Itext,我使用iTextSharp从文档中提取一页。 原始文档的大小为1.1 MiB,共有74页。 当我只提取一个页面时,生成的PDF大小为1.2MIB 我使用以下代码: using (MemoryStream ms = new MemoryStream()) { using (PdfReader readerTemp = new PdfReader(btFile)) { readerTemp

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

我使用以下代码:

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();
}
我也试过了,结果也一样

为什么文件大小如此之大

--编辑-- 我也试过了,结果完全一样:

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();
        }
}
使用

减少文件大小。

使用


要减小文件大小。

想象一个3000 KB的文档,其中包含十页和以下对象:

  • 每页使用四个字体子集,每个大约50KB
  • 一页上有十幅图像,每幅约200KB(每页一幅图像)
  • 每个页面上有四个图像,每个约50KB
  • 10个页面,每个页面的内容流约为25KB
  • 目录、信息字典、页面树、交叉引用表等对象的大小约为350 KB
单个页面至少需要: -四个字体子集:4乘以50KB -单个图像:1倍200KB -四幅图像:4乘以50KB -单个内容流:1倍50KB -一个稍微缩小的交叉引用表,一个稍微缩小的页面树,一个几乎相同的目录,一个相同大小的信息字典,。。。200 KB

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

在您的情况下,共享资源是巨大的。我假设您有一张发票,它是使用扫描图像创建的,作为每个页面的背景。扫描的背景决定了文件的大小


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

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

  • 每页使用四个字体子集,每个大约50KB
  • 一页上有十幅图像,每幅约200KB(每页一幅图像)
  • 每个页面上有四个图像,每个约50KB
  • 10个页面,每个页面的内容流约为25KB
  • 目录、信息字典、页面树、交叉引用表等对象的大小约为350 KB
单个页面至少需要: -四个字体子集:4乘以50KB -单个图像:1倍200KB -四幅图像:4乘以50KB -单个内容流:1倍50KB -一个稍微缩小的交叉引用表,一个稍微缩小的页面树,一个几乎相同的目录,一个相同大小的信息字典,。。。200 KB

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

在您的情况下,共享资源是巨大的。我假设您有一张发票,它是使用扫描图像创建的,作为每个页面的背景。扫描的背景决定了文件的大小


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

所说的“重量”,是指文件大小吗?您当前的问题标题读起来像是垃圾邮件广告……而且,其他非法语国家使用“兆字节”而不是“兆八位字节”。我怀疑所有页面都共享资源,提取一个页面将获得所有负担。请给我们看PDF。@Paulosaares不幸的是,我不能。这是一张包含大量客户数据的发票。请考虑设置压模的最大压缩。您所说的“重量”是指文件大小吗?您当前的问题标题读起来像是垃圾邮件广告……而且,其他非法语国家使用“兆字节”而不是“兆八位字节”。我怀疑所有页面都共享资源,提取一个页面将获得所有负担。请给我们看PDF。@Paulosaares不幸的是,我不能。这是一张有很多客户数据的发票。请考虑为压模设置最大压缩。谢谢,但它根本不起作用。。。请看我的编辑。谢谢,但它根本不工作。。。请看我的编辑。非常感谢您的解释。我试过了,但没有结果。请看我的编辑。我的解释解释了为什么你得到的结果不是你想要的结果。所有页面都有一个共同的资源,负责文件大小的大部分。我的坏消息。我以为你的最后一行是我的解决方案;)非常感谢你的解释。我试过了,但没有结果。请看我的编辑。我的解释解释了为什么你得到的结果不是你想要的结果。所有页面都有一个共同的资源,负责文件大小的大部分。我的坏消息。我以为你的最后一行是我的解决方案;)
        stamper.SetFullCompression();