فشرده سازی حجم فایلهای PDF توسط iTextSharp
نویسنده: وحید نصیری
تاریخ: ۱۳۹۱/۰۹/۲۰ ۱۷:۴۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
public static int FindDuplicateImagesCount(string pdfFileName)
{
int count = 0;
var pdf = new PdfReader(pdfFileName);
var md5 = new MD5CryptoServiceProvider();
var enc = new UTF8Encoding();
var imagesHashList = new List<string>();
int intPageNum = pdf.NumberOfPages;
for (int i = 1; i <= intPageNum; i++)
{
var page = pdf.GetPageN(i);
var resources = PdfReader.GetPdfObject(page.Get(PdfName.RESOURCES)) as PdfDictionary;
if (resources == null) continue;
var xObject = PdfReader.GetPdfObject(resources.Get(PdfName.XOBJECT)) as PdfDictionary;
if (xObject == null) continue;
foreach (var name in xObject.Keys)
{
var pdfObject = xObject.Get(name);
if (!pdfObject.IsIndirect()) continue;
var imgObject = PdfReader.GetPdfObject(pdfObject) as PdfDictionary;
if (imgObject == null) continue;
var subType = PdfReader.GetPdfObject(imgObject.Get(PdfName.SUBTYPE)) as PdfName;
if (subType == null) continue;
if (!PdfName.IMAGE.Equals(subType)) continue;
byte[] imageBytes = PdfReader.GetStreamBytesRaw((PRStream)imgObject);
var md5Hash = enc.GetString(md5.ComputeHash(imageBytes));
if (!imagesHashList.Contains(md5Hash))
{
imagesHashList.Add(md5Hash);
}
else
{
Console.WriteLine("Found duplicate image @page: {0}.", i);
count++;
}
}
}
pdf.Close();
return count;
}
public class PdfSmartCopy2 : PdfSmartCopy
{
public PdfSmartCopy2(Document document, Stream os)
: base(document, os)
{ }
/// <summary>
/// This is a forgotten feature in iTextSharp 5.3.4.
/// Actually its PdfSmartCopy is useless without this!
/// </summary>
protected override PdfIndirectReference CopyIndirect(PRIndirectReference inp, bool keepStructure, bool directRootKids)
{
return base.CopyIndirect(inp);
}
}
public static void RemoveDuplicateObjects(string inFile, string outFile)
{
var document = new Document();
var copy = new PdfSmartCopy2(document, new FileStream(outFile, FileMode.Create));
document.Open();
var reader = new PdfReader(inFile);
var n = reader.NumberOfPages;
for (int page = 0; page < n; )
{
copy.AddPage(copy.GetImportedPage(reader, ++page));
}
copy.FreeReader(reader);
document.Close();
}
private static void CreateTestFile()
{
using (var pdfDoc = new Document(PageSize.A4))
{
var pdfWriter = PdfWriter.GetInstance(pdfDoc, new FileStream("Test.pdf", FileMode.Create));
pdfDoc.Open();
var table = new PdfPTable(new float[] { 1, 2 });
table.AddCell(Image.GetInstance("01.png"));
table.AddCell(Image.GetInstance("01.png"));
pdfDoc.Add(table);
}
}
اینبار دو تصویر داریم که هر دو به یک stream اشاره میکنند. تصاویر فوق به کمک برنامه iText RUPS تهیه شدهاند.