java实现PDF转tif(图片清晰度高)

 分享一个pdf转换tif的方法。转换后图片格式小!清晰度还很高!

<!-- pdf转tif -->
        <dependency>
            <groupId>org.icepdf.os</groupId>
            <artifactId>icepdf-core</artifactId>
            <version>6.2.2</version>
        </dependency>
        <dependency>
            <groupId>org.icepdf.os</groupId>
            <artifactId>jai_core</artifactId>
            <version>1.1.3</version>
        </dependency>
        <dependency>
            <groupId>org.icepdf.os</groupId>
            <artifactId>icepdf-extra</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>org.icepdf.os</groupId>
            <artifactId>icepdf-pro</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>org.icepdf.os</groupId>
            <artifactId>icepdf-pro-intl</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>org.icepdf.os</groupId>
            <artifactId>icepdf-viewer</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>com.github.jai-codec</groupId>
            <artifactId>jai-codec</artifactId>
            <version>1.1.3</version>
        </dependency>
        <dependency>
            <groupId>com.github.jai-imageio</groupId>
            <artifactId>jai_imageio</artifactId>
            <version>1.1.1</version>
        </dependency>

import com.sun.media.imageio.plugins.tiff.TIFFTag;
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.ImageEncoder;
import com.sun.media.jai.codec.TIFFEncodeParam;
import com.sun.media.jai.codec.TIFFField;
import lombok.extern.slf4j.Slf4j;
import org.icepdf.core.pobjects.Document;
import org.icepdf.core.pobjects.Page;
import org.icepdf.core.util.GraphicsRenderingHints;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Slf4j
public class PdfUtil {


    public static void main(String[] args) {
        converPdfToTiff("F:\\xxx.pdf", "F:\\", "xxx", 300f);
    }
/**
     * 转换指定pdf文件为图片到指定的文件夹目录下
     *
     * @param pdfFilePath 需要转换的pdf文件路径
     * @param imgPushPath 需要存放转换后的图片文件目录路径
     * @param name        文件名
     * @param imgScaling  图片缩放的比例
     * @return 转换后图片的文件名集合
     */
    
    public static Map<String, Object> converPdfToTiff(String pdfFilePath, String imgPushPath, String name, float imgScaling) {
        //定义Document,用于转换图片
        Document document2 = new Document();
        //用来保存当前页码的页码
        Map<String, Object> map = new HashMap<String, Object>();
        String output036Back = "";
        List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
        try {
            document2.setFile(pdfFilePath);
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
        }
        float rotation = 0f;
        int maxPages = document2.getNumberOfPages();
        //System.out.println("maxPages: "+maxPages);
        // 循环把每页的数据转换成对应的图片
        for (int i = 0; i < document2.getNumberOfPages(); i++) {

            BufferedImage image2 = null;
            try {
                image2 = (BufferedImage)
                        document2.getPageImage(i, GraphicsRenderingHints.SCREEN, Page.BOUNDARY_CROPBOX, rotation, 9.0f);
            } catch (Exception e1) {
                log.error(e1.getMessage(), e1);
            }

            int w = 1664, h = 2342;
            image2 = setResizedByImg(image2, 2467, 3489);

            int j = 0;
            String output = "";
            String output036 = "";

            try {
                j = i + 1;
                //生成的tif图片的全路径
                output = imgPushPath + File.separator + name + "_" + j + ".tif";
                String fileName =  name + "_" + j + ".tif";
                Map<String,Object> map1 = new HashMap<>();
                map1.put("output",output);
                map1.put("page",j);
                map1.put("fileName",fileName);
                list.add(map1);
                if (!new File(imgPushPath).exists()) {
                    new File(imgPushPath).mkdirs();
                }

                BufferedImage bufferedImage = new BufferedImage(image2.getWidth(null), image2.getHeight(null), 12);
                bufferedImage.getGraphics().drawImage(image2, 0, 0, null);
                OutputStream os = new FileOutputStream(output);
                TIFFEncodeParam param = new TIFFEncodeParam();
                param.setCompression(TIFFEncodeParam.COMPRESSION_GROUP4);// 设置压缩方式
                int dpi = 300;
                TIFFField[] extras = new TIFFField[4];
                extras[0] = new TIFFField(262, TIFFTag.TIFF_SHORT, 1, (Object) new short[]{0});
                extras[1] = new TIFFField(282, TIFFTag.TIFF_RATIONAL, 1, (Object) new long[][]{{(long) dpi, 1}, {0, 0}});
                extras[2] = new TIFFField(283, TIFFTag.TIFF_RATIONAL, 1, (Object) new long[][]{{(long) dpi, 1}, {0, 0}});
                extras[3] = new TIFFField(296, TIFFTag.TIFF_SHORT, 1, (Object) new char[]{0});
                param.setExtraFields(extras);

                ImageEncoder enc = ImageCodec.createImageEncoder("TIFF", os, param);
                enc.encode(bufferedImage);
                os.close();
                image2.flush();
            } catch (IOException e) {
                log.error(e.getMessage(), e);
            }
            image2.flush();
        }
        // 清理document资源
        document2.dispose();

        map.put("pageCount", maxPages);
        map.put("list", list);
        return map;
    }

    static BufferedImage setResizedByImg(Image originalImage, int scaledWidth, int scaledHeight) {
        BufferedImage scaledBI = new BufferedImage(scaledWidth, scaledHeight, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = scaledBI.createGraphics();
        g.setComposite(AlphaComposite.Src);
        g.drawImage(originalImage, 0, 0, scaledWidth, scaledHeight, null);
        g.dispose();
        return scaledBI;
    }


}

使用的时候出现了转换后字体乱码问题,更新jar包版本后解决。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值