最近使用一个wkhtmltopdf的工具,将html转成pdf,据网上说这是目前比较好用的pdf转换工具了,最主要的是它是免费的。但是在转换过程中会出现图片失真的问题,这可让大伤脑筋。好好的图片转换出现,成了这样
通过一番分析,最后把问题锁定在了图片本身上。然后我找UI帮我看了看这张失真图片到底有何蹊跷。果不其然这几张失真的图片都是颜色格式都是CMYK编码的,改成RPG后图片正常使用。
附上Java处理CMYK转RPG的工具类
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.List;
import javax.imageio.ImageIO;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class ImageRPGUtil {
/**
* 将CMYK的图片转换成RPG,支持图片格式jpg、png
* @param imagesPath 存储图片的文件夹路径
* @return
*/
public static boolean imageCMYKToRPG(String imagesPath)
{
boolean isSuccess=false;
File mFile = new File(imagesPath);
if (mFile.exists() && mFile.isDirectory()) {
List<File> mlist = new ArrayList<File>();
getAllFile(mFile, mlist);
// 已经获取了所有图片
for (File file2 : mlist) {
BufferedImage bi =null;
try {
bi=ImageIO.read(file2);
OutputStream out = new FileOutputStream(file2);
ImageIO.write(bi, file2.getName().substring(file2.getName().lastIndexOf(".") + 1), out);
} catch (IOException e) {
log.error("【图片转换】error:"+e.getMessage());
}
}
}
log.info("【图片转换】转换结果:"+isSuccess);
return isSuccess;
}
private static void getAllFile(File mFile, List<File> mlist) {
// 1.获取子目录
File[] files = mFile.listFiles();
// 2.判断files是否是空的 否则程序崩溃
if (files != null)
{
for (File file : files)
{
if (file.isDirectory())
{
getAllFile(file, mlist);//调用递归的方式
}
else
{
// 4. 添加到集合中去
String fileName = file.getName();
if (fileName.endsWith(".jpg") || fileName.endsWith(".png")) {
mlist.add(file);//如果是这几种图片格式就添加进去
}
}
}
}
}
}
POM依赖
<!-- twelvemonkeys相关jar用来将图片CMYK转成RPG,方可使得HTML转PDF图片不失真 -->
<!-- https://mvnrepository.com/artifact/com.twelvemonkeys.imageio/imageio-core -->
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-core</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-jpeg</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>com.twelvemonkeys.common</groupId>
<artifactId>common-image</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>com.twelvemonkeys.common</groupId>
<artifactId>common-io</artifactId>
<version>3.4.1</version>
</dependency>
<!-- end -->
总结,wkhtmltopdf在html转换pdf中尽量使得html中的图片颜色编码格式为RPG,另外html中CSS JS 尽量使用原生的。