如何PDF调整rdlc和itextsharp生成的大小

问题描述 投票:0回答:1

我使用rdlc生成了pdf,然后使用iTextSharp pdfsmartcopy类将多个pdf文件合并到一个文档中。但我的pdf大小很大,我想减小该pdf文件的大小。我曾尝试使用iTextSharp压缩它,但无法压缩它。当我将pdf文件在线上传到ilivepdf.com进行压缩时,它会将21MB文件压缩为1MB。

c# itext rdlc
1个回答
0
投票

通常,问题与嵌入字体有关。

你看,PDF确实努力保存你的文件。

为此,PDF库可以决定嵌入字体。你可以想象这只是将字体文件放入PDF文档中。

但是,这是棘手的部分。

PDF规范考虑到这可能是过度的。我的意思是,如果你只使用西方语言中通常使用的50个字符的字符,那么嵌入整个字体就没什么意义了。

所以PDF支持一种称为“字体子集”的功能。这意味着,不是嵌入整个字体,而是仅将实际使用的那些字符嵌入到文档中。

那么当你合并这些文件时究竟出了什么问题呢?

(我将跳过很多技术细节。)

为了区分完全嵌入的字体,系统字体或子集嵌入字体,iText会在嵌入字体时为您的字体生成新的字体名称。

因此,包含Times New Roman子集的文档可能在其资源中包含“Times-AUHFDI”。

同样,第二个文档(同样包含Times New Roman的子集)可能会将“Times-VHUIEF”列为其资源之一。

我相信它只是添加一个随机的6个字符的后缀。 (前iText开发人员)

PdfSmartCopy必须决定如何处理这些资源。遗憾的是,它不知道这些字体是否实际上是相同的。因此它决定将这两个子集嵌入到新文档中。

这是一个巨大的内存惩罚。如果您有100个文档,所有文档都使用相同字体的子集,则该子集将嵌入100次。

您列出的另一个工具实际上可能会检查这些字体是否相同(如果是,则只嵌入一次)。或者其他工具可能根本不关心那么多,并假设基于部分名称匹配它们是相同的。

理想的解决方案当然是比较字体中的实际字符,以查看是否可以合并这两个子集。

但这将更加困难(并且可能会造成性能损失)。

你能做什么?

  1. 有12种字体从未嵌入。它们被假定存在于每个系统上(因此它们从未嵌入它们。) 如果您可以控制生成PDF文档的过程,则可以简单地决定仅使用这些字体创建它们。
  2. 或者你可以写一个更聪明的PdfSmartCopy。您需要了解字体的构建和存储方式,并执行前面提到的实际比较。
  3. 在iText寻求技术支持。如果有足够多的人请求此特定功能,您可能会得到它。
© www.soinside.com 2019 - 2024. All rights reserved.