admin管理员组文章数量:1648939
PDF作为日常常见的文件格式之一,有时候经常需要使用到。在Java中生成PDF的方式一般有:itext-PdStamper pdfStamper(根据模板生成PDF),itext-Document document(使用代码编写)等。
使用IText生成PDF:IText是一个能够快速生成PDF文件的Java类库,IText的Java类对于那些要生成包括文本,表格,图形的只读文档是很好用的。
IText依赖jar包 (百度云下载)
https://pan.baidu/s/1ymVgFjE6oSoS4VI2UKRCWg
API接口地址:https://api.itextpdf/itex/
在java项目导入依赖jar包,如下
itext-asian.jar 中文支持
Document对象 构造方法
Document(Rectangle pageeSize,float marginLeft,float marginTop,float marginBottom) 分别代表PDF页面大小,内容距离文档边的距离。
默认 Document() 无参 默认为 A4 ,36,36,36,36
属性
版本(PdfVersionImp)、标题(Title)、作者(Author)、主题(Subject)、关键字(Keywords)、创建者(Creator)等
方法
add() 向文档添加内容 newPage()添加下一页 getPageSize()页面大小等等方法
Rectangle对象 (页面对象)
常用的构造方法 Rectangle(PageSize.A4)
属性:NO_BORDER (无边框) ,
方法:rotate()横向打印 setBackgroundColor()设置背景色 setBorder()设置边框 setBorderColor()设置边框颜色
Element接口
内容对象差不多都实现了该接口,可以设置一些方位参数,如居中对齐。
Paragraph段落对象 方法 add(Element)添加 以及一些设置段落文字格式的方法
PDF文档生成(不使用模板)
FileOutputStream out;
@Test
public void test() throws DocumentException, MalformedURLException, IOException {
out = new FileOutputStream("D:\\Demo\\春.pdf");
// 设置页面的属性
Rectangle tRectangle = new Rectangle(PageSize.A4); // 页面大小
tRectangle.setBackgroundColor(BaseColor.WHITE); // 页面背景色
tRectangle.setBorder(1220);// 边框
tRectangle.setBorderColor(BaseColor.BLUE);// 边框颜色
tRectangle.setBorderWidth(244.2f);// 边框宽度
Document doc = new Document(tRectangle);// 定义文档
doc = new Document(tRectangle.rotate());// 横向打印
PdfWriter writer = PdfWriter.getInstance(doc, out);// 书写器
writer.setPdfVersion(PdfWriter.PDF_VERSION_1_2);//版本(默认1.4)
//设置PDF文档属性
doc.addTitle("春");// 标题
doc.addAuthor("朱自清");// 作者
doc.addSubject("春天的脚步近了");// 主题
doc.addKeywords("春");// 关键字
doc.addCreator("田野上的风筝");// 创建者
Paragraph tParagraph = new Paragraph("春" , getChineseFont());
tParagraph.setAlignment(Element.ALIGN_JUSTIFIED);// 对齐方式
Paragraph tParagraphs = new Paragraph("盼望着,盼望着,东风来了春天的脚步近了。一切都像刚睡醒的样子,欣欣然张开了眼。山朗润起来了,水涨起来了,太阳的脸红起来了", getChineseFont());
tParagraph.setAlignment(Element.ALIGN_CENTER);// 居中
tParagraph.setIndentationLeft(12);// 左缩进
tParagraph.setIndentationRight(12);// 右缩进
tParagraph.setFirstLineIndent(24);// 首行缩进
tParagraph.setLeading(20f);// 行间距
tParagraph.setSpacingBefore(5f);// 设置上空白
tParagraph.setSpacingAfter(10f);// 设置段落下空白
doc.setMargins(10, 20, 30, 40);// 页边空白
Image img = Image.getInstance("D:\\Demo\\spring.png");
img.setAlignment(Image.MIDDLE); //设置图片居中
img.setBorder(Image.BOX);
img.setBorderWidth(10);
img.setBorderColor(BaseColor.WHITE);
img.scaleToFit(900, 350);// 设置图片大小
doc.open();// 打开文档
/// doc.add(tRectangle);
doc.add(tParagraph); //添加段落
doc.add(tParagraphs);
doc.add(img); //添加img
// doc.newPage(); //添加下一页
// writer.setPageEmpty(true);// fasle-显示空内容的页;true-不会显示
doc.close(); //记得关闭document
}
//支持中文 设置字体,字体颜色、大小等
public Font getChineseFont() {
BaseFont simpChinese;
Font ChineseFont = null;
try {
simpChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
ChineseFont = new Font(simpChinese, 12, Font.NORMAL, BaseColor.BLUE);
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return ChineseFont;
}
使用IText生成PDF文件(无模板),仔细看官方API文档即可轻松创建PDF文档。
运行
使用模板生成PDF文件(准备一个PDF模板)
模板的制作;使用word文档新建一个内容文档,如在文档放一个表格,将文档转为PDF格式,转为PDF文件后,使用PDF编辑器打开(工具可以使用Adobe Acrobat Pro),在PDF编辑器里添加表单域,一般如果是内容是表格的话,该工具会自动识别并添加域。也可以自己添加域,建议自己添加文本域,(这样比自动添加要稳)并设置字体属性,属性包括字体大小,样式。对齐等。
如下,高亮部分代表表单域。
下面直接上代码
public void fillTemplate() {
try {
FileOutputStream out = new FileOutputStream("D:\\is\\夏季.pdf");// 输出流
PdfReader reader = new PdfReader("F:\\Java\\PDF模板\\夏季.pdf");//读取pdf模板
ByteArrayOutputStream bos = new ByteArrayOutputStream();
PdfStamper stamper = new PdfStamper(reader, bos);
AcroFields form = stamper.getAcroFields();
String[] str = { "星火小学", "2019-8-1", "8:00-20:00"};//定义数组,用于赋值
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); //设置中文
ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();
fontList.add(bf); //添加字体
form.setSubstitutionFonts(fontList); //设置替换字体
Iterator<String> it=form.getFields().keySet().iterator();//得到字段迭代器
while (it.hasNext()) {//遍历输出表单域名与值
String name = it.next().toString();
form.setField(name, str[i]);
System.out.println("name="+name+";str="+str[i++]);
}
stamper.setFormFlattening(true);// 设置为fasle,生成PDF将不能编辑
stamper.close();//关闭PdfStamper
Document doc = new Document();//实例化Document对象
PdfCopy copy = new PdfCopy(doc, out);
doc.open();//打开文档
PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
copy.addPage(importPage);
doc.close();
} catch (Exception e) {
e.printStackTrace();
}
}
运行上面方法
总结:不使用模板生成PDF文件,模板不固定,可以根据代码进行调整,但维护的代码比较多,使用模板生成PDF文件:代码简单明了,但花在准备模板的时间也很多,而且表单域的长度也固定,超出可能会显示不全
版权声明:本文标题:Java生成PDF文件 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1729505111a1203537.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论