首先从iText的官网下载这个开源的小组件。
iText官方网站
Java版iText组件
Java版工具包
C#版iText组件
C#版工具包
这里笔者使用的是Java版itext-521。
将itext-521zip压缩包解压缩后得到7个文件:itextpdf-521jar(核心组件)、itextpdf-521-javadocjar(API文档)、itextpdf-521-sourcesjar(源代码)、itext-xtra-521jar、itext-xtra-521-javadocjar、itext-xtra-521-sourcesjar
使用5步即可生成一个简单的PDF文档。
复制代码
1 // 1创建 Document 对象
2 Document _document = new Document();
3 // 2创建书写器,通过书写器将文档写入磁盘
4 PdfWriter _pdfWriter = PdfWritergetInstance(_document, new FileOutputStream("生成文件的路径"));
5 // 3打开文档
6 _documentopen();
7 // 4向文档中添加内容
8 _documentadd(new Paragraph("Hi"));
9 // 5关闭文档
10 _documentclose();
复制代码
OK,搞定,不出问题的话就会在你指定的路径中生成一个PDF文档,内容是纯文本的“Hi”。
可是这样并不能完全满足我们的需求,因为通常我们要生成的PDF文件不一定是纯文本格式的,比如我现在要实现打印销售单的功能,那么最起码需要绘制表格才行,怎么办呢?且跟笔者继续向下研究。
在iText中,有专门的表格类,即PdfPTable类。笔者做了一个简单的表格示例,请先看代码:
复制代码
1 OutTradeList _otl = thisgetOtlBiz()findOutTradeListById(thisgetOtlid());
2 String _fileName = _otlgetOtlId() + "pdf";
3
4 // iText 处理中文
5 BaseFont _baseFont = BaseFontcreateFont("STSongStd-Light", "UniGB-UCS2-H", true);
6 // 1创建 Document 对象
7 Document _document = new Document(PageSizeA4);
8
9 HttpServletResponse response = ServletActionContextgetResponse();
10 responsesetContentType("application/pdf; charset=ISO-8859-1");
11 responsesetHeader("Content-Disposition", "inline; filename=" + new String(_fileNamegetBytes(), "iso8859-1"));
12
13 // 2创建书写器,通过书写器将文档写入磁盘
14 PdfWriter _pdfWriter = null;
15 try {
16 _pdfWriter = PdfWritergetInstance(_document, responsegetOutputStream());
17 } catch (Exception e) {
18 thissetMessage("单据生成失败,请检查服务器目录权限配置是否正确");
19 eprintStackTrace();
20 Systemoutprintln("2挂了");
21 // return INPUT;
22 return null;
23 }
24 if(_pdfWriter == null) {
25 thissetMessage("单据生成失败,请检查服务器目录权限配置是否正确");
26 Systemoutprintln("3挂了");
27 // return INPUT;
28 return null;
29 }
30
31 // 3打开文档
32 _documentopen();
33
34 // 4创建需要填入文档的元素
35 PdfPTable _table = new PdfPTable(4);
36 PdfPCell _cell = null;
37
38 _tableaddCell(new Paragraph("单据号", new Font(_baseFont)));
39 _cell = new PdfPCell(new Paragraph(_otlgetOtlId()));
40 _cellsetColspan(3);
41 _tableaddCell(_cell);
42
43 _tableaddCell(new Paragraph("客户名称", new Font(_baseFont)));
44 _cell = new PdfPCell(new Paragraph(_otlgetClients()getName(), new Font(_baseFont)));
45 _cellsetColspan(3);
46 _tableaddCell(_cell);
47
48 _tableaddCell(new Paragraph("销售日期", new Font(_baseFont)));
49 _cell = new PdfPCell(new Paragraph(_otlgetOutDate()toString()));
50 _cellsetColspan(3);
51 _tableaddCell(_cell);
52
53 _cell = new PdfPCell();
54 _cellsetColspan(4);
55 PdfPTable _tabGoods = new PdfPTable(7);
56 // 添加标题行
57 _tabGoodssetHeaderRows(1);
58 _tabGoodsaddCell(new Paragraph("序号", new Font(_baseFont)));
59 _tabGoodsaddCell(new Paragraph("商品名称", new Font(_baseFont)));
60 _tabGoodsaddCell(new Paragraph("自定义码", new Font(_baseFont)));
61 _tabGoodsaddCell(new Paragraph("规格", new Font(_baseFont)));
62 _tabGoodsaddCell(new Paragraph("数量", new Font(_baseFont)));
63 _tabGoodsaddCell(new Paragraph("单价", new Font(_baseFont)));
64 _tabGoodsaddCell(new Paragraph("小计", new Font(_baseFont)));
65 Object[] _outTrades = _otlgetOutTrades()toArray();
66 // 将商品销售详细信息加入表格
67 for(int i = 0; i < _outTradeslength;) {
68 if((_outTrades[i] != null) && (_outTrades[i] instanceof OutTrade)) {
69 OutTrade _ot = (OutTrade) _outTrades[i];
70 Goods _goods = _otgetGoods();
71 _tabGoodsaddCell(StringvalueOf((++i)));
72 _tabGoodsaddCell(new Paragraph(_goodsgetName(), new Font(_baseFont)));
73 _tabGoodsaddCell(_goodsgetUserCode());
74 _tabGoodsaddCell(_goodsgetEtalon());
75 _tabGoodsaddCell(StringvalueOf(_otgetNum()));
76 _tabGoodsaddCell(StringvalueOf(_otgetPrice()));
77 _tabGoodsaddCell(StringvalueOf((_otgetNum() _otgetPrice())));
78 }
79 }
80 _celladdElement(_tabGoods);
81 _tableaddCell(_cell);
82
83 _tableaddCell(new Paragraph("总计", new Font(_baseFont)));
84 _cell = new PdfPCell(new Paragraph(_otlgetAllPrice()toString()));
85 _cellsetColspan(3);
86 _tableaddCell(_cell);
87
88 _tableaddCell(new Paragraph(" *** 作员", new Font(_baseFont)));
89 _cell = new PdfPCell(new Paragraph(_otlgetProcure()));
90 _cellsetColspan(3);
91 _tableaddCell(_cell);
92
93 // 5向文档中添加内容,将表格加入文档中
94 _documentadd(_table);
95
96 // 6关闭文档
97 _documentclose();
98 Systemoutprintln(_fileName);
99 thissetPdfFilePath(_fileName);
100 Systemoutprintln("3搞定");
101 // return SUCCESS;
102 return null;
复制代码
以上代码是写在 Struts2 的 Action 中的,当用户发送了请求之后直接将生成的PDF文件用输出流写入到客户端,浏览器收到服务器的响应之后就会询问用户打开方式。
当然,我们也可以将文件写入磁盘等等。
生成PDF文档代码如下:
package poiitext;import javaioFileOutputStream;
import javaioIOException;
import javaawtColor;
import comlowagietext;
import comlowagietextpdf;
import comlowagietextpdfBaseFont;
/
创建Pdf文档
@author Administrator
/
public class HelloPdf
{
public static void main(String[] args)throws Exception
{
BaseFont bfChinese = BaseFontcreateFont("STSong-Light", "UniGB-UCS2-H", BaseFontNOT_EMBEDDED);
Font FontChinese = new Font(bfChinese, 12, FontNORMAL);
// 第一步,创建document对象
Rectangle rectPageSize = new Rectangle(PageSizeA4);
//下面代码设置页面横置
//rectPageSize = rectPageSizerotate();
//创建document对象并指定边距
Document doc = new Document(rectPageSize,50,50,50,50);
Document document = new Document();
try
{
// 第二步,将Document实例和文件输出流用PdfWriter类绑定在一起
//从而完成向Document写,即写入PDF文档
PdfWritergetInstance(document,new FileOutputStream("src/poi/itext/HelloWorldpdf"));
//第3步,打开文档
documentopen();
//第3步,向文档添加文字 文档由段组成
documentadd(new Paragraph("Hello World"));
Paragraph par = new Paragraph("世界你好",FontChinese);
documentadd(par);
PdfPTable table = new PdfPTable(3);
for(int i=0;i<12;i++)
{
if (i == 0)
{
PdfPCell cell = new PdfPCell();
cellsetColspan(3);
cellsetBackgroundColor(new Color(180,180,180));
celladdElement(new Paragraph("表格头" , FontChinese));
tableaddCell(cell);
}
else
{
PdfPCell cell = new PdfPCell();
celladdElement(new Paragraph("表格内容" , FontChinese));
tableaddCell(cell);
}
}
documentadd(table);
}
catch (DocumentException de)
{
Systemerrprintln(degetMessage());
}
catch (IOException ioe)
{
Systemerrprintln(ioegetMessage());
}
//关闭document
documentclose();
Systemoutprintln("生成HelloPdf成功!");
}
}
希望对你有帮助。
这可能是缩进不是默认位置造成的。检查和处理方法如下: 方法一、光标放到不能居中的单元格,菜单→格式→段落→把缩进的左右都调整为0,然后再设置居中; 方法二、光标放到不能居中的单元格,菜单→视图→标尺(如果标尺已经打开此步骤略)
场景:我们经常会需要用代码生成pdf文件,涉及到复杂的内容也可以选用先自己制作pdf模板,再用代码去读取,动态数据部分的内容无法用模板实现的就要用Java代码去实现
需求:生成如下的pdf
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)