java生成pdf的方法
这里讲解生成pdf的两种方法:
1.使用pdfStamper生成pdf
2.使用XMLWorkerHelper生成pdf(css比较简单的情况下)
XMLWorkerHelper的坑在于:
1.图片问题。所以当存在图片的时候使用方法一。
2.itextpdf不支持 css 的float,position,border-xxxx这些属性,如果使用了float:xxx之类的,生成的pdf直接白屏(没任何数据),我X,最后使用table 替换div
3.所有的必须指明字体。style="font-family:‘宋体’;
eg.
<p style="padding-left: 205pt;text-indent: 0pt;line-height: 16pt;text-align: left;">
必须改成:
<p style="font-family:'宋体';padding-left: 205pt;text-indent: 0pt;line-height: 16pt;text-align: left;">
1.pdfStamper表单域生成pdf
使用adobe对pdf进行插入表单域。
/**
* 利用表单域生成pdf
* @param templatePath 模板路径
* @param targetPath 生成文件存放的路径
* @param replacement pdf中存放的数据(放在一个实体中)
*/
public static File createPdf(String templatePath, String targetPath,Object replacement){
try {
/* 打开已经定义好字段以后的pdf模板 */
URL a = PdfUtil.class.getClassLoader().getResource(templatePath);
PdfReader reader = new PdfReader(a.getPath());
/* 将要生成的目标PDF文件名称 */
File file = new File(targetPath);
File fileParent = file.getParentFile();
if(!fileParent.exists()){
fileParent.mkdirs();
}
file.createNewFile();
PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(file));
/* 使用中文字体 */
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",
BaseFont.NOT_EMBEDDED);
/* 取出报表模板中的所有字段 */
AcroFields form = stamp.getAcroFields();
form.addSubstitutionFont(bf);
/* 将实体中的内容放到pdf中 */
for (Field aField : replacement.getClass().getDeclaredFields()) {
String fieldName = aField.getName();
if ("class java.lang.String".equals(aField.getGenericType().toString())) {
Method method = replacement.getClass().getMethod("get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1));
String fieldValue = (String) method.invoke(replacement);
if (fieldValue != null) {
form.setField(fieldName,fieldValue);
}
}
}
/* 如果为false那么生成的PDF文件还能编辑,一定要设为true*/
stamp.setFormFlattening(true);
stamp.close();
reader.close();
return file;
}catch(Exception e){
e.printStackTrace();
}
return null;
}
XMLWORKHEADER生成pdf
/**
* @param fileString 模板中的内容被替换之后的字符串
* 将文本生成为pdf到指定路径
*/
public File generatePdfToLocal(String fileString, String archivePath)
throws IOException, DocumentException {
if (fileString != null) {
Document doc = new Document();
File file = new File(archivePath);
File fileParent = file.getParentFile();
if(!fileParent.exists()){
fileParent.mkdirs();
}
file.createNewFile();
OutputStream output = new FileOutputStream(file);
PdfWriter pdfWriter = PdfWriter.getInstance(doc, output);
doc.open();
log.info("生成的合同" + fileString);
InputStream input = new ByteArrayInputStream(fileString.getBytes());
XMLWorkerHelper.getInstance().parseXHtml(pdfWriter, doc, input);
doc.close();
output.close();
return file;
}
return null;
}
有问题请指出并批评。谢谢。