PDF使用iText进行压缩(调整图像大小)

时间:2014-08-25 20:16:37

标签: java pdf compression itext transparency

我正在尝试使用iText缩小PDF的大小。在我的代码中,我调整了现有图像的大小。我在http://itextpdf.com/examples/iia.php?id=286找到了一个代码示例并对其进行了修改。它缩小了尺寸,但图像以jpg格式返回,因此它们具有白色背景。显然JPG不支持透明度。我已经将代码更改为png图像和其他一些内容(例如DCTDECODE过滤到FLATEDECODE和BufferedImage.TYPE_INT_RGB到ARGB)。但它不起作用。 Pdf无法打开(图像数据不足)。有什么想法我错过了什么?这是我的代码:

    float FACTOR = 0.5f;
    PdfReader reader = new PdfReader(src);  
    int n = reader.getXrefSize();
    PdfObject object;
    PRStream stream;

    for (int i = 0; i < n; i++) {
        object = reader.getPdfObject(i);
        if (object == null || !object.isStream())
            continue;
        stream = (PRStream)object;

        PdfObject pdfsubtype = stream.get(PdfName.SUBTYPE);
        if (pdfsubtype != null &&    pdfsubtype.toString().equals(PdfName.IMAGE.toString())) {

            PdfImageObject image = new PdfImageObject(stream);                 
            BufferedImage bi = image.getBufferedImage();
            if (bi == null) continue;
            int width = (int)(bi.getWidth() * FACTOR);
            int height = (int)(bi.getHeight() * FACTOR);
            BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
            AffineTransform at = AffineTransform.getScaleInstance(FACTOR, FACTOR);
            Graphics2D g = img.createGraphics();
            g.drawRenderedImage(bi, at);
            ByteArrayOutputStream imgBytes = new ByteArrayOutputStream();
            ImageIO.write(img, "png", imgBytes);
            g.dispose();

            stream.clear();
            stream.setData(imgBytes.toByteArray(), false, PRStream.BEST_COMPRESSION);
            stream.put(PdfName.TYPE, PdfName.XOBJECT);
            stream.put(PdfName.SUBTYPE, PdfName.IMAGE);
            stream.put(PdfName.FILTER, PdfName.FLATEDECODE);
            stream.put(PdfName.WIDTH, new PdfNumber(width));
            stream.put(PdfName.HEIGHT, new PdfNumber(height));
            stream.put(PdfName.BITSPERCOMPONENT, new PdfNumber(8));
            stream.put(PdfName.COLORSPACE, PdfName.DEVICERGB);
            imgBytes.flush();
            imgBytes.close();
        }
    }
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
    stamper.close();
    reader.close(); 

0 个答案:

没有答案