分享一个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包版本后解决。