PDF模板报表导出(Java+Acrobat+itext)
1、 首先要安装Adobe Acrobat,装好之后用Acrobat从一个word,excel或者pdf中转换一个pdf模板,我做的模板很简单,直接写一个简单的word再生成一个pdf表单,之后编辑文本域的名字属性等,根据名字在Java中导入。下图是Acrobat10打开的,每个文本域都有一个名字,在Java中根据名字(xh、xm等)添表格,(文本域的字体设置成kozuka Mincho,能接受汉字导入)。

2、文件准备(附近查看我的下载资源)
(1)向java工程导入两个包 iText.jar(我用的5.0.6版本),iTextAsian.jar(汉字支持包)
(2)把“学生信息模板.pdf”和“图片.jpg”放到D盘跟 目录下
3、 Java代码
代码从网上一个大神那看到只改动了一点- -
注意主类中有四个方法,未注释的哪个就是PDF模板导出,其他三个测试方法写的也非常好。
多看看注释
注意改文件名,包名
package org.test;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Iterator;
import java.util.List;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.Image;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.html.simpleparser.HTMLWorker;
import com.itextpdf.text.html.simpleparser.StyleSheet;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfWriter;
public class sss {
// http://prdownloads.sourceforge.net/itext/iTextAsian.jar
public static void main(String[] args) {
//createPDFWithChinese();
//createPdf();
fromPDFTempletToPdfWithValue();
// fromHtmlToPdf();
}
/**
* 根据pdf模板填充相应的值: 1,如果是根据excel填充的话,在用Acrobat生成PDF模板前,
* Excel单元格格式最好设置成文本,否则pdf填充值时可能中文无法显示
*/
public static void fromPDFTempletToPdfWithValue() {
String fileName = "d:\\学生信息模板.pdf"; //
try {
PdfReader reader = new PdfReader(fileName);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
PdfStamper ps = new PdfStamper(reader, bos);
/**
* 使用中文字体 如果是利用 AcroFields填充值的不需要在程序中设置字体,在模板文件中设置字体为中文字体就行了
*/
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",
BaseFont.NOT_EMBEDDED);
Font font = new Font(bf, 12, Font.NORMAL);
AcroFields s = ps.getAcroFields();
System.out.println("s: " + s);
System.out.println("AcroFields: " + s.getFields());
System.out.println("AcroFields.class: " + s.getFields().getClass());
System.out.println("getSignatureNames: " + s.getSignatureNames());
System.out.println("getSignatureNames: " + s.getTotalRevisions());
System.out.println("s: " + s.getBlankSignatureNames());
System.out.println("s: " + s.getFieldCache());
System.out.println("s: " + s.getSubstitutionFonts());
/*
* int i = 1; for (Iterator it = s.getFields().keySet().iterator();
* it.hasNext(); i++) { String name = (String) it.next(); String
* value = s.getField(name); System.out.println("[" + i + "- name:" +
* name + ", value: "+value+"]"); s.setField(""+name.trim(),
* "aaa一二三"); }
*
* s.setField("Text1", "NOHI"); s.setField("Text2", "2011-04-05");//
* 注意pdf中域的大小,这里设置的值太长,pdf中会显示不全
*/
// 设置为true/false在点击生成的pdf文档的填充域时有区别,
s.setField("xh", "201001");
s.setField("xm", "姓名");
s.setField("xb", "男");
s.setField("cssj", "1989-02-15");
s.setField("zy_id", "001");
s.setField("zxf", "123");
s.setField("bz", "三好学生");
//Document document = new Document();
//document.open();
Image gif = Image.getInstance("d:\\图片.jpg");
gif.setDpi(100, 100);
gif.setBorderWidth(200);
gif.scaleAbsolute(80, 100);
gif.setAbsolutePosition(400, 700);
PdfContentByte over = ps.getOverContent(1);
over.addImage(gif);
ps.setFormFlattening(true);
ps.close();
FileOutputStream fos = new FileOutputStream("d:\\学生信息导出.pdf");
fos.write(bos.toByteArray());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
// doc.close();
}
}
/**
* 创建pdf
*/
public static void createPdf() {
Document doc = null;
try {
doc = new Document();
PdfWriter.getInstance(doc, new FileOutputStream("d:\\itext.pdf"));
doc.open();
BaseFont bfChi = BaseFont.createFont("STSong-Light",
"UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font fontChi = new Font(bfChi, 12, Font.NORMAL);
doc.add(new Paragraph(
"Hello World,看看中文支持不........aaaaaaaaaaaaaaaaa", fontChi));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
doc.close();
}
}
/**
* 生成一个PDF,with图片
*/
public static void createPDFWithChinese() {
System.out.println("createPDFWithChinese...........");
try {
// 1.建立Document实例
Document document = new Document();
// 2.建立一个书写器与Document对象关联,通过书写器将文档写入磁盘
PdfWriter.getInstance(document,
new FileOutputStream("D:\\test.pdf"));
// 3.打开文档
document.open();
// 4.向文档中添加内容
// a)添加一个图片
Image gif = Image.getInstance("d:\\pdf.BMP");
System.out.println("gif" + gif);
gif.setDpi(100, 100);
gif.setBorderWidth(200);
gif.scaleAbsoluteHeight(100);
gif.scaleAbsoluteWidth(80);
document.add(gif);
// b)添加一个段落
document.add(new Paragraph("iText HelloWorld"));
// c)添加一个块
document.add(new Chunk("Text is underline", FontFactory.getFont(
FontFactory.HELVETICA_BOLD, 12, Font.UNDERLINE)));
// d)添加中文,需要引入iTextAsian.jar
// BaseFont bfChi = BaseFont.createFont("STSong-Light",
// "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
BaseFont bfChi = BaseFont.createFont("STSong-Light",
"UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font fontChi = new Font(bfChi, 12, Font.NORMAL);
document.add(new Paragraph("中文测试", fontChi));
// e)添加一个表格
// 表格内部格式和html中的格式差不多
PdfPTable table = new PdfPTable(4);
table.setWidthPercentage(100);
table.setWidthPercentage(100);
table.addCell(new Paragraph("学号", fontChi));
PdfPCell cell = new PdfPCell(new Paragraph("00000001", fontChi));
cell.setColspan(3);
table.addCell(cell);
table.addCell(new Paragraph("姓名", fontChi));
table.addCell(new Paragraph("张三", fontChi));
table.addCell(new Paragraph("总成绩", fontChi));
table.addCell(new Paragraph("160", fontChi));
table.addCell(new Paragraph("学号", fontChi));
PdfPCell cell2 = new PdfPCell(new Paragraph("00000002", fontChi));
cell2.setColspan(3);
table.addCell(cell2);
table.addCell(new Paragraph("姓名", fontChi));
table.addCell(new Paragraph("李四", fontChi));
table.addCell(new Paragraph("总成绩", fontChi));
table.addCell(new Paragraph("167", fontChi));
document.add(table);
// 5.关闭文档
document.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 根据html生成pdf没有试过,不知道行不
*/
public static void fromHtmlToPdf() {
try {
Document document = new Document();
StyleSheet st = new StyleSheet();
st.loadTagStyle("body", "leading", "16,0");
PdfWriter.getInstance(document, new FileOutputStream(
"d:\\html2.pdf"));
document.open();
List<Element> p = HTMLWorker.parseToList(new FileReader(
"d:\\to_pdf.htm"), st);
for (int k = 0; k < p.size(); ++k)
document.add((Element) p.get(k));
document.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
PDF模板报表导出(Java+Acrobat+itext)的更多相关文章
- 新知识:Java 利用itext填写pdf模板并导出(昨天奋战到深夜四点,知道今天两点终于弄懂)
废话少说,不懂itext干啥用的直接去百度吧. ***************制作模板******************* 1.先用word做出界面 2.再转换成pdf格式 3.用Adobe Acr ...
- java之数据填充PDF模板
声明:由于业务场景需要,所以根据一个网友的完成的. 1.既然要使用PDF模板填充,那么就需要制作PDF模板,可以使用Adobe Acrobat DC,下载地址:https://carrot.ctfil ...
- 创建PDF模板,java添加内容、导出下载PDF
本文主要内容是:用java在pdf模板中加入数据,图片. 废话不多说,举个非常简单的例子: 首先创建word文档,导出PDF. 用 软件adobe acrobat打开,操作步骤如图: 在指定位置添加文 ...
- java利用itext导出pdf
项目中有一功能是导出历史记录,可以导出pdf和excel,这里先说导出pdf.在网上查可以用那些方式导出pdf,用itext比较多广泛. 导出pdf可以使用两种方式,一是可以根据已有的pdf模板,进行 ...
- java根据模板文件导出pdf
原文:https://www.cnblogs.com/wangpeng00700/p/8418594.html 在网上看了一些Java生成pdf文件的,写的有点乱,有的不支持写入中文字体,有的不支持模 ...
- Java使用IText(VM模版)导出PDF
Java使用IText(VM模版)导出PDF: public String createPDF(ProjectManageBase projectManageBase) { Map map = new ...
- 【Java】itext根据模板生成pdf(包括图片和表格)
1.导入需要的jar包:itext-asian-5.2.0.jar itextpdf-5.5.11.jar. 2.新建word文档,创建模板,将文件另存为pdf,并用Adobe Acrobat DC打 ...
- JAVA使用itext根据模板生成PDF文档
1.制作PDF模板 网址打开:https://www.pdfescape.com/open/ 我们这里先在线上把基础的内容用word文档做好,然后转成PDF模板,直接上传到网站上,这样方便点 假设我们 ...
- 【PDF】java使用Itext生成pdf文档--详解
[API接口] 一.Itext简介 API地址:javadoc/index.html:如 D:/MyJAR/原JAR包/PDF/itext-5.5.3/itextpdf-5.5.3-javadoc/ ...
随机推荐
- HTML 5结构
进行总体布局时候,具体可以用的方法. 1.大纲:文档中各内容区块的结构编排. 内容区块可以使用标题元素来展示各级内容区块的标题. 关于内容区块的编排可以分为“显示编排”和“隐式编排”. 显示编排:明确 ...
- 工具批处理Demo
前言:用C语言写一些小型工具时,使用传递参数的方式会比较方便.如GIF文件转换为头文件工具,如果我们需要将某一个文件夹里所有的gif文件都转换为头文件,这时我们用批处理给这个工具传递参数,会方便很多. ...
- 2016最新Java笔试题集锦
更新时间:2015-08-13 来源:网络 投诉删除 [看准网(Kanzhun.com)]笔试题目频道小编搜集的范文“2016最新Java笔试题集锦”,供大家阅读参考, ...
- 使用URLClassLoader类载入类实例
Tomcat当中在接受到要调用的Servlet请求后,需要载入相应的Servlet类,然后创建Servlet类实例,从而调用Servlet类实例的service()方法 下面实例的场景,request ...
- iOS出现 Undefined symbols for architecture armv7 std::basic_string<char, std::char_traits<char>
Undefined symbols for architecture i386: “_OBJC_CLASS_$_XXX”, referenced from: objc-class-ref in XXX ...
- 编译direct show 的filter项目
最近搞windows编程,想学习一下direct show.编译了一下sdk里面的一个sample filter,做个笔记,记录一下. 说来渐愧,vc也用了n久了,还没有自己动手建立一个正式的项目,都 ...
- python2.7中使用mysql (windows XP)
一.首先下载mysql—python模块,下载完毕之后会有一个MySQL-python-1.2.3.win32-py2.7.exe文件,点击安装一路next,ok. 二.编辑配置文件(setting. ...
- Learning WCF Chapter 3 Bindings One-Way and Duplex Communication
One-Way and Duplex Communication A message exchange pattern describes the way messages are sent betw ...
- mapreduce引用第三方jar
要想让mapreduce程序引用第三方jar文件, 可以采用如下方式: 通过命令行参数传递jar文件, 如-libjars等; 直接在conf中设置, 如conf.set(“tmpjars”,*.ja ...
- Linux Shell编程(21)——复杂命令
更高级的用户命令find-exec COMMAND \;在每一个find 匹配到的文件执行 COMMAND 命令. 命令序列以 ; 结束( ";" 是 转义符 以保证 shell ...