java 实现pdf转换成图片

参考1:java实现pdf转换成图片

来源:java 实现pdf转换成图片_ZZ的博客-CSDN博客_java pdf 转图片

1.maven添加jar


		
			org.apache.pdfbox
			fontbox
			2.0.9
		
		
		
			org.apache.pdfbox
			pdfbox
			2.0.9
		
		
		
			commons-logging
			commons-logging
			1.2
		

 2.实现代码

 /**
     * 转换全部的pdf
     * @param fileAddress 文件地址
     * @param filename PDF文件名
     * @param type 图片类型
     */
    public static void pdf2png(String fileAddress,String filename,String type) {
        // 将pdf装图片 并且自定义图片得格式大小
        File file = new File(fileAddress+"\\"+filename+".pdf");
        try {
            PDDocument doc = PDDocument.load(file);
            PDFRenderer renderer = new PDFRenderer(doc);
            int pageCount = doc.getNumberOfPages();
            for (int i = 0; i < pageCount; i++) {
                BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows native DPI
                // BufferedImage srcImage = resize(image, 240, 240);//产生缩略图
                ImageIO.write(image, type, new File(fileAddress+"\\"+filename+"_"+(i+1)+"."+type));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
 
/**
     *自由确定起始页和终止页
     * @param fileAddress 文件地址
     * @param filename pdf文件名
     * @param indexOfStart 开始页  开始转换的页码,从0开始
     * @param indexOfEnd 结束页  停止转换的页码,-1为全部
     * @param type 图片类型
     */
    public static void pdf2png(String fileAddress,String filename,int indexOfStart,int indexOfEnd,String type) {
        // 将pdf装图片 并且自定义图片得格式大小
        File file = new File(fileAddress+"\\"+filename+".pdf");
        try {
            PDDocument doc = PDDocument.load(file);
            PDFRenderer renderer = new PDFRenderer(doc);
            int pageCount = doc.getNumberOfPages();
            for (int i = indexOfStart; i < indexOfEnd; i++) {
                BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows native DPI
                // BufferedImage srcImage = resize(image, 240, 240);//产生缩略图
                ImageIO.write(image, type, new File(fileAddress+"\\"+filename+"_"+(i+1)+"."+type));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

参考2:java中pdf转图片的方法

来源:JAVA中pdf转图片的方法 - PC君 - 博客园

JAVA中实现pdf转图片可以通过第三方提供的架包,这里介绍几种常用的,可以根据自身需求选择使用。

一、icepdf。有收费版和开源版,几种方法里最推荐的。转换的效果比较好,能识别我手头文件中的中文,就是转换后可能字体的关系部分字间距有点宽。因为,字体支持是要收费的,所以转换的图片会带有官方的水印。去水印的方法可以查看另一篇文章:icepdf去水印方法

1、下载icepdf的架包,并导入项目中,这里用到4个,如下:

2、附上代码例子:

String filePath = "c:/test.pdf";
  Document document = new Document();
  document.setFile(filePath);
  float scale = 2.5f;//缩放比例
  float rotation = 0f;//旋转角度

  for (int i = 0; i < document.getNumberOfPages(); i++) {
    BufferedImage image = (BufferedImage)
    document.getPageImage(i, GraphicsRenderingHints.SCREEN, org.icepdf.core.pobjects.Page.BOUNDARY_CROPBOX, rotation, scale);
    RenderedImage rendImage = image;
    try {
        File file = new File("c:/iecPDF_" + i + ".png");
        ImageIO.write(rendImage, "png", file);
     } catch (IOException e) {
        e.printStackTrace();
    }
      image.flush();
  }
  document.dispose();

例子中是pdf转png格式的,也可以将12、13行改成jpg,转出jpg格式的,但是从转换效果来看png的清晰度会相对较高。有个小技巧是12行改成jpg,但13行使用png,也就是转换成jpg格式但有png清晰度的图片。

二、pdfbox。转换效果还可以,能识别我手中文件大部分内容,有部分内容无法识别。

1、下载pdfbox的架包,并导入项目,这里用到2个,如下:

2、附上代码例子:

File file = new File("c:\\test.pdf");
  try {
    PDDocument doc = PDDocument.load(file);
    PDFRenderer renderer = new PDFRenderer(doc);
     int pageCount = doc.getNumberOfPages();
    for(int i=0;i

例子中rederImageWithDPI的第二个参数为dpi分辨率单位,可根据需求调节大小,代码第八行提供了架包里另一种转图片的方法,第二个参数为缩放比。

三、jpedal。效果不太理想,貌似对中文支持不太好,下面的lgpl版本是开源版。

 1、下载jpedal的架包,并导入项目中,如下:

2、附上代码例子:

PdfDecoder decode_pdf = new PdfDecoder(true);
  try {
    decode_pdf.openPdfFile("c:\\test.pdf"); //file
//   decode_pdf.openPdfFile("C:/jpedalPDF.pdf", "password"); //encrypted file
//      decode_pdf.openPdfArray(bytes); //bytes is byte[] array with PDF
//      decode_pdf.openPdfFileFromURL("http://www.mysite.com/jpedalPDF.pdf",false);
//      decode_pdf.openPdfFileFromInputStream(in, false);

    int start = 1, end = decode_pdf.getPageCount();
    for(int i = start; i < end+1; i++){
      BufferedImage img=decode_pdf.getPageAsImage(i);
      try {
        ImageIO.write(img, "png", new File("C:\\jpedal_image.png"));
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    decode_pdf.closePdfFile();
  } catch (PdfException e) {
    e.printStackTrace();
  }

参考3:Java中PDF的转换(图片)与展示

来源:Java中PDF的转换(图片)与展示 - 简书 (jianshu.com)

解决的问题

有些时候我们需要在项目中展示PDF,但是直接在浏览器中加入PDF展示的插件,存在兼容性问题,某些浏览器显示效果不理想,所以我们可以将PDF转为图片,然后已图片的方式展示,效果很好。

那么怎么将PDF转为图片呢?有两种方式:

产品 特点
Apache 的 PDF box 免费;速度稍慢一点,但可以接受
E-iceblue 的 Spire.PDF for Java 转换效果很好;速度快;功能强大,支持转多种格式;收费

Spire.PDF for Java 的转换效果很好,但是如果不购买,转换过后会添加一些水印文字

参考链接:https://www.cnblogs.com/Yesi/p/11233238.html

PDF Box的使用


    net.sf.cssbox
    pdf2dom
    1.7


    org.apache.pdfbox
    pdfbox
    2.0.12


    org.apache.pdfbox
    pdfbox-tools
    2.0.12

多页PDF生成多张图片

新建一个 PdfUtil 工具类

public class PdfUtil {

    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(PdfUtil.class);

    /***
     * PDF文件转PNG图片,全部页数
     *
     * @param pdfFilePath pdf完整路径
     * @param dpi dpi越大转换后越清晰,相对转换速度越慢
     */
    public static void pdf2Image(String pdfFilePath, int dpi) {
        File file = new File(pdfFilePath);
        PDDocument pdDocument;
        try {
            String imgPdfPath = file.getParent();
            int dot = file.getName().lastIndexOf('.');
            // 获取图片文件名
            String imagePdfName = file.getName().substring(0, dot);

            pdDocument = PDDocument.load(file);
            PDFRenderer renderer = new PDFRenderer(pdDocument);
            /* dpi越大转换后越清晰,相对转换速度越慢 */
            PdfReader reader = new PdfReader(pdfFilePath);
            int pages = reader.getNumberOfPages();
            StringBuffer imgFilePath;
            for (int i = 0; i < pages; i++) {
                String imgFilePathPrefix = imgPdfPath + File.separator + imagePdfName;
                imgFilePath = new StringBuffer();
                imgFilePath.append(imgFilePathPrefix);
                imgFilePath.append("_");
                imgFilePath.append((i + 1));
                imgFilePath.append(".png");
                File dstFile = new File(imgFilePath.toString());
                BufferedImage image = renderer.renderImageWithDPI(i, dpi);
                ImageIO.write(image, "png", dstFile);
            }
            log.info("PDF文档转PNG图片成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
}

多页PDF组合成一张图片

public class PdfUtil {

    public static final int DEFAULT_DPI = 150;

    /**
     * pdf转图片
     * 多页PDF会每页转换为一张图片,下面会有多页组合成一页的方法
     *
     * @param pdfFile pdf文件路径
     * @param outPath 图片输出路径
     * @param dpi 相当于图片的分辨率,值越大越清晰,但是转换时间变长
     */
    public static void pdf2multiImage(String pdfFile, String outPath, int dpi) {
        if (ObjectUtil.isEmpty(dpi)) {
            // 如果没有设置DPI,默认设置为150
            dpi = DEFAULT_DPI;
        }
        try (PDDocument pdf = PDDocument.load(new FileInputStream(pdfFile))) {
            int actSize = pdf.getNumberOfPages();
            List picList = Lists.newArrayList();
            for (int i = 0; i < actSize; i++) {
                BufferedImage image = new PDFRenderer(pdf).renderImageWithDPI(i, dpi, ImageType.RGB);
                picList.add(image);
            }
            // 组合图片
            ImageUtil.yPic(picList, outPath);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

新建 ImageUtil 类

public class ImageUtil {

    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ImageUtil.class);

    /**
     * 将宽度相同的图片,竖向追加在一起 ##注意:宽度必须相同
     *
     * @param picList 文件流数组
     * @param outPath 输出路径
     */
    public static void yPic(List picList, String outPath) {// 纵向处理图片
        if (picList == null || picList.size() <= 0) {
            log.info("图片数组为空!");
            return;
        }
        try {
            // 总高度
            int height = 0,
                    // 总宽度
                    width = 0,
                    // 临时的高度 , 或保存偏移高度
                    offsetHeight = 0,
                    // 临时的高度,主要保存每个高度
                    tmpHeight = 0,
                    // 图片的数量
                    picNum = picList.size();
            // 保存每个文件的高度
            int[] heightArray = new int[picNum];
            // 保存图片流
            BufferedImage buffer = null;
            // 保存所有的图片的RGB
            List imgRgb = new ArrayList();
            // 保存一张图片中的RGB数据
            int[] tmpImgRgb;
            for (int i = 0; i < picNum; i++) {
                buffer = picList.get(i);
                // 图片高度
                heightArray[i] = offsetHeight = buffer.getHeight();
                if (i == 0) {
                    // 图片宽度
                    width = buffer.getWidth();
                }
                // 获取总高度
                height += offsetHeight;
                // 从图片中读取RGB
                tmpImgRgb = new int[width * offsetHeight];
                tmpImgRgb = buffer.getRGB(0, 0, width, offsetHeight, tmpImgRgb, 0, width);
                imgRgb.add(tmpImgRgb);
            }
            // 设置偏移高度为0
            offsetHeight = 0;
            // 生成新图片
            BufferedImage imageResult = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            for (int i = 0; i < picNum; i++) {
                tmpHeight = heightArray[i];
                if (i != 0) {
                    // 计算偏移高度
                    offsetHeight += tmpHeight;
                }
                // 写入流中
                imageResult.setRGB(0, offsetHeight, width, tmpHeight, imgRgb.get(i), 0, width);
            }
            File outFile = new File(outPath);
            // 写图片
            ImageIO.write(imageResult, "png", outFile);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
}

参考4:使用Java将PDF文件转成图片

来源:使用Java将PDF文件转成图片 | IT瘾 (itindex.net)

import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import javax.swing.SwingUtilities;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFPage;

/**
 * Created by David on 2016/11/15.
 */
public class Pdf2Pic {

    public static void setup() throws IOException {
        // load a pdf from a byte buffer
        File file = new File("/Users/David/Downloads/testoss.pdf");
        RandomAccessFile raf = new RandomAccessFile(file, "r");
        FileChannel channel = raf.getChannel();
        ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel
                .size());
        PDFFile pdffile = new PDFFile(buf);

        System.out.println("页数: " + pdffile.getNumPages());

        String getPdfFilePath = System.getProperty("user.dir")+File.separator+"pdfPicFile";

        //目录不存在,则创建目录
        File p=new File(getPdfFilePath);
        if(!p.exists()){
            p.mkdir();
        }

        System.out.println("getPdfFilePath is  :"+getPdfFilePath);

        for (int i = 1; i <= pdffile.getNumPages(); i++) {
            // draw the first page to an image
            PDFPage page = pdffile.getPage(i);

            // get the width and height for the doc at the default zoom
            Rectangle rect = new Rectangle(0, 0, (int) page.getBBox()
                    .getWidth(), (int) page.getBBox().getHeight());

            // generate the image
            Image img = page.getImage(rect.width, rect.height, // width &
                    // height
                    rect, // clip rect
                    null, // null for the ImageObserver
                    true, // fill background with white
                    true // block until drawing is done
            );

            BufferedImage tag = new BufferedImage(rect.width, rect.height,
                    BufferedImage.TYPE_INT_RGB);
            tag.getGraphics().drawImage(img, 0, 0, rect.width, rect.height,
                    null);



            FileOutputStream out = new FileOutputStream( getPdfFilePath+File.separator + i + ".jpg"); // 输出到文件流
                    System.out.println("成功保存图片到 :  " +getPdfFilePath+File.separator + i + ".jpg");

            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
            encoder.encode(tag); // JPEG编码

            out.close();
        }

        // show the image in a frame
        // JFrame frame = new JFrame("PDF Test");
        // frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // frame.add(new JLabel(new ImageIcon(img)));
        // frame.pack();
        // frame.setVisible(true);
    }

    public static void main(final String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                try {
                    Pdf2Pic.setup();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });
    }

}
pom.xml依赖配置(将附件中的该jar包上传到nexus内部仓库):


	com.sun.pdfview
	pdfrenderer
	0.9.0
  • 本文附件下载:
  • PDFRenderer-0.9.0.jar (2 MB)

参考5:Java 将PDF 转为Word、图片、SVG、XPS、Html、PDF/A

来源:Java 将PDF 转为Word、图片、SVG、XPS、Html、PDF/A - 云+社区 - 腾讯云 (tencent.com)

本文将介绍通过Java编程来实现PDF文档转换的方法。包括:

  1. PDF转为Word
  2. PDF转为图片
  3. PDF转为Html
  4. PDF转为SVG 4.1 将PDF每一页转为单个的SVG 4.2 将一个包含多页的PDF文档转为一个SVG
  5. PDF转为XPS
  6. PDF转为PDF/A

使用工具:Free Spire.PDF for Java(免费版)

Jar文件获取及导入:

方法1:通过官网下载下载jar包。下载后,解压文件,并将lib文件夹下的Spire.Pdf.jar文件导入Java程序。

方法2:可通过maven仓库安装导入。参考导入方法

PDF 转Word

PdfDocument pdf = new PdfDocument("test.pdf");
pdf.saveToFile("ToWord.docx",FileFormat.DOCX);

PDF转图片

支持的图片格式包括Jpeg, Jpg, Png, Bmp, Tiff, Gif, EMF等。这里以保存为Png格式为例。

import com.spire.pdf.*;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class PDFtoimage {
    public static void main(String[] args) throws IOException {

PdfDocument pdf = new PdfDocument("test.pdf");
BufferedImage image;
for(int i = 0; i< pdf.getPages().getCount();i++){
    image = pdf.saveAsImage(i);
    File file = new File( String.format("ToImage-img-%d.png", i));
    ImageIO.write(image, "PNG", file);
}
pdf.close();
    }
}

PDF转Html

PdfDocument pdf = new PdfDocument("test.pdf");
pdf.saveToFile("ToHTML.html", FileFormat.HTML);

PDF转SVG

//转为单个svg
PdfDocument pdf = new PdfDocument("test.pdf");
pdf.saveToFile("ToSVG.svg", FileFormat.SVG);
//多页pdf转为一个svg
PdfDocument pdf = new PdfDocument("sampe.pdf");
pdf.getConvertOptions().setOutputToOneSvg(true);
pdf.saveToFile("ToOneSvg.svg",FileFormat.SVG);

PDF 转XPS

PdfDocument pdf = new PdfDocument("test.pdf");
pdf.saveToFile("ToXPS.xps", FileFormat.XPS);

PDF转PDF/A

import com.spire.pdf.*;
import com.spire.pdf.graphics.PdfMargins;
import java.awt.geom.Dimension2D;

public class PDFtoPDFA {
    public static void main(String[]args){
        //加载测试文档
        PdfDocument pdf = new PdfDocument();
        pdf.loadFromFile("test.pdf");

        //转换为Pdf_A_1_B格式
        PdfNewDocument newDoc = new PdfNewDocument();
        newDoc.setConformance(PdfConformanceLevel.Pdf_A_1_B);
        PdfPageBase page;
        for ( int i=0;i< pdf.getPages().getCount();i++) {
            page = pdf.getPages().get(i);
            Dimension2D size = page.getSize();
            PdfPageBase p = newDoc.getPages().add(size, new PdfMargins(0));
            page.createTemplate().draw(p, 0, 0);
        }

        //保存结果文件
        newDoc.save("ToPDFA.pdf");
        newDoc.close();

    }
}

参考6:java实现pdf转图片

来源:java实现pdf转换图片 - pengsn - 博客园 (cnblogs.com)

一、需求

   将PDF文档类转换成图片形式。    
二、实现方式

    2.1 pdfbox     

PDDocument doc = null;
        try {
            doc = PDDocument.load(sourceFile);
            PDFRenderer renderer = new PDFRenderer(doc);
            int pageCount = doc.getNumberOfPages();
            for (int i = 0; i < pageCount; i++) {
                BufferedImage image = renderer.renderImageWithDPI(i, DPI); // 162.8
                ImageIO.write(image, ConvertImageConst.JPG, new File(filepathNoSuffix + File.separator + i + ConvertImageConst.SUFFIX_JPG));
            }
            log.info("jpg_ok. space-time: {}, pageSize={} ", (System.currentTimeMillis() - startTime), pageCount);
            return pageCount;
        } catch (IOException e) {
            log.error("pdfDocumentRender IOException {} ", e);
        } catch (Error e) {
            log.error("pdfDocumentRender Error {} ", e);
        } finally {
            try {
                if (doc != null) {
                    doc.close();
                }
            } catch (IOException e) {
                log.error("pdfDocumentRender finally IOError ", e.getMessage());
            }
            lock.unlock();
        }

 2.2 ghostscript 

gswin64 -dSAFER -dBATCH -dNOPAUSE -r300 -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=jpeg -sOutputFile=test%03d.jpg  0002.pdf

    命令:

     gswin64 主程序

     -params:

     -sDEVICE=jpeg                 // jpeg格式

     -sOutputFile=test%03d.jpg // 输出的图片名称 %03d 三位数字 %d 一位数字

      0002.pdf  //待转换的pdf文件

三、比较

实现方式 优点   缺点
pdfbox maven引入既可开发 转换速度慢,且可能内存溢出 
ghostscript 转换速度快 依赖ghostscript插件

参考7:java实现pdf转图片

来源:Java实现PDF转图片_hxt的博客-CSDN博客_java pdf转图片

pdfbox转换后清晰度相对来说是比较高的

引入依赖

		
			org.apache.pdfbox
			pdfbox
			2.0.20
		

工具类

public class PdfToImageUtil {
    /**
     * dpi越大转换后越清晰,相对转换速度越慢
     */
    private static final Integer DPI = 100;

    /**
     * 转换后的图片类型
     */
    private static final String IMG_TYPE = "png";

    /**
     * PDF转图片
     *
     * @param fileContent PDF文件的二进制流
     * @return 图片文件的二进制流
     */
    public static List pdfToImage(byte[] fileContent) throws IOException {
        List result = new ArrayList<>();
        try (PDDocument document = PDDocument.load(fileContent)) {
            PDFRenderer renderer = new PDFRenderer(document);
            for (int i = 0; i < document.getNumberOfPages(); ++i) {
                BufferedImage bufferedImage = renderer.renderImageWithDPI(i, DPI);
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                ImageIO.write(bufferedImage, IMG_TYPE, out);
                result.add(out.toByteArray());
            }
        }
        return result;
    }
}

参考8:java pdf转图片

来源:Java PDF转图片 - haxnt - 博客园 (cnblogs.com)


            org.apache.pdfbox
            pdfbox
            2.0.4
            test
        
        
            com.lowagie
            itext
            2.1.7
        
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;

import com.lowagie.text.pdf.PdfReader;
public class test1 {

    public static void main(String[] args) {
            pdf2Image("D:/1.pdf", "D:/pdf", 130);
        }

        /***
         * PDF文件转PNG图片,全部页数
         *
         * @param PdfFilePath pdf完整路径
         * @param imgFilePath 图片存放的文件夹
         * @param dpi dpi越大转换后越清晰,相对转换速度越慢
         * @return
         */
        public static void pdf2Image(String PdfFilePath, String dstImgFolder, int dpi) {
            File file = new File(PdfFilePath);
            PDDocument pdDocument;
            try {
                String imgPDFPath = file.getParent();
                int dot = file.getName().lastIndexOf('.');
                String imagePDFName = file.getName().substring(0, dot); // 获取图片文件名
                String imgFolderPath = null;
                if (dstImgFolder.equals("")) {
                    imgFolderPath = imgPDFPath + File.separator + imagePDFName;// 获取图片存放的文件夹路径
                } else {
                    imgFolderPath = dstImgFolder + File.separator + imagePDFName;
                }

                if (createDirectory(imgFolderPath)) {

                    pdDocument = PDDocument.load(file);
                    PDFRenderer renderer = new PDFRenderer(pdDocument);
                /* dpi越大转换后越清晰,相对转换速度越慢 */
                    PdfReader reader = new PdfReader(PdfFilePath);
                    int pages = reader.getNumberOfPages();
                    StringBuffer imgFilePath = null;
                    for (int i = 0; i < pages; i++) {
                        String imgFilePathPrefix = imgFolderPath + File.separator + imagePDFName;
                        imgFilePath = new StringBuffer();
                        imgFilePath.append(imgFilePathPrefix);
                        imgFilePath.append("_");
                        imgFilePath.append(String.valueOf(i + 1));
                        imgFilePath.append(".png");
                        File dstFile = new File(imgFilePath.toString());
                        BufferedImage image = renderer.renderImageWithDPI(i, dpi);
                        ImageIO.write(image, "png", dstFile);
                    }
                    System.out.println("PDF文档转PNG图片成功!");

                } else {
                    System.out.println("PDF文档转PNG图片失败:" + "创建" + imgFolderPath + "失败");
                }

            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        private static boolean createDirectory(String folder) {
            File dir = new File(folder);
            if (dir.exists()) {
                return true;
            } else {
                return dir.mkdirs();
            }
        }


}

你可能感兴趣的:(其它,oracle,数据库,database)