`
geshenyi
  • 浏览: 100926 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

IText生成PDF

阅读更多
iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将 XML、Html文件转化为PDF文件。 iText的安装非常方便,在http://www.lowagie.com/iText/download.html - download 网站上下载iText.jar文件后,只需要在系统的CLASSPATH中加入iText.jar的路径,在程序中就可以使用iText类库了。



网站 :

官方网站 : http://www.lowagie.com/iText/

api : http://www.1t3xt.info/api/





步骤 : 首先下载需要的 jar 包 , 主要有三个 , 将这 3 个包导入到我们的 web 项目的 lib 目录下 , 就可以使用 itext 生成 标准的 pdf 文档了



iText.jar : 必须的 jar 包



iTextAsian.jar : 支持中文的 jar 包

bcprov-jdk15-140.jar : pdf 文档加密所要使用的一个包



例子 : 生成一个 HelloWord !:



用iText生成PDF文档需要5个步骤:



①建立com.lowagie.text.Document对象的实例。 Document document = new Document(); 

②建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。

PDFWriter.getInstance(document, new FileOutputStream("Helloworld.PDF")); 

③打开文档。 document.open(); 

④向文档中添加内容。 document.add(new Paragraph("Hello World")); 

⑤关闭文档。 document.close(); 

通过上面的5个步骤,就能产生一个Helloworld.PDF的文件,文件内容为"Hello World"。





如何支持中文 :

在这里我们的的解决思路是将字体构造成中文的 , 然后在需要中文的时候 , 使用该字体完成对中文的支持



BaseFont bf=null;

//定义标题中文标题字体

Font fontTopic = null;

//定义黑色字体

Font fontBlack=null;



bf = BaseFont.createFont("STSong-Light",

"UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);

fontTopic = new Font(bf, 14, Font.NORMAL,Color.BLUE);

fontBlack = new Font(bf, 6, Font.NORMAL,Color.BLACK);



首先要定义一个基础字体BaseFont bf , 用他构建一个可以书写中文的字体 , 其他字体如fontTopic , fontBlack 可以在这个字体上构建 , 给他加入一些新的特性 , 比如字体大小 , 颜色 , 在构建好以后 , 就可以使用这些字体了 , 用他们来书写中文



设置文档页面大小 , 页面布局



// 在 new 文档的时候 , 可以使用下面的构造方法 , 传递纸的大小 , 左边距 , 右边距 , 上边距 , 下边距



Document document = new Document(PageSize.A4,60,60,50,50);



添加段落 :

// 使用字体fontTopic

1. Paragraph p= new Paragraph("套餐论证指标",fontTopic);

//设置段落对其方式为居中,1-居中,2-具右,默认具左

2. p.setAlignment( 1 );

3. document.add(p);

如果我们需要页面布局 , 比如在标题下面和表格上面有一些空白 , 我门可以用几个空段落来实现这个目标 , 也是 3 步

Paragraph p1= new Paragraph(" ",fontTopic);

p1.setAlignment(1);

document.add(p1);









添加表格 :



1.Tab le table = new Table(8); // 构造一个有 8 列的表格


//设置列宽

1.int headerwidths[] = {20, 22, 22, 10, 11, 11, 11, 10};
2.tab le.setWidths(headerwidths);
3.tab le.setWidth(110);
4.tab le.setPadding(3); / /设置表格中cell相对表格的大小,值越大生成表格的cell越大
5.Cel l cell=new Cell(new Paragraph("商品名称", fontRed)); // 给表格里添加一个 cell
table.addCell(cell);

1.// 如果要设置下一个 cell 占 3 列 则可以
2.cel l= new Cell(new Paragraph(""));
cell.setColspan(2);

table.addCell(cell);

1.// 最后记得 2.document.add (table);
3.document .close();


在我们构造我们需要的表格的样子时候 , 我们最好一行一行构造 , 在有行跨多列的时候 , 我们可以使用setColspan (?), 这样我们就可以清晰的构造出我们想要的表格的样式了 , 不要一会构造行 , 一会构造列 , 到最后就乱了



设置图片 :



1.Ima ge jpgBack = Image.getInstance("logo.gif");
2.jpg Back.setAbsolutePosition(3, 768); // 设置图片的左上角的坐标为 ( 3, 768 ), 注意屏幕左下脚的坐标为 (0,0)
3.pgB ack.setAlignment(Image.UNDERLYING);
4.doc ument.add(jpgBack);


设置水印图片和水印文字



水印图片和水印文字主要是给已经存在的 pdf 文档中添加的 , 假设我们的目录下有Chap010 1 .pdf 文档 , 现在我们要给这个文档添加水印图片和水印文字



PdfReader reader = new PdfReader("Chap0101.pdf ");

PdfContentByte under; // 文档起始页

PdfContentByte over; // 文档结束页

Image img = Image.getInstance("watermark.jpg");

// 设置图片显示的位置

img.setAbsolutePosition(200, 500);

//水印效果一定是给一个已经存在的文档加的,加好以后要另起一个名字

PdfStamper stamp = new PdfStamper(reader, new FileOutputStream("Chap0102.pdf "));

under = stamp.getUnderContent(1);

under.addImage(img);

over = stamp.getOverContent(1);

over.beginText();

over.setFontAndSize(bf, 30);

over.showTextAligned(Element.ALIGN_LEFT, "  套





析", 220, 500, 45);



over.endText();

stamp.close();

//删除以前没有水印文件

File file =new File("Chap0101.pdf");



if(file.exists())

{

file.delete();

}



设置密码 :



设置密码也是在写之前就要先设置密码 , 主要是在得到PdfWriter   对象后 , 就开始对文档加密





PdfWriter writer = PdfWriter.getInstance(document,new FileOutputStream("Chap0102.pdf "));

writer.setEncryption(PdfWriter.STRENGTH128BITS, " user ", " 8366 ", PdfWriter.AllowCopy | PdfWriter.AllowPrinting);



然后进行其他操作



完整的在套餐分析中使用 itext 的代码以及显示效果 :





public class NewPDF



{



public static void main(String[] args)

{



BaseFont bf=null;

//定义标题中文标题字体

Font fontTopic = null;

//定义黑色字体

Font fontBlack=null;

//定义红色字体

Font fontRed=null;

try

{



bf = BaseFont.createFont("STSong-Light",

"UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);

fontTopic = new Font(bf, 14, Font.NORMAL,Color.BLUE);

fontBlack = new Font(bf, 6, Font.NORMAL,Color.BLACK);

fontRed = new Font(bf, 6, Font.NORMAL,Color.RED);



Document document = new Document(PageSize.A4,60,60,60,50);





PdfWriter.getInstance(document, new FileOutputStream ("Chap0101.pdf"));



document.open();

//使用自定义的中文段落字体

Paragraph p= new Paragraph("套餐论证指标",fontTopic);



//添加两行空行

Paragraph p1= new Paragraph(" ",fontTopic);

Paragraph p2= new Paragraph(" ",fontTopic);





//设置段落对其方式为居中,1-居中,2-具右,默认具左

p.setAlignment(1);

p1.setAlignment(1);

p2.setAlignment(1);

document.add(p);

document.add(p1);

document.add(p2);



//设置图片

Image jpgBack = Image.getInstance("logo.gif");

jpgBack.setAbsolutePosition(3, 768);



jpgBack.setAlignment(Image.UNDERLYING);



document.add(jpgBack);

//设置表格为8行



Table table = new Table(8);



//设置列宽

int headerwidths[] = {20, 22, 22, 10, 11, 11, 11, 10};

table.setWidths(headerwidths);

table.setWidth(110);

//设置表格中cell相对表格的大小,值越大生成表格的cell越大

table.setPadding(2);

Cell cell=new Cell(new Paragraph("商品名称", fontRed));

table.addCell(cell);



cell= new Cell(new Paragraph("商称的值", fontBlack));

table.addCell(cell);



cell= new Cell(new Paragraph(""));

cell.setColspan(2);

table.addCell(cell);





cell= new Cell(new Paragraph("宽表", fontRed));

table.addCell(cell);



cell= new Cell(new Paragraph("时间", fontBlack));

table.addCell(cell);



cell= new Cell(new Paragraph("", fontBlack));

cell.setColspan(2);

table.addCell(cell);



cell= new Cell(new Paragraph("新增客户数", fontRed));

table.addCell(cell);





cell= new Cell(new Paragraph("新客数值", fontBlack));

table.addCell(cell);



cell= new Cell(new Paragraph("", fontBlack));

cell.setColspan(6);

table.addCell(cell);



cell= new Cell(new Paragraph("纯理性条件下本网预计目标客户数", fontRed));

table.addCell(cell);



cell= new Cell(new Paragraph("纯数值", fontBlack));

table.addCell(cell);

cell= new Cell(new Paragraph("", fontBlack));

cell.setColspan(6);

table.addCell(cell);



cell= new Cell(new Paragraph("合理性条件下本网预计目标客户数", fontRed));

table.addCell(cell);



cell= new Cell(new Paragraph("合数值", fontBlack));

table.addCell(cell);

cell= new Cell(new Paragraph("", fontBlack));

cell.setColspan(6);

table.addCell(cell);



cell= new Cell(new Paragraph("最大可能损失指标", fontRed));

table.addCell(cell);



cell= new Cell(new Paragraph("最标值", fontBlack));

table.addCell(cell);

cell= new Cell(new Paragraph("", fontBlack));

cell.setColspan(6);

table.addCell(cell);





cell= new Cell(new Paragraph("本网客户收益", fontRed));

table.addCell(cell);



cell= new Cell(new Paragraph("收益值", fontBlack));

table.addCell(cell);

cell= new Cell(new Paragraph("新增客户收益", fontRed));

table.addCell(cell);



cell= new Cell(new Paragraph("信益值", fontBlack));

table.addCell(cell);

cell= new Cell(new Paragraph("挽留客户数", fontRed));

table.addCell(cell);



cell= new Cell(new Paragraph("挽值", fontBlack));

table.addCell(cell);



cell= new Cell(new Paragraph("", fontBlack));

cell.setColspan(2);

table.addCell(cell);



cell= new Cell(new Paragraph("发展预计", fontRed));

cell.setColspan(8);

table.addCell(cell);





cell= new Cell(new Paragraph("", fontRed));

table.addCell(cell);



cell= new Cell(new Paragraph("纯理性条件下本网预计目标客户数(个)", fontRed));



table.addCell(cell);



cell= new Cell(new Paragraph("合理性条件下本网预计目标客户数(个)", fontRed));



table.addCell(cell);



cell= new Cell(new Paragraph("新增客户数(个)", fontRed));



table.addCell(cell);

cell= new Cell(new Paragraph("最大可能损失(元)", fontRed));



table.addCell(cell);

cell= new Cell(new Paragraph("本网客户收益(元)", fontRed));



table.addCell(cell);

cell= new Cell(new Paragraph("新增客户收益(元)", fontRed));



table.addCell(cell);

cell= new Cell(new Paragraph("挽留客户数(个)", fontRed));



table.addCell(cell);



cell= new Cell(new Paragraph("第一月", fontRed));



table.addCell(cell);

cell= new Cell(new Paragraph("值1", fontBlack));



table.addCell(cell);

cell= new Cell(new Paragraph("值2", fontBlack));



table.addCell(cell);

cell= new Cell(new Paragraph("值3", fontBlack));



table.addCell(cell);

cell= new Cell(new Paragraph("值4", fontBlack));



table.addCell(cell);

cell= new Cell(new Paragraph("值5", fontBlack));



table.addCell(cell);

cell= new Cell(new Paragraph("值7", fontBlack));



table.addCell(cell);

cell= new Cell(new Paragraph("值7", fontBlack));



table.addCell(cell);

cell= new Cell(new Paragraph("第二月", fontRed));



table.addCell(cell);

cell= new Cell(new Paragraph("值1", fontBlack));



table.addCell(cell);

cell= new Cell(new Paragraph("值2", fontBlack));



table.addCell(cell);

cell= new Cell(new Paragraph("值3", fontBlack));



table.addCell(cell);

cell= new Cell(new Paragraph("值4", fontBlack));



table.addCell(cell);

cell= new Cell(new Paragraph("值5", fontBlack));



table.addCell(cell);

cell= new Cell(new Paragraph("值7", fontBlack));



table.addCell(cell);

cell= new Cell(new Paragraph("值7", fontBlack));



table.addCell(cell);

cell= new Cell(new Paragraph("第三月", fontRed));



table.addCell(cell);

cell= new Cell(new Paragraph("值1", fontBlack));



table.addCell(cell);

cell= new Cell(new Paragraph("值2", fontBlack));



table.addCell(cell);

cell= new Cell(new Paragraph("值3", fontBlack));



table.addCell(cell);

cell= new Cell(new Paragraph("值4", fontBlack));



table.addCell(cell);

cell= new Cell(new Paragraph("值5", fontBlack));



table.addCell(cell);

cell= new Cell(new Paragraph("值7", fontBlack));



table.addCell(cell);

cell= new Cell(new Paragraph("值7", fontBlack));



table.addCell(cell);

document.add(table);

document.close();

PdfReader reader = new PdfReader("Chap0101.pdf");

PdfContentByte under;

PdfContentByte over;

Image img = Image.getInstance("watermark.jpg");

img.setAbsolutePosition(200, 500);

//水印效果一定是给一个已经存在的文档加的,加好以后要另起一个名字

PdfStamper stamp = new PdfStamper(reader, new FileOutputStream("Chap0102.pdf"));



//设置密码,给文档写之前就要先设定密码,并且设置为可拷贝,可打印

stamp.setEncryption(PdfWriter.STRENGTH128BITS, "userpass", "8366", PdfWriter.AllowCopy | PdfWriter.AllowPrinting);

under = stamp.getUnderContent(1);



under.addImage(img);



over = stamp.getOverContent(1);

over.beginText();

over.setFontAndSize(bf, 30);

over.showTextAligned(Element.ALIGN_LEFT, "  套





析", 220, 500, 45);



over.endText();

stamp.close();

//删除以前没有水印文件

File file =new File("Chap0101.pdf");



if(file.exists())

{

file.delete();

}



}

catch(Exception e)

{

e.printStackTrace();

}







}



}


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/virus026/archive/2010/09/13/5881075.aspx
分享到:
评论

相关推荐

    itext 生成pdf 目录

    在使用iText生成PDF目录时,要注意几点: - 确保每个书签都有一个对应的目标位置,否则在PDF中点击书签可能无法正确跳转。 - 避免内存泄漏,尤其是在处理大量书签时,要及时释放资源。 - 书签层次不宜过深,以免影响...

    解决Itext生成PDF中文不换行的jar

    为了解决"Java使用Itext生成PDF中文不换行"的问题,我们可以采取以下几种策略: 1. **设置字体和编码**:确保使用支持中文的字体,如SimSun、Arial Unicode MS等,并正确设置PDF的编码为UTF-8。Itext中的`Font`类...

    freemarker+itext生成PDF

    这篇博客 "freemarker+itext生成PDF" 可能详细介绍了如何结合这两者来生成PDF文件,这在报表生成、发票打印或任何需要静态化输出的场景中非常有用。 首先,让我们了解FreeMarker。FreeMarker是一个基于模板的语言,...

    Android使用iText生成pdf并读取pdf内容

    在这个场景中,我们将探讨如何利用iText在Android应用中生成PDF以及读取PDF的内容。 首先,我们需要在Android项目中引入iText库。由于Android Studio默认使用Gradle作为构建工具,我们可以在`build.gradle`文件的...

    使用iText生成PDF.doc

    以下是一些关于如何使用iText生成PDF的关键知识点: 1. **安装与获取iText**: 要使用iText,首先需要从其官方源代码托管平台SourceForge下载相应的.jar文件。基础的iText.jar提供了基本的PDF生成功能,但如果你...

    itext-2.1.7源码包以及 解决iText生成pdf时中文标点存在行首问题的修改class

    "itext-2.1.7源码包以及 解决iText生成pdf时中文标点存在行首问题的修改class" 这个标题提到了两个关键点。首先,`itext-2.1.7`是开源Java库iText的一个版本,用于创建、修改和操作PDF文档。这个版本的源码包提供了...

    iText生成PDF - 实例

    **iText生成PDF实例详解** 在信息技术领域,PDF(Portable Document Format)文件因其跨平台、易阅读和保真性等特点,被广泛应用于文档共享和交流。而iText是一款开源的Java库,它允许开发者轻松地创建、修改和操作...

    使用itext生成PDF文件

    2. **创建PDF文档**:使用iText生成PDF的第一步是创建一个PdfWriter实例,然后基于该实例创建一个Document对象。例如: ```java Document document = new Document(); PdfWriter.getInstance(document, new ...

    iText生成pdf解决中文不显示

    iText生成pdf解决中文不显示字库,pdf凉字不显示,由于生成iText插件生成pdf的时候中文会显示不出来,遇到过的是"凉"字,查到是字体库的原因,网上下载字体库msyh.ttc,生成的时候指定字体库,就可以解决了,小bug一...

    itext生成pdf目录

    用itext方法生成 与Word一样的目录

    itext生成PDF图片文档

    iText生成PDF图片文档 iText是一个功能强大的Java类库,用于生成PDF文档。通过使用iText,我们可以轻松地生成PDF文档,包括图片、文字、表格等多种元素。本文将详细介绍如何使用iText生成PDF图片文档。 iText基本...

    初学Itext 生成PDF 表格,条形码(一维),图片

    对于初学者来说,掌握使用iText生成PDF文档中的表格、一维条形码和图片是一项基本技能。此外,需要注重代码中字符串的准确性,避免由于扫描或输入错误导致的问题。熟练掌握iText库的使用,可以使开发者在处理PDF文件...

    权威Itext生成pdf

    【Itext生成PDF详解】 Itext是一个用于生成PDF文档的Java库,对于.NET环境,有对应的iTextSharp库。在创建PDF文档时,通常需要经过五个步骤,这在描述中已有详细阐述。以下是对这些步骤的详细解释: 1. **创建...

    使用itext生成pdf需要的jar包

    本篇将详细介绍如何使用iText生成PDF,以及所需的jar包。 首先,我们需要理解iText库的核心功能。iText允许开发者通过编程方式创建PDF文档,支持添加文本、图像、表格、链接、样式和布局等多种元素。它还提供了高级...

    Itext生成PDF所需要的最全Jar包

    这个压缩包提供了使用Itext生成PDF所需的全部Jar包,确保你可以一次性导入所有必要的依赖。 1. **Itext核心组件**: - `kernel`:这是Itext的核心模块,提供了基本的PDF文档操作功能,如创建、打开、修改PDF文档,...

    itext生成PDF和word的两个demo

    里面包含两个demo实例,分别是itext-pdf生成pdf的,一个是itext-rtf生成word的。其中还附有学习笔记一份,上述生成的文档包括对字体的选择(本地或者iTextAsian里面的),有对图片的添加,有对样式的调整,有对table...

    使用IText生成PDF和WORD文档

    document.add(new Paragraph("这是使用IText生成的PDF文档!")); document.close(); } catch (DocumentException | IOException e) { e.printStackTrace(); } } } ``` 这段代码首先创建了一个`Document`对象...

    itext生成pdf报表的小demo

    接下来,我们来看看如何生成PDF报表。首先,创建一个新的PDF文档需要一个`Document`对象,这将作为整个PDF的容器: ```java Document document = new Document(); ``` 然后,我们需要一个`PdfWriter`实例,它负责将...

    itext 生成pdf文档

    用itext生成pdf文档,生成的内容有表格形式,文本形式,设置字体样式,文档页边距。

    springboot使用itext生成pdf并保存到本地

    总结一下,要实现在Spring Boot应用中使用iText生成带有页眉、页码、水印、目录和二维码的PDF,你需要: 1. 引入iText及相关库。 2. 创建HTML页面并将其转换为PDF。 3. 定制PDF内容,包括添加页眉、页码和水印。 4. ...

Global site tag (gtag.js) - Google Analytics