![](/img/trans.png)
[英]iTextSharp generated PDF: How to send the pdf to the client and add a prompt?
[英]How to PDF Resize generated by rdlc and itextsharp
我使用rdlc生成了pdf,然后使用iTextSharp pdfsmartcopy類將多個pdf文件合並到一個文檔中。 但我的pdf大小很大,我想減小該pdf文件的大小。 我曾嘗試使用iTextSharp壓縮它,但無法壓縮它。 當我將pdf文件在線上傳到ilivepdf.com進行壓縮時,它會將21MB文件壓縮為1MB。
通常,問題與嵌入字體有關。
你看,PDF確實努力保存你的文件。
為此,PDF庫可以決定嵌入字體。 你可以想象這只是將字體文件放入PDF文檔中。
但是,這是棘手的部分。
PDF規范考慮到這可能是過度的。 我的意思是,如果你只使用西方語言中通常使用的50個字符的字符,那么嵌入整個字體就沒什么意義了。
所以PDF支持一種稱為“字體子集”的功能。 這意味着,不是嵌入整個字體,而是僅將實際使用的那些字符嵌入到文檔中。
那么當你合並這些文件時究竟出了什么問題呢?
(我將跳過很多技術細節。)
為了區分完全嵌入的字體,系統字體或子集嵌入字體, iText
在嵌入字體時為您的字體生成新的字體名稱。
因此,包含Times New Roman子集的文檔可能在其資源中包含“Times-AUHFDI”。
同樣,第二個文檔(同樣包含Times New Roman的子集)可能會將“Times-VHUIEF”列為其資源之一。
我相信它只是添加一個隨機的6個字符的后綴。 (前iText開發人員)
PdfSmartCopy
必須決定如何處理這些資源。 遺憾的是,它不知道這些字體是否實際上是相同的。 因此它決定將這兩個子集嵌入到新文檔中。
這是一個巨大的內存懲罰。 如果您有100個文檔,所有文檔都使用相同字體的子集,則該子集將嵌入100次。
您列出的另一個工具實際上可能會檢查這些字體是否相同(如果是,則只嵌入一次)。 或者其他工具可能根本不關心那么多,並假設基於部分名稱匹配它們是相同的。
理想的解決方案當然是比較字體中的實際字符,以查看是否可以合並這兩個子集。
但這將更加困難(並且可能會造成性能損失)。
你能做什么?
有12種字體從未嵌入。 它們被假定存在於每個系統上(因此它們從未嵌入它們。)
如果您可以控制生成PDF文檔的過程,則可以簡單地決定僅使用這些字體創建它們。
或者,您可以編寫更智能的PdfSmartCopy
。 您需要了解字體的構建和存儲方式,並執行前面提到的實際比較。
在iText尋求技術支持。 如果有足夠多的人請求此特定功能,您可能會得到它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.