pdf转图片可调整大小分辨率
一、使用pdfbox
1、maven导包
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox-app</artifactId>
<version>2.0.2</version>
</dependency>
2、代码实现
mport org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.WritableRaster;
import java.io.*;
/**
* @author taboo.li
* @version 1.0.0
* @des
**/
public class PicToTest {
public static void main(String[] args) {
File file = new File("D:\\My Documents\\桌面\\c59a438f2a3f44f4b7c6.pdf");
try {
PDDocument document = PDDocument.load(file);
PDFRenderer renderer = new PDFRenderer(document);
for (int i = 0; i < document.getNumberOfPages(); i++) {
// dpi 设置越大 图片越大越清晰
BufferedImage bufferedImage = renderer.renderImageWithDPI(i, 300);
BufferedImage newImg = null;
// copy原来的图片
newImg = new BufferedImage(bufferedImage.getWidth(), bufferedImage.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
newImg.getGraphics().drawImage(bufferedImage.getScaledInstance(bufferedImage.getWidth(), bufferedImage.getHeight(), Image.SCALE_SMOOTH),0,0,null);
// 自定义长宽
// BufferedImage img = resize(bufferedImage, 1190, 1684);
// 图片要写入的地址
File picFile = new File("D:\\My Documents\\桌面\\pic",i+".jpg");
OutputStream outputStream = new FileOutputStream(picFile);
// 注意 png 比 jpg 更清晰
ImageIO.write(bufferedImage,"png",outputStream);
//下面可以改变dpi,分辨率
// JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(outputStream);
// JPEGEncodeParam param = jpegEncoder.getDefaultJPEGEncodeParam(newImg);
// // 设置参数
// param.setQuality(0.75f,false);
// param.setXDensity(300);
// param.setYDensity(300);
// param.setDensityUnit(JPEGEncodeParam.DENSITY_UNIT_DOTS_INCH);
// jpegEncoder.setJPEGEncodeParam(param);
// jpegEncoder.encode(newImg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static BufferedImage resize(BufferedImage source, int targetW, int targetH) {
int type = source.getType();
BufferedImage target = null;
double sx = (double) targetW / source.getWidth();
double sy = (double) targetH / source.getHeight();
if (sx > sy) {
sx = sy;
targetW = (int) (sx * source.getWidth());
} else {
sy = sx;
targetH = (int) (sy * source.getHeight());
}
if (type == BufferedImage.TYPE_CUSTOM) {
ColorModel cm = source.getColorModel();
WritableRaster raster = cm.createCompatibleWritableRaster(targetW, targetH);
boolean alphaPremultiplied = cm.isAlphaPremultiplied();
target = new BufferedImage(cm, raster, alphaPremultiplied, null);
} else {
target = new BufferedImage(targetW, targetH, type);
}
Graphics2D g = target.createGraphics();
g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy));
g.dispose();
return target;
}
}
二、使用icepdf
1、引用jar包
<dependency>
<groupId>org.icepdf.os</groupId>
<artifactId>icepdf-core</artifactId>
<version>6.1.2</version>
<exclusions>
<exclusion>
<groupId>javax.media</groupId>
<artifactId>jai-core</artifactId>
</exclusion>
</exclusions>
</dependency>
2、代码实现
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import org.icepdf.core.exceptions.PDFException;
import org.icepdf.core.exceptions.PDFSecurityException;
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.*;
/**
* @author taboo.li
* @version 1.0.0
* @des
**/
public class PdfIceToImage {
// 转化时放大倍数
private static float zoom = 2f;
// 颜色(灰度)
private static int color = BufferedImage.TYPE_BYTE_GRAY;
public static void main(String[] args) throws PDFException, IOException, PDFSecurityException {
pdf2Pic("D:\\My Documents\\桌面\\c59a438f2a3f44f4b7c6.pdf", "D:\\My Documents\\桌面\\pic");
}
public static void pdf2Pic(String pdfPath, String path) throws IOException, PDFException, PDFSecurityException {
Document document = new Document();
document.setFile(pdfPath);
//旋转角度
float rotation = 0f;
for (int i = 0; i < document.getNumberOfPages(); i++) {
BufferedImage img = (BufferedImage) document.getPageImage(i, GraphicsRenderingHints.PRINT, Page.BOUNDARY_CROPBOX,
rotation, zoom);
try {
BufferedImage newImg = null;
newImg = new BufferedImage(img.getWidth(), img.getHeight(), color);
//将原图片写入 新的图片
newImg.getGraphics().drawImage(img.getScaledInstance(img.getWidth(), img.getHeight(), Image.SCALE_SMOOTH),0,0,null);
File outFile = new File ( path, (i+1)+"_"+ "ice"+ ".jpg");
OutputStream outputStream = new FileOutputStream(outFile);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outputStream);
JPEGEncodeParam param = encoder. getDefaultJPEGEncodeParam(newImg);
param.setQuality(0.75f, false);
param.setDensityUnit(com.sun.image.codec.jpeg.JPEGEncodeParam.DENSITY_UNIT_DOTS_INCH);
//分辨率 300dpi
param.setXDensity(300);
param.setYDensity(300);
encoder.setJPEGEncodeParam(param);
encoder.encode(newImg);
} catch (IOException e) {
e.printStackTrace();
}
}
document.dispose();
}
}