我有使用合成工具创建的PDF文件来生成财务报表。
PDF文件使用全球图像资源,每个文件大约5000 - 10000页,以最大限度地提高空间效率。
这些陈述包括营销图片。其中许多(约3mb),而不是每个特定的陈述都使用所有图像。
当我使用为此目的开发的工具提取PDF文件时(或者我仅仅出于测试目的使用adobe acrobat) - 要在PDF文件的开头提取空白页面,得到的提取的PDF是3mb左右。审核空间使用情况会发现它由3mb的图像组成。
使用iTextSharp(最新的5.4.4)我试图遍历每个页面并复制到编写者调用reader.RemoveUnusedObjects。但这并没有减小尺寸。
我还发现了另一个使用pdfstamper并尝试相同的例子。结果相同。
我也尝试过设置最大压缩和SetFullCompression。没有任何区别。
任何人都可以给我任何关于我可能做什么的指示。我希望我可以将它作为一个简单的练习来完成,而不必解析PDF文件中的对象并手动删除未使用的对象。
以下代码:
iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(inputFile);
iTextSharp.text.Document document = new iTextSharp.text.Document(reader.GetPageSizeWithRotation(1));
// step 2: we create a writer that listens to the document
// step 3: we open the document
iTextSharp.text.pdf.PdfCopy pdfCpy = new iTextSharp.text.pdf.PdfCopy(document, new System.IO.FileStream(outputFile, System.IO.FileMode.Create));
document.Open();
iTextSharp.text.pdf.PdfContentByte cb = pdfCpy.DirectContent;
//pdfCpy.NewPage();
int objects = reader.RemoveUnusedObjects();
reader.RemoveFields();
reader.RemoveAnnotations();
// we retrieve the total number of pages
int numberofPages = reader.NumberOfPages;
int i = 0;
while (i < numberofPages)
{
i++;
document.SetPageSize(reader.GetPageSizeWithRotation(i));
document.NewPage();
iTextSharp.text.pdf.PdfImportedPage page = pdfCpy.GetImportedPage(reader, i);
pdfCpy.SetFullCompression();
reader.RemoveUnusedObjects();
reader.RemoveFields();
reader.RemoveAnnotations();
int rotation = reader.GetPageRotation(i);
if (rotation == 90 || rotation == 270)
{
cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(i).Height);
}
else
{
cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
}
pdfCpy.AddPage(page);
}
pdfCpy.NewPage();
pdfCpy.Add(new iTextSharp.text.Paragraph("This is added text"));
document.Close();
pdfCpy.CompressionLevel = iTextSharp.text.pdf.PdfStream.BEST_COMPRESSION;
pdfCpy.Close();
reader.Close();
压模示例:
iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(inputFile);
using (FileStream fs = new FileStream(outputFile + ".2" , FileMode.Create))
{
iTextSharp.text.pdf.PdfStamper stamper = new iTextSharp.text.pdf.PdfStamper(reader, fs, iTextSharp.text.pdf.PdfWriter.VERSION_1_5);
iTextSharp.text.pdf.PdfWriter writer = stamper.Writer;
writer.SetPdfVersion(iTextSharp.text.pdf.PdfWriter.PDF_VERSION_1_5);
writer.CompressionLevel = iTextSharp.text.pdf.PdfStream.BEST_COMPRESSION;
reader.RemoveFields();
reader.RemoveUnusedObjects();
stamper.Reader.RemoveUnusedObjects();
stamper.SetFullCompression();
stamper.Writer.SetFullCompression();
stamper.Close();
}
reader.Close();
答案 0 :(得分:0)
尝试使用iTextSharp.text.pdf.PdfSmartCopy
代替PdfCopy
。
对我来说,它将PDF大小约为43MB的PDF减少到了〜4MB。