亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通過爪哇用DPI壓縮PDF大小

通過爪哇用DPI壓縮PDF大小

Helenr 2022-09-14 16:57:36
尋找一種方法來壓縮PDF質量,并在JAVA中更改DPI。例如,我嘗試了PDFBox /itext庫,但仍然無法實現它。特別是如果當前的PDF DPI較高,我需要設置DPI(我需要降低掃描文檔的質量)請注意,我只看免費和開源庫。
查看完整描述

2 回答

?
浮云間

TA貢獻1829條經驗 獲得超4個贊

最后,我找到了使用itextpdf庫的最佳解決方案。我們可以根據因子減少 DPI。


例如:因子 = 新數字像素/當前數字像素(系數 = 0.5f)


import java.awt.Graphics2D;

import java.awt.geom.AffineTransform;

import java.awt.image.BufferedImage;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;


import javax.imageio.ImageIO;


import com.itextpdf.text.DocumentException;

import com.itextpdf.text.pdf.PRStream;

import com.itextpdf.text.pdf.PdfName;

import com.itextpdf.text.pdf.PdfNumber;

import com.itextpdf.text.pdf.PdfObject;

import com.itextpdf.text.pdf.PdfReader;

import com.itextpdf.text.pdf.PdfStamper;

import com.itextpdf.text.pdf.parser.PdfImageObject;


public class ReduceSize {


    public static final String SRC = "/Users/xxxx/Downloads/low/input.pdf";

    public static final String DEST = "/Users/xxxx/Downloads/low/output.pdf";

    public static final float FACTOR = 0.5f;


    public static void main(String[] args) throws DocumentException, IOException {

        File file = new File(DEST);

        file.getParentFile().mkdirs();

        new ReduceSize().manipulatePdf(SRC, DEST);

    }

    public void manipulatePdf(String src, String dest) throws DocumentException, IOException {

        PdfReader reader = new PdfReader(src);

        int n = reader.getXrefSize();

        PdfObject object;

        PRStream stream;

        // Look for image and manipulate image stream

        for (int i = 0; i < n; i++) {

            object = reader.getPdfObject(i);

            if (object == null || !object.isStream())

                continue;

            stream = (PRStream)object;

            if (!PdfName.IMAGE.equals(stream.getAsName(PdfName.SUBTYPE)))

                continue;

            if (!PdfName.DCTDECODE.equals(stream.getAsName(PdfName.FILTER)))

                continue;

            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);

            if (width <= 0 || height <= 0)

                continue;

            BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

            AffineTransform at = AffineTransform.getScaleInstance(FACTOR, FACTOR);

            Graphics2D g = img.createGraphics();

            g.drawRenderedImage(bi, at);

            ByteArrayOutputStream imgBytes = new ByteArrayOutputStream();

            ImageIO.write(img, "JPG", imgBytes);

            stream.clear();

            stream.setData(imgBytes.toByteArray(), false, PRStream.NO_COMPRESSION);

            stream.put(PdfName.TYPE, PdfName.XOBJECT);

            stream.put(PdfName.SUBTYPE, PdfName.IMAGE);

            stream.put(PdfName.FILTER, PdfName.DCTDECODE);

            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);

        }

        reader.removeUnusedObjects();

        // Save altered PDF

        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));

        stamper.setFullCompression();

        stamper.close();

        reader.close();

    }


}


查看完整回答
反對 回復 2022-09-14
?
蝴蝶不菲

TA貢獻1810條經驗 獲得超4個贊

請嘗試完全壓縮


PdfReader reader = new PdfReader ( src) ; 

PdfStamper stamper = new PdfStamper( reader, new FileOutputStream(dest) , 

Pdfwrlter. VERSION 1_5) ; 

stamper.getWriter().setCompressionLeveI (9);

int total = reader . getNumberOfPages() + 1; 

for (int i = 1; i < total; i++) {

      reader . setpagecontent (i, reader . getpagecontent (i) ) ; 

}

stamper. setFuIICompression() ; 

stamper. close ( ) ; 


查看完整回答
反對 回復 2022-09-14
  • 2 回答
  • 0 關注
  • 200 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號