2017-04-13 294 views
0

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

我用这个代码:

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(); 
     } 
} 
+0

来压缩对象和外部参照表。按“重量”,你的意思是文件大小?您当前的问题标题的内容类似于垃圾广告... –

+0

另外,非法语世界的其他人使用“兆字节”而不是“兆字节”。 – CodeCaster

+2

我怀疑资源是由所有页面共享的,提取一个页面会得到所有的行李。请向我们展示PDF。 –

回答

1

畅想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();

+0

非常感谢您的解释。我试过但没有结果。请看我的编辑。 – SeyoS

+0

我的解释解释了为什么你得到的结果不是你想要的结果。所有页面都有一个共同的资源,负责大量的文件大小。 –

+0

我的不好。我认为你的最后一行是我的解决方案;) – SeyoS

1

使用

 stamper.SetFullCompression(); 

,以减少文件大小。

+0

谢谢,但它根本不起作用...请参阅我的编辑。 – SeyoS