我正在使用iTextSharp创建PDF文件,我已经添加了这些代码:
.....................................................
PdfWriter writer = PdfWriter.GetInstance(document, filestream);
writer.SetPdfVersion(PdfWriter.PDF_VERSION_1_5);
writer.CompressionLevel = PdfStream.BEST_COMPRESSION;
writer.SetFullCompression();
.....................................................
文件大小为106M,然后我从Acrobat打开并保存,该文件的大小只有5M。
更新1: 我的代码的主要部分如下所示:
for (var chart in charts.records)
{
Stream kpistream = Assembly.GetExecutingAssembly().GetManifestResourceStream("KPIInfo." + "kpi.pdf");
PdfReader kpireader = new PdfReader(kpistream);
MemoryStream ms = new MemoryStream();
PdfStamper stamper = new PdfStamper(kpireader, ms);
//some code here to insert a image to stamper
stamper.FormFlattening = true;
AcroFields acrofileds = stamper.AcroFields;
acrofileds.SetField("ID", chart.KPIId.Trim());
// a couple of lines here to set the other acro fields
stamper.Close();
MergePages(document, writer, ms.ToArray());// this line is for adding this new created page to main pdf file
ms.Close();
}
更新2:
public static void MergePages(Document document, PdfWriter writer, byte[] bytes)
{
PdfReader reader = new PdfReader(bytes);
for (int index = 1; index <= reader.NumberOfPages; index++)
{
document.NewPage();
PdfImportedPage page = writer.GetImportedPage(reader, index);
PdfContentByte content = writer.DirectContent;
content.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
}
}
有谁知道为什么?
答案 0 :(得分:3)
有两件事会影响PDF文件的大小:字体和图像,通常都嵌入在文件中,程序如何处理它们会对最终文件大小产生很大影响。例如,如果您在PDF文件中具有重复10次的相同图像,则一个应用程序可能会选择在PDF文件中保留同一图像的10个副本,而另一个程序可能会发现这10个图像实际上是相同的,只保留一份。字体数据可能会出现同样的问题。
压缩通常会影响文件大小,但不大可能在5M到106M之间变化。有一种情况确实会发生这种情况,即高分辨率图像显然比低分辨率图像占用更多空间。因此,例如,如果PDF文件中有1200 dpi图像,则工具可以打开它并将分辨率降低到120 dpi,从而大大减小文件大小。虽然1200 dpi是一个非常高的分辨率,120 dpi一点也不差,但仍然可以在屏幕上看起来很好。这就是所谓的“PDF压缩器”确实使文件显着缩小但没有“可见”的质量损失。换句话说,他们并没有真正压缩任何东西,他们只是丢掉了90%的图像细节。 :)
要找出问题所在,您可能需要尝试其他PDF库并查看其中的内容。这是一个体面的(但不是免费的)你可以尝试:
http://www.essentialobjects.com/Products/EOPdf/Default.aspx
您可以使用试用版查看它是否会为您提供相同的结果,这可能有助于您了解正在发生的事情。