Масштабирование PDF существующих изображений - PullRequest
2 голосов
/ 14 февраля 2012

Я пытаюсь просмотреть все изображения в формате PDF и изменить их размер, чтобы уменьшить размер файла PDF.Я использую iTextSharp в C #.Ниже мой код пока.Когда я смотрю на выходной файл, ни одно из изображений не было изменено.

PdfReader pdf = new PdfReader(input);
using (PdfStamper stp = new PdfStamper(pdf, output))
{
    for (int i = 1; i <= pdf.NumberOfPages; i++)
    {
        PdfDictionary page = pdf.GetPageN(i);
        PdfDictionary resources = (PdfDictionary)PdfReader.GetPdfObject(page.Get(PdfName.RESOURCES));
        PdfDictionary xObjects = (PdfDictionary)PdfReader.GetPdfObject(resources.Get(PdfName.XOBJECT));

        if (xObjects == null)
            continue;

        foreach (PdfName name in xObjects.Keys)
        {
            PdfObject xObj = xObjects.Get(name);
            if (!xObj.IsIndirect())
                continue;

            //Filter non-images
            PdfDictionary xObjDic = (PdfDictionary)PdfReader.GetPdfObject(xObj);
            PdfName xObjType = (PdfName)PdfReader.GetPdfObject(xObjDic.Get(PdfName.SUBTYPE));
            if (!PdfName.IMAGE.Equals(xObjType))
                continue;

            //Get embedded image  
            int refId = ((PRIndirectReference)xObj).Number;
            PRStream objStream = (PRStream)pdf.GetPdfObject(refId); 
            PdfImageObject objImg = new PdfImageObject(objStream);                           
            iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(objImg.GetImageAsBytes());

            //Resize
            img.ScaleAbsolute(200, 200);
            img.SetDpi(72, 72);

            PdfReader.KillIndirect(xObj);
            stp.Writer.AddDirectImageSimple(img, (PRIndirectReference)xObj);
            break;
        }
    }
}

pdf.Close();
...