如何运用Java组件itext生成pdf

如何运用Java组件itext生成pdf,第1张

 首先从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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/12189160.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存