1.导入jar包:
compile group: 'com.itextpdf', name: 'itext-asian', version: '5.2.0' compile group: 'com.itextpdf', name: 'itextpdf', version: '5.5.13.2' compile group: 'org.xhtmlrenderer', name: 'flying-saucer-pdf', version: '9.1.20' compile group: 'com.itextpdf.tool', name: 'xmlworker', version: '5.5.13.2'
2.生成pdf文件代码:
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String date = sdf.format(new Date());
try {
ITextRenderer renderer = new ITextRenderer();
renderer.getSharedContext().getTextRenderer().setSmoothingThreshold(0);
//将打印的所有信息封装为pdfHtmlDTO文件
PDFHtmlDTO pdfHtmlDTO = getPDFHtml(id);
//将pdfHtmlDTO生成html格式的字符串
String html = getHtmlString(pdfHtmlDTO);
/**
* html格式的字符串生成pdf文件
*/
renderer.setDocumentFromString(html);
//解决中文支持
ITextFontResolver fontResolver = renderer.getFontResolver();
//在项目中上传simsun.ttc字体文件
String path1 = ResourceUtils.getFile("classpath:") + File.separator + "simsun.ttc";
if ("linux".equals(getCurrentOperatingSystem())) {
fontResolver.addFont(path1, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
} else {
fontResolver.addFont("C:\\WINDOWS\\Fonts\\simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
fontResolver.addFont("C:\\WINDOWS\\Fonts\\arial.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
}
ByteArrayOutputStream os = new ByteArrayOutputStream();
renderer.layout();
renderer.createPDF(os);
renderer.finishPDF();
os.flush();
os.close();
InputStream inputStream = new ByteArrayInputStream(os.toByteArray());
String realPath = objectStorageService.putTempObject(tenantId + "-" + id + "-" + date, inputStream, fileExe, "flow-export-pdf");
return realPath;
} catch (Exception e) {
e.printStackTrace();
}
//获取当前操作系统:
public String getCurrentOperatingSystem() {
String os = System.getProperty("os.name").toLowerCase();
log.info("=========当前操作系统================"+os);
return os;
}
//html文件生成pdf文件需要注意的几点:
1.html格式的字符串中必须开头必须是是:
”<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">“
2.body中必须要标注字体,否则中文字体就无法显示:
3.如果图片是从网络中获取的。则需要将图片转化为base64的字体:
public static String getImageBase64(String imagePath) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
URL url1 = new URL(imagePath);
URLConnection uc = url1.openConnection();
InputStream inputStream = uc.getInputStream();
int j = 0;
while ((j = inputStream.read()) != -1) {
out.write(j);
}
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
return "data:image/jpg;base64," + Base64.getEncoder().encodeToString(out.toByteArray());
}
4.html格式的字符串中图片的src的值直接用base64表示:
<img style=\"width: 100px;height: 50px;margin-right: 20px;\" src='" + imageBase64 + "' />