参考1:java实现pdf转换成图片
来源:java 实现pdf转换成图片_ZZ的博客-CSDN博客_java pdf 转图片
1.maven添加jar
<!-- https://mvnrepository.com/artifact/org.apache.pdfbox/fontbox --><dependency><groupId>org.apache.pdfbox</groupId><artifactId>fontbox</artifactId><version>2.0.9</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox --><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.9</version></dependency><!-- https://mvnrepository.com/artifact/commons-logging/commons-logging --><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency>
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<pageCount;i++){BufferedImage image = renderer.renderImageWithDPI(i, 296);
// BufferedImage image = renderer.renderImage(i, 2.5f);ImageIO.write(image, "PNG", new File("C:\\pdfbox_image.png"));}} catch (IOException e) {e.printStackTrace();}
例子中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的使用
<dependency><groupId>net.sf.cssbox</groupId><artifactId>pdf2dom</artifactId><version>1.7</version>
</dependency>
<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.12</version>
</dependency>
<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-tools</artifactId><version>2.0.12</version>
</dependency>
多页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,默认设置为150dpi = DEFAULT_DPI;}try (PDDocument pdf = PDDocument.load(new FileInputStream(pdfFile))) {int actSize = pdf.getNumberOfPages();List<BufferedImage> 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<BufferedImage> 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;// 保存所有的图片的RGBList<int[]> imgRgb = new ArrayList<int[]>();// 保存一张图片中的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;// 从图片中读取RGBtmpImgRgb = new int[width * offsetHeight];tmpImgRgb = buffer.getRGB(0, 0, width, offsetHeight, tmpImgRgb, 0, width);imgRgb.add(tmpImgRgb);}// 设置偏移高度为0offsetHeight = 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 bufferFile 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 imagePDFPage page = pdffile.getPage(i);// get the width and height for the doc at the default zoomRectangle rect = new Rectangle(0, 0, (int) page.getBBox().getWidth(), (int) page.getBBox().getHeight());// generate the imageImage img = page.getImage(rect.width, rect.height, // width &// heightrect, // clip rectnull, // null for the ImageObservertrue, // fill background with whitetrue // 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内部仓库):<dependency><groupId>com.sun.pdfview</groupId><artifactId>pdfrenderer</artifactId><version>0.9.0</version>
</dependency>
- 本文附件下载:
- 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文档转换的方法。包括:
- PDF转为Word
- PDF转为图片
- PDF转为Html
- PDF转为SVG 4.1 将PDF每一页转为单个的SVG 4.2 将一个包含多页的PDF文档转为一个SVG
- PDF转为XPS
- 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.8ImageIO.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转换后清晰度相对来说是比较高的
引入依赖:
<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.20</version></dependency>
工具类:
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<byte[]> pdfToImage(byte[] fileContent) throws IOException {List<byte[]> 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)
<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.4</version><scope>test</scope></dependency><dependency><groupId>com.lowagie</groupId><artifactId>itext</artifactId><version>2.1.7</version></dependency>
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();}}}