JAVA工具类——将pdf文件转长jpg图片——tika-app.jar


import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;

import nc.bs.logging.Logger;

import org.apache.commons.io.FilenameUtils;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

//工具文件:tika-app-1.1.jar
@SuppressWarnings("unchecked")
public class PdfToJpgByTika {
    public static boolean doChange(File pdfFile) throws Exception {
        //当前目录,只改扩展名
        String jpgfilename = FilenameUtils.removeExtension(pdfFile
                .getAbsolutePath()) + ".jpg";
        return doChange(pdfFile, jpgfilename);
    }

    public static boolean doChange(File pdfFile, String jpgfilename)
            throws Exception {
        PDDocument document = null;
        FileOutputStream output = null;
        try {
            if (jpgfilename == null)
                jpgfilename = FilenameUtils.removeExtension(pdfFile
                        .getAbsolutePath()) + ".jpg";

            File jpgfile = new File(jpgfilename);
            // 创建上级目录
            if (!jpgfile.getParentFile().exists())
                jpgfile.getParentFile().mkdirs();
            // 删除以前的文件
            if (jpgfile.isFile() && jpgfile.exists())
                jpgfile.delete();

            // 打开pdf文件,获取所有页面
            document = PDDocument.load(pdfFile);

            List<PDPage> pages = document.getDocumentCatalog().getAllPages();
            // 统计各页宽度和高度
            List<BufferedImage> listimgage = new ArrayList<BufferedImage>();
            int width = 0;
            int height = 0;

            for (int i = 0; i < pages.size(); i++) {
                PDPage page = pages.get(i);
                // 清晰度调整
                BufferedImage image = page.convertToImage(
                        BufferedImage.TYPE_3BYTE_BGR, 72 * 6);

                int newwidth = image.getWidth();
                if (newwidth > width)
                    width = newwidth;
                height += image.getHeight();
                listimgage.add(image);
            }
            // 绘制合成图像
            BufferedImage jpgimage = new BufferedImage(width, height,
                    BufferedImage.TYPE_INT_RGB);
            // 复制图片到缓冲流中
            Graphics2D grap = jpgimage.createGraphics();
            // 清除背景
            grap.setColor(Color.white);

            // 开始将内容填充
            int top = 0;
            for (int i = 0; i < pages.size(); i++) {
                BufferedImage image = listimgage.get(i);
                int newwidth = image.getWidth();
                int newheight = image.getHeight();
                grap.drawImage(image, 0, top, newwidth, newheight, null);
                top += image.getHeight();

            }

            // 释放图像资源
            grap.dispose();

            // 将绘制的图像生成至输出流
            output = new FileOutputStream(jpgfile);
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(output);

            // 压缩质量(quality越高质量越好)
            float quality = 1.5f;
            JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(jpgimage);
            param.setQuality(quality, true);
            encoder.setJPEGEncodeParam(param);

            encoder.encode(jpgimage);
            jpgimage.flush();

            return true;
        } catch (Exception e) {
            Logger.error(e.getMessage(), e);
            return false;
        } finally {
            if (output != null)
                output.close();
            if (document != null)
                document.close();
        }
    }
}

posted @ 2021-11-12 22:25  山䂥进城  阅读(700)  评论(0)    收藏  举报