- 浏览: 940142 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
hw7777777:
非常感谢作者提供这么好的工具,在使用的过程中遇到一些问题?1、 ...
基于java nio的memcached客户端——xmemcached -
SINCE1978:
多久过去了时间能抹平一切
无路用的人 -
fangruanyjq:
[img][/img]引用
用osworkflow写一个请假例子(提供代码下载) -
thinkingmysky:
楼主,你确定,java memached client能处理并 ...
memcached java client性能测试的几点疑问和说明 -
hellostory:
aaa5131421 写道07年2月hibernate已经出来 ...
dozer与BeanUtils
这个星期我的任务就是处理一些报表的打印问题,因为我算项目组里对jasperreport比较熟悉的了,这个东东也是我引进到这个项目。ireport画报表,使用struts的action输出PDF到浏览器,这是我们目前的解决方案。今天遇到一个ireport解决不了的要求——合并单元格。类似下面这样的表结构:
----------------------------------------------
| |__c_____________
dept | value |__b_____________
| | a
--------------------------------------------------------
也就是需要跨行,跨列!-_-。在html表格中解决这个很简单,只要设置单元格的colspan和rowspan即可。我在ireport没有找到解决方案,如果您知道,请不吝赐教。查找资料弄了两个小时没进展,决定自己用iText写吧,通过google、baidu资料顺利达到了我的要求,仅在此记录下遇到的问题和解决方法。
一。一个HelloWorld实例:
a.创建一个Document实例
Document document = new Document();
b.将Document实例和文件输出流用PdfWriter类绑定在一起
PdfWriter.getInstance(document,new FileOutputStream("HelloWorld.pdf"));
c.打开文档
document.open();
d.在文档中添加文字
document.add(new Paragraph("Hello World"));
e.关闭文档
document.close();
这样5个步骤,就可以生成一个PDF文档了。
二。如何使用jsp、servlet输出iText生成的pdf?
如果每次都在服务端生成一个PDF文件给用户,不仅麻烦,而且浪费服务器资源,最好的方法就是以二进制流的形式输送到客户端。
1)JSP输出:
2)servlet输出,稍微改造下就可以使用在struts中:
三。如何输出中文?
首先需要下载iTextAsian.jar包,可以到iText的主站上下,ireport也是需要这个包的。然后定义中文字体:
我将产生中文字体封装在方法内,自定义一个段落PDFParagraph继承自Paragraph,默认使用中文字体:
使用的时候就可以简化了:
四。如何设置PDF横向显示和打印?
五。如何设置跨行和跨列?
使用PdfPTable和PdfPCell 是没办法实现跨行的,只能跨列,要跨行使用com.lowagie.text.Table和com.lowagie.text.Cell类,Cell类有两个方法:setRowspan()和setColspan()。
六。如何设置单元格边界宽度?
Cell类的系列setBorderWidthXXXX()方法,比如setBorderWidthTop(),setBorderWidthRight()等
七。如何设置表头?
希望每一页都有表头,可以通过设置表头来实现。对于PdfPTable类来说,可以这样设置:
而对于om.lowagie.text.Table类,需要在添加完所有表头的单元格后加上一句代码:
八。如何设置列宽?
上面的代码设置了一个有8列的表格,通过一个float数组设置列宽,这里是百分比。
九。单元格内段落文字居中和换行?
居中通过Cell类来设置,一开始我以为设置段落对齐就可以了,没想到是需要设置单元格:
转义符\n实现。在我的这个应用中,因为数据库取出的数据是为了显示在html上的,所以有很多
标签,可以使用正则表达式替换成"\n"
十。如何显示页码?
复杂的页码显示和水印添加,需要使用到PdfPageEventHelper、PdfTemplate等辅助类,具体的例子参见iText的文档,如果只是为了简单的显示页数,可以使用下面的代码:
----------------------------------------------
| |__c_____________
dept | value |__b_____________
| | a
--------------------------------------------------------
也就是需要跨行,跨列!-_-。在html表格中解决这个很简单,只要设置单元格的colspan和rowspan即可。我在ireport没有找到解决方案,如果您知道,请不吝赐教。查找资料弄了两个小时没进展,决定自己用iText写吧,通过google、baidu资料顺利达到了我的要求,仅在此记录下遇到的问题和解决方法。
一。一个HelloWorld实例:
<!---->package com.lowagie.examples.general;
import java.io.FileOutputStream;
import java.io.IOException;
import com.lowagie.text.*;
import com.lowagie.text.pdf.PdfWriter;
/**
* Generates a simple 'Hello World' PDF file.
*
* @author blowagie
*/
public class HelloWorld {
/**
* Generates a PDF file with the text 'Hello World'
*
* @param args no arguments needed here
*/
public static void main(String[] args) {
System.out.println("Hello World");
// step a: creation of a document-object
Document document = new Document();
try {
// step b:
// we create a writer that listens to the document
// and directs a PDF-stream to a file
PdfWriter.getInstance(document,new FileOutputStream("HelloWorld.pdf"));
// step c: we open the document
document.open();
// step d: we add a paragraph to the document
document.add(new Paragraph("Hello World"));
} catch (DocumentException de) {
System.err.println(de.getMessage());
} catch (IOException ioe) {
System.err.println(ioe.getMessage());
}
// step e: we close the document
document.close();
}
}
可以看到一个PDF文件的输出,总共只需要5个步骤import java.io.FileOutputStream;
import java.io.IOException;
import com.lowagie.text.*;
import com.lowagie.text.pdf.PdfWriter;
/**
* Generates a simple 'Hello World' PDF file.
*
* @author blowagie
*/
public class HelloWorld {
/**
* Generates a PDF file with the text 'Hello World'
*
* @param args no arguments needed here
*/
public static void main(String[] args) {
System.out.println("Hello World");
// step a: creation of a document-object
Document document = new Document();
try {
// step b:
// we create a writer that listens to the document
// and directs a PDF-stream to a file
PdfWriter.getInstance(document,new FileOutputStream("HelloWorld.pdf"));
// step c: we open the document
document.open();
// step d: we add a paragraph to the document
document.add(new Paragraph("Hello World"));
} catch (DocumentException de) {
System.err.println(de.getMessage());
} catch (IOException ioe) {
System.err.println(ioe.getMessage());
}
// step e: we close the document
document.close();
}
}
a.创建一个Document实例
Document document = new Document();
b.将Document实例和文件输出流用PdfWriter类绑定在一起
PdfWriter.getInstance(document,new FileOutputStream("HelloWorld.pdf"));
c.打开文档
document.open();
d.在文档中添加文字
document.add(new Paragraph("Hello World"));
e.关闭文档
document.close();
这样5个步骤,就可以生成一个PDF文档了。
二。如何使用jsp、servlet输出iText生成的pdf?
如果每次都在服务端生成一个PDF文件给用户,不仅麻烦,而且浪费服务器资源,最好的方法就是以二进制流的形式输送到客户端。
1)JSP输出:
<!----><%@ page import="java.io.*,java.awt.Color,com.lowagie.text.*,com.lowagie.text.pdf.*"%>
<%
response.setContentType
( "application/pdf" );
Document document = new Document();
ByteArrayOutputStream buffer
= new ByteArrayOutputStream();
PdfWriter writer=
PdfWriter.getInstance( document, buffer );
document.open();
document.add(new Paragraph("Hello World"));
document.close();
DataOutput output =
new DataOutputStream
( response.getOutputStream() );
byte[] bytes = buffer.toByteArray();
response.setContentLength(bytes.length);
for( int i = 0;
i < bytes.length;
i++ )
{
output.writeByte( bytes[i] );
}
%>
<%
response.setContentType
( "application/pdf" );
Document document = new Document();
ByteArrayOutputStream buffer
= new ByteArrayOutputStream();
PdfWriter writer=
PdfWriter.getInstance( document, buffer );
document.open();
document.add(new Paragraph("Hello World"));
document.close();
DataOutput output =
new DataOutputStream
( response.getOutputStream() );
byte[] bytes = buffer.toByteArray();
response.setContentLength(bytes.length);
for( int i = 0;
i < bytes.length;
i++ )
{
output.writeByte( bytes[i] );
}
%>
2)servlet输出,稍微改造下就可以使用在struts中:
<!---->import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import com.lowagie.text.*;
import com.lowagie.text.pdf.*;
public void doGet
(HttpServletRequest request,
HttpServletResponse response)
throws IOException,ServletException
{
Document document =
new Document(PageSize.A4, 36,36,36,36);
ByteArrayOutputStream ba
= new ByteArrayOutputStream();
try
{
PdfWriter writer =
PdfWriter.getInstance(document, ba);
document.open();
document.add(new
Paragraph("Hello World"));
}
catch(DocumentException de)
{
de.printStackTrace();
System.err.println
("A Document error:" +de.getMessage());
}
document.close();
response.setContentType
("application/pdf");
response.setContentLength(ba.size());
ServletOutputStream out
= response.getOutputStream();
ba.writeTo(out);
out.flush();
}
import javax.servlet.*;
import javax.servlet.http.*;
import com.lowagie.text.*;
import com.lowagie.text.pdf.*;
public void doGet
(HttpServletRequest request,
HttpServletResponse response)
throws IOException,ServletException
{
Document document =
new Document(PageSize.A4, 36,36,36,36);
ByteArrayOutputStream ba
= new ByteArrayOutputStream();
try
{
PdfWriter writer =
PdfWriter.getInstance(document, ba);
document.open();
document.add(new
Paragraph("Hello World"));
}
catch(DocumentException de)
{
de.printStackTrace();
System.err.println
("A Document error:" +de.getMessage());
}
document.close();
response.setContentType
("application/pdf");
response.setContentLength(ba.size());
ServletOutputStream out
= response.getOutputStream();
ba.writeTo(out);
out.flush();
}
三。如何输出中文?
首先需要下载iTextAsian.jar包,可以到iText的主站上下,ireport也是需要这个包的。然后定义中文字体:
<!----> private static final Font getChineseFont() {
Font FontChinese = null;
try {
BaseFont bfChinese = BaseFont.createFont("STSong-Light",
"UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
FontChinese = new Font(bfChinese, 12, Font.NORMAL);
} catch (DocumentException de) {
System.err.println(de.getMessage());
} catch (IOException ioe) {
System.err.println(ioe.getMessage());
}
return FontChinese;
}
Font FontChinese = null;
try {
BaseFont bfChinese = BaseFont.createFont("STSong-Light",
"UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
FontChinese = new Font(bfChinese, 12, Font.NORMAL);
} catch (DocumentException de) {
System.err.println(de.getMessage());
} catch (IOException ioe) {
System.err.println(ioe.getMessage());
}
return FontChinese;
}
我将产生中文字体封装在方法内,自定义一个段落PDFParagraph继承自Paragraph,默认使用中文字体:
<!---->class PDFParagraph extends Paragraph {
public PDFParagraph(String content) {
super(content, getChineseFont());
}
}
public PDFParagraph(String content) {
super(content, getChineseFont());
}
}
使用的时候就可以简化了:
<!---->Paragraph par = new PDFParagraph("你好");
四。如何设置PDF横向显示和打印?
<!---->Rectangle rectPageSize = new Rectangle(PageSize.A4);// 定义A4页面大小
rectPageSize = rectPageSize.rotate();// 加上这句可以实现A4页面的横置
Document doc = new Document(rectPageSize,50,50,50,50);//4个参数,设置了页面的4个边距
rectPageSize = rectPageSize.rotate();// 加上这句可以实现A4页面的横置
Document doc = new Document(rectPageSize,50,50,50,50);//4个参数,设置了页面的4个边距
五。如何设置跨行和跨列?
使用PdfPTable和PdfPCell 是没办法实现跨行的,只能跨列,要跨行使用com.lowagie.text.Table和com.lowagie.text.Cell类,Cell类有两个方法:setRowspan()和setColspan()。
六。如何设置单元格边界宽度?
Cell类的系列setBorderWidthXXXX()方法,比如setBorderWidthTop(),setBorderWidthRight()等
七。如何设置表头?
希望每一页都有表头,可以通过设置表头来实现。对于PdfPTable类来说,可以这样设置:
<!---->PdfPTable table = new PdfPTable(3);
table.setHeaderRows(2); // 设置了头两行为表格头
table.setHeaderRows(2); // 设置了头两行为表格头
而对于om.lowagie.text.Table类,需要在添加完所有表头的单元格后加上一句代码:
<!---->table.endHeaders();
八。如何设置列宽?
<!---->Table table = new Table(8);
float[] widths = { 0.10f, 0.15f, 0.21f, 0.22f, 0.08f, 0.08f, 0.10f,
0.06f };
table.setWidths(widths);
float[] widths = { 0.10f, 0.15f, 0.21f, 0.22f, 0.08f, 0.08f, 0.10f,
0.06f };
table.setWidths(widths);
上面的代码设置了一个有8列的表格,通过一个float数组设置列宽,这里是百分比。
九。单元格内段落文字居中和换行?
居中通过Cell类来设置,一开始我以为设置段落对齐就可以了,没想到是需要设置单元格:
<!---->cell.setHorizontalAlignment(Element.ALIGN_CENTER);
转义符\n实现。在我的这个应用中,因为数据库取出的数据是为了显示在html上的,所以有很多
标签,可以使用正则表达式替换成"\n"
<!----> "
1.测试
2.测试2".replaceAll("
|
","\n");
1.测试
2.测试2".replaceAll("
|
","\n");
十。如何显示页码?
复杂的页码显示和水印添加,需要使用到PdfPageEventHelper、PdfTemplate等辅助类,具体的例子参见iText的文档,如果只是为了简单的显示页数,可以使用下面的代码:
<!----> HeaderFooter footer = new HeaderFooter(new Phrase("页码:",getChineseFont()), true);
footer.setBorder(Rectangle.NO_BORDER);
document.setFooter(footer);
document.open();
你可能注意到了,添加footer需要在document.open之前。footer.setBorder(Rectangle.NO_BORDER);
document.setFooter(footer);
document.open();
发表评论
-
memcached分布测试报告(一致性哈希情况下的散列函数选择)
2009-03-10 16:30 8546一、背景资料 memcached本身是集中式的缓存系统 ... -
xmemcached 0.60 优化过程
2009-03-06 14:37 3523充分利用jprofile等 ... -
Xmemcached vs Spymemcached 3th(linux下测试结果和多节点下表现)
2009-03-07 10:43 4882翠花,上图,首先是容器类和自定义对象的get、set在不同并发 ... -
xmemcached发布1.0-BETA版
2009-03-09 15:32 4121xmemcached 发布1.0-beta ,从0.6 ... -
山寨nio框架yanf4j发布0.50-alpha
2009-02-04 19:28 4223俺的山寨nio框架yanf4j发布0.50-alpha版本,下 ... -
yanf4j引入了客户端非阻塞API
2009-02-19 00:15 3118yanf4j 发布一个0.50-beta2 版本,这个版本最 ... -
基于java nio的memcached客户端——xmemcached
2009-03-03 16:31 74761、xmemcached是什么? xmemcached是基于 ... -
使用yanf4j写个简单聊天室
2008-11-26 11:36 5399yanf4j 简介,请看这里 ... -
Java字符串的最大长度
2009-01-15 01:37 7585在cpp中为了可移植性,s ... -
yanf4j-0.41 beta发布
2009-01-20 14:01 1866项目名称:yanf4j (yet another nio fr ... -
再谈Selector的wakeup方法
2009-02-01 11:15 3052过去推荐过两篇blog《Java NIO类库Selector机 ... -
Yet another nio framework for java
2008-10-11 14:25 2047项目名称:Yanf4j(Yet another nio fra ... -
阻塞队列的性能对比
2008-09-08 10:06 5746阻塞队列的性能对 ... -
java package的设计原则
2008-09-06 00:15 2118典型的J2EE项目,package的设计有成熟的套路可 ... -
线程池池
2008-09-01 19:39 1998这个题目比较怪,听俺道来。俺一直在负责公司游戏服 ... -
第一个MapReduce任务
2008-08-23 11:10 2784前两天在公司内网上搭了个2个节点hadoop集群, ... -
从HDFS看分布式文件系统的设计需求
2008-08-15 22:39 8119分布式文件系统的 ... -
HDFS用户指南(翻译)
2008-08-14 20:27 2141HDFS用户指南 原文地址:http:/ ... -
Ehcache配置的overflowToDisk属性
2008-08-06 23:18 10838Ehcache的overflowToDisk属性用来配 ... -
工作的几个tip
2008-07-07 20:47 28861、如果用java6的ScriptEngineManager ...
相关推荐
这篇博客"利用iText操作PDF从数据库导出大量数据--汇总(一)"显然讨论了如何利用iText将数据库中的数据高效地导出到PDF文件中,这对于报告生成、数据分析或者报表制作等场景非常有用。 首先,我们需要了解iText的...
总结来说,iTextPDF是Java开发中不可或缺的PDF处理工具,它通过强大的HTML、XML和Web表单转换能力,以及丰富的PDF操作接口,极大地拓展了PDF的应用领域。无论是简单的数据输出,还是复杂的报表生成,甚至是安全的...
在Java世界中,Itext 是一个广泛使用的库,它允许开发者创建、修改和操作PDF文档。这篇博客 "freemarker+itext生成PDF" 可能详细介绍了如何结合这两者来生成PDF文件,这在报表生成、发票打印或任何需要静态化输出的...
- `kernel`:这是Itext的核心模块,提供了基本的PDF文档操作功能,如创建、打开、修改PDF文档,以及添加文本、图像和表格等元素。 2. **布局模块**: - `layout`:此模块提供了高级布局功能,使得开发者能够更...
总结一下,要实现在Spring Boot应用中使用iText生成带有页眉、页码、水印、目录和二维码的PDF,你需要: 1. 引入iText及相关库。 2. 创建HTML页面并将其转换为PDF。 3. 定制PDF内容,包括添加页眉、页码和水印。 4. ...
总结,iText库结合正确的证书和相关的jar包,为开发者提供了一种强大且灵活的方式,实现了PDF文档的生成和安全签章。通过理解这些概念和技术,你可以在项目中构建安全、可靠的PDF文档处理流程。
iText是一个强大的PDF库,它允许开发者在程序中创建、修改和操作PDF文档。然而,对于处理中文字符,iText需要额外的字体文件支持,因为默认的字体库不包含中文字符集。本教程将深入探讨如何在Java中使用iText PDF...
总结来说,iTextPDF 5.5.5是一个功能强大的PDF处理库,它简化了PDF文档的创建过程,同时提供了丰富的定制化选项,满足了各种复杂的PDF需求。结合`jxl.jar`库,开发者还可以方便地处理Excel数据并将其转换为PDF格式,...
标题 "利用itext操作pdf从数据库导出大量数据--功能汇总(一)" 提到的是一个关于使用iText库在Java环境中操作PDF文档,并从数据库中导出大量数据的实践教程。iText是一个流行的开源Java库,专门用于创建、修改和...
根据提供的文件信息,我们可以深入探讨如何使用iText库在Java环境中进行PDF文件的合并与拆分操作。以下是对这些操作的详细解释。 ### iText简介 iText 是一个开源库,用于生成、修改以及处理PDF文件。它支持多种...
在使用iText操作PDF的过程中,掌握它提供的各种高级功能,比如PDF文档的合并、拆分、注释添加、表单处理等,都是非常有价值的。但对于初学者而言,理解如何使用iText创建包含表格、条形码和图片的文档是学习iText库...
而iText是一款开源的Java库,它允许开发者轻松地创建、修改和操作PDF文档。在本篇中,我们将深入探讨如何使用iText库来生成PDF文件,以及相关的源码和工具应用。 首先,我们需要引入iText库的相关依赖。在提供的...
总结来说,这个压缩包提供了iText库的最新稳定版本,结合其亚洲语言支持扩展,使得Java开发者能够方便地创建和处理包含中文的PDF文档,无论是从头新建还是修改已有的PDF,都能得心应手。对于需要处理中文PDF的企业和...
按钮用于触发PDF导出操作,文本框用于输入或显示要导出的数据。在代码-behind文件中,为按钮的Click事件添加处理程序: ```csharp private void btnExport_Click(object sender, EventArgs e) { string pdfContent...
总结,iTextPDF 5.5.5是一个强大的PDF处理工具,无论是在企业级应用还是个人项目中,都能发挥重要作用。通过熟练掌握其API和使用技巧,开发者可以高效地创建专业且富有表现力的PDF文档,满足多样化的业务需求。
总结来说,iText库为Java开发者提供了一个强大的工具,使得PDF文件的创建和操作变得相对简单和直观。通过阅读和理解本篇小例子,开发者可以掌握使用iText进行PDF文档导出的基础知识,进而在实际项目中灵活运用。对于...
总结,iText 5.4.0 是一个强大且全面的PDF处理库,适合用于各种Java项目中生成、编辑和管理PDF文档。它的易用性和灵活性使其成为开发者手中的得力工具,无论是简单的PDF生成还是复杂的PDF操作,都能轻松应对。通过...
《Java操作PDF文档:iTextPDF 5.4.3详解》 在信息化时代,PDF(Portable Document Format)因其跨平台、格式保真等特性,成为广泛应用的文档格式。Java作为一门广泛使用的编程语言,自然也需要处理PDF文档的能力。...
iText是一款强大的PDF库,主要...总结,iText是JAVA开发中不可或缺的PDF处理工具,其强大功能和易用性使其成为报表打印和文档生成的理想选择。通过不断学习和实践,你将能够熟练运用iText解决实际问题,提高项目效率。
总结来说,IText是Java中一个强大且灵活的PDF生成库,通过它可以轻松地创建包含文字、图片和表格的PDF文档。通过理解并实践提供的Demo,你将能够熟练地运用IText进行PDF的生成工作。记住,持续学习和更新库的版本以...