很久没有更新过了,稍微闲一点,顺势总结下N久之前用到的小技巧。
这里生成pdf主要使用itext.jar。如想生成一个pdf,其实很简单的啦!第一种:全部使用代码生成;第二种:根据pdf模板生成。当前,个人还是偏向第二种。
使用工具
1.Adobe Acrobat软件(制作pdf模板)
2.iText.jar
3.iTextAsian.jar(解决中文输出问题)
pdf模板
使用ADobe Acrobat软件制作一个简易的pdf模板,效果如下:


注:pdf模板中的文本域(xm、pxxj、rq)是为后期填充数据做准备,其中,若发现填充数据之后数据显示不全,或不显示,可重新制作文本域,或文本框设置大一点即可(使数据能完全填充进去)。
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.AcroFields;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;
public class Test {
public static void main(String[] args) throws Exception {
test();
System.out.println("success");
}
public static void test() throws IOException, DocumentException {
// pdf模板
String fileName = "D:/test.pdf";
PdfReader reader = new PdfReader(fileName);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
/* 将要生成的目标PDF文件名称 */
PdfStamper ps = new PdfStamper(reader, bos);
PdfContentByte under = ps.getUnderContent(1);
/* 使用中文字体 */
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();
fontList.add(bf);
/* 取出报表模板中的所有字段 */
AcroFields fields = ps.getAcroFields();
fields.setSubstitutionFonts(fontList);
fillData(fields, data());
/* 必须要调用这个,否则文档不会生成的 */
ps.setFormFlattening(true);
ps.close();
//生成pdf路径
OutputStream fos = new FileOutputStream("D:/result.pdf");
fos.write(bos.toByteArray());
fos.flush();
fos.close();
bos.close();
}
/**
* 填充模板
* */
public static void fillData(AcroFields fields, Map<String, String> data)
throws IOException, DocumentException {
for (String key : data.keySet()) {
String value = data.get(key);
fields.setField(key, value); // 为字段赋值,注意字段名称是区分大小写的
}
}
/**
* 填充数据源
* 其中data存放的key值与pdf模板中的文本域值相对应
* */
public static Map<String, String> data() {
Map<String, String> data = new HashMap<String, String>();
data.put("xm", "李磊");
data.put("pxsj", "2018年1月12日-2018年5月12日");
data.put("rq", "2018年5月18日");
return data;
}
}
效果
生成pdf效果如下所示:

样式不好看,重在生成pdf的方法。俗话说:好记性不如烂笔头,以此方法记录,以后回顾也方便!
本文介绍了一种利用iText库结合Adobe Acrobat制作的模板来生成带有中文内容的PDF文件的方法。通过示例代码展示了如何填充PDF模板中的字段,并解决了中文显示的问题。

1106

被折叠的 条评论
为什么被折叠?



