利用iText包实现Java报表打印
java使用IText将数据导出为pdf文件(数据为excel表格样式)
java使⽤IText将数据导出为pdf⽂件(数据为excel表格样式)1.pom.xml导⼊使⽤的jar包<dependency><groupId>com.itextpdf</groupId><artifactId>itext-pdfa</artifactId><version>5.5.0</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency>2.直接上代码(数据导出为pdf⽂件,数据呈现样式为⾃定义excel表格样式,⽀持多页展⽰)public class DataToPdf {public static final String DEST = "pdf/tables.pdf";public static void main(String[] args) throws IOException, DocumentException {File file = new File(DEST);file.getParentFile().mkdirs();new DataToPdf().dataToPdf(DEST);}/*** 数据转pdf* @param dest* @throws IOException* @throws DocumentException*/public void dataToPdf(String dest) throws IOException, DocumentException {Document document = new Document();PdfWriter.getInstance(document, new FileOutputStream(dest));document.open();// 使⽤语⾔包字体BaseFont abf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);//字体Font font = new Font(abf, 8);//段落Paragraph p = new Paragraph("测试结算单", new Font(abf, 12, Font.BOLD));p.setAlignment(Paragraph.ALIGN_CENTER);document.add(p);//表格PdfPTable table = new PdfPTable(8);//numcolumns:列数table.setSpacingBefore(16f);//表格与上⾯段落的空隙//表格列创建并赋值PdfPCell cell = new PdfPCell(new Phrase("单位名称:测试有限公司", font));cell.setHorizontalAlignment(Element.ALIGN_LEFT);//居中cell.disableBorderSide(13);//去除左右上边框,保留下边框cell.setColspan(4);//合并列数table.addCell(cell);cell = new PdfPCell(new Phrase("⽇期:2020-06-05", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);cell.disableBorderSide(13);cell.setColspan(3);table.addCell(cell);cell = new PdfPCell(new Phrase("单位(元)", font));cell.setHorizontalAlignment(Element.ALIGN_LEFT);cell.disableBorderSide(13);cell.setColspan(1);table.addCell(cell);//⾸⾏cell = new PdfPCell(new Phrase("期间", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);cell.setColspan(2);table.addCell(cell);cell = new PdfPCell(new Phrase("⽉份", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("分类", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("年利率", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("⽇利率", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("基数", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("利息", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("起始⽇:2020-03-26\n" +"结束⽇:2020-04-25", font));cell.setPadding(16f);cell.setVerticalAlignment(Element.ALIGN_CENTER);cell.setHorizontalAlignment(Element.ALIGN_CENTER);cell.setRowspan(3);cell.setColspan(2);table.addCell(cell);cell = new PdfPCell(new Phrase("4", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("10598164.91", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("325.01", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("4", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("资⾦", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("1.10%", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("0.000031", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("-", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("-", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("4", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("资⾦", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("1.10%", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("0.000031", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("-", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("-", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("合计", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);cell.setColspan(7);table.addCell(cell);cell = new PdfPCell(new Phrase("325.01", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("会计制单:", font));cell.setHorizontalAlignment(Element.ALIGN_LEFT);cell.disableBorderSide(14);cell.setColspan(4);table.addCell(cell);cell = new PdfPCell(new Phrase("复核:", font));cell.setHorizontalAlignment(Element.ALIGN_LEFT);cell.disableBorderSide(14);cell.setColspan(4);table.addCell(cell);table.setSpacingBefore(16f);document.add(table);//下⼀页document.newPage();//段落Paragraph p1 = new Paragraph("下⼀页测试结算单", new Font(abf, 12, Font.BOLD)); p1.setAlignment(Paragraph.ALIGN_CENTER);document.add(p1);//表格table = new PdfPTable(8);//numcolumns:列数table.setSpacingBefore(16f);//表格与上⾯段落的空隙//表格列创建并赋值cell = new PdfPCell(new Phrase("单位名称:测试有限公司", font));cell.setHorizontalAlignment(Element.ALIGN_LEFT);//居中cell.disableBorderSide(13);//去除左右上边框,保留下边框cell.setColspan(4);//合并列数table.addCell(cell);cell = new PdfPCell(new Phrase("⽇期:2020-06-05", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);cell.disableBorderSide(13);cell.setColspan(3);table.addCell(cell);cell = new PdfPCell(new Phrase("单位(元)", font));cell.setHorizontalAlignment(Element.ALIGN_LEFT);cell.disableBorderSide(13);cell.setColspan(1);table.addCell(cell);//⾸⾏cell = new PdfPCell(new Phrase("期间", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);cell.setColspan(2);cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("⽇利率", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("基数", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("利息", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("起始⽇:2020-04-26\n" +"结束⽇:2020-05-25", font));cell.setPadding(16f);cell.setVerticalAlignment(Element.ALIGN_CENTER);cell.setHorizontalAlignment(Element.ALIGN_CENTER);cell.setColspan(2);table.addCell(cell);cell = new PdfPCell(new Phrase("4", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("资⾦", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("1.10%", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("0.000031", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("10598164.91", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("325.01", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("合计", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);cell.setColspan(7);table.addCell(cell);cell = new PdfPCell(new Phrase("325.01", font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);cell = new PdfPCell(new Phrase("会计制单:", font));cell.setHorizontalAlignment(Element.ALIGN_LEFT);cell.disableBorderSide(14);cell.setColspan(4);table.addCell(cell);cell = new PdfPCell(new Phrase("复核:", font));cell.setHorizontalAlignment(Element.ALIGN_LEFT);cell.disableBorderSide(14);cell.setColspan(4);table.addCell(cell);table.setSpacingBefore(16f);document.add(table);document.close();}}3.上述代码中对于IText字体设置可改:使⽤iText中的字体例:BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);使⽤Windows系统⾃带的字体例:BaseFont.createFont("C:/WINDOWS/Fonts/SIMYOU.TTF", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED); 使⽤外部引⼊的资源字体(例:BaseFont.createFont("/SIMYOU.TTF", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);4.上述代码⽣成的表格边框隐藏⽅式:1:代表上边框2:代表下边框4:代表左边框8:代表右边框//需要隐藏那些边框就把对应的值加起来,得到的和就是要设置的值//⽐如要隐藏左右边框就是 4+8=12cell.disableBorderSide(12);//左右没了具体例⼦://隐藏上边框cell.disableBorderSide(1);//隐藏下边框cell.disableBorderSide(2);//隐藏左、上边框cell.disableBorderSide(5);//隐藏左、下边框cell.disableBorderSide(6);//隐藏左、上、下边框cell.disableBorderSide(7);//隐藏右边框cell.disableBorderSide(8);//隐藏右、上边框cell.disableBorderSide(9);//隐藏右、下边框cell.disableBorderSide(10);//隐藏右、上、下边框cell.disableBorderSide(11);//隐藏左、右边框cell.disableBorderSide(12);//左右没了 //隐藏上、左、右边框cell.disableBorderSide(13);//只剩下 //隐藏下、左、右边框cell.disableBorderSide(14);//只剩上//隐藏全部cell.disableBorderSide(15);//全没了5.运⾏展⽰效果例:。
在ASP.Net中利用iTextSharp实现报表输出功能
来 存 放 我们 系 统 已经 生 成 的 P DF文 档 , 项 目 “ y p” 再 在 M Ap 中
理 系统实现报表输 出功能是个可行的思路。来 自第三方的开源组件 i x#可 以很好地实现 P Tet DF文件的 生成 . 用
iet 够很 方便 地 制 作 出精 美 的 P T x#能 DF报表 文件 , 过 实例 对 i x# 的应 用 方 法进 行 了讲 解 。 通 Tet
【 关冀词】 信息管理系统 A P E 报表 P F文档 iet S. T N D Tx≠ ≠
实 现精 美报 表 输 出 的办 法 。 经 过 各种 尝试 , 最 终 选 择 了可 以 我 精 确控 制 P DF报表 输 出 的第 三 方 组 件 i x#。 在这 里 简 单 介 Te t
绍 一 下 ie t T x #是 如 何 实 现 报 表 输 出 功 能 的 。
usng i i Tex Shar t xtpdf t p.e . ;
新 建~ 个 文 件 夹 , 名 为 i g s 用 来 存 放我 们 准 备 好 的 图 像 命 ma e ,
素 材 ,在 本 实 例 中 我 们 放 入 一 个 i 1Jg文 件 , 分 辨 率 为 mO . P
400 X 2 30。
第 五 , 加一个新 的 We 添 b窗 体 , 名 为 rn.s x, rn 命 u ap 在 u .
Do u c me t d c m e t= n w c me t ( a e z A4 0 n o u n e Do u n P g Si e. ,3
Java使用itext5实现PDF表格文档导出
Java使⽤itext5实现PDF表格⽂档导出最近拿到⼀个需求,需要导出PDF⽂档,市⾯上可以实现的⽅法有很多,经过测试和调研决定使⽤itext5来实现,话不多说,说⼲就⼲。
1.依赖导⼊<!-- https:///artifact/com.itextpdf/itextpdf --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.1</version></dependency><!-- https:///artifact/com.itextpdf/itext-asian --><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency>这⾥说明下:上⾯的依赖就是主要实现PDF⽣成的,下⾯的依赖是中⽂字体相关依赖;2.PDF表格导出实现1.导出PDF// 1.打开⽂档并设置基本属性Document document = new Document();// 2.设置请求头,encode⽂件名response.setContentType("application/pdf;charset=UTF-8");response.setHeader("Content-Disposition","attachment; filename=" + .URLEncoder.encode("" +recordDto.getTitle() + ".pdf", "UTF-8"));// 3.通过流将pdf实例写出到浏览器PdfWriter writer = PdfWriter.getInstance(document, response.getOutputStream());⾄此导出PDF已经实现了,只是这个PDF中什么内容都没有,明⽩这⼀点,接下来做的就是给这个⽂档“加料”咯(这⾥的response就是HttpServletResponse)。
java使用IText生成表格到PDF中
1.生成pdf的表格package com.me.test;import java.awt.Color;import java.io.FileOutputStream;import com.lowagie.text.Cell;import com.lowagie.text.Document;import com.lowagie.text.Element;import com.lowagie.text.Font;import com.lowagie.text.PageSize;import com.lowagie.text.Paragraph;import com.lowagie.text.Table;import com.lowagie.text.pdf.BaseFont;import com.lowagie.text.pdf.PdfWriter;/*** 生成表格到硬盘** @author admin**/public class ITextTest {public void getTable(){try {Document document = new Document(PageSize.A4, 20, 20, 20, 20);PdfWriter writer = PdfWriter.getInstance(document,new FileOutputStream(";f:/IText/table.pdf";));document.open();BaseFont bfChinese;bfChinese = BaseFont.createFont(";STSong-Light";, ";UniGB-UCS2-H";,false);Font fontChinese = new Font(bfChinese, 9, Font.BOLD, Color.black);Table t = new Table(12, 2);// t.setBorderColor(new Color(220, 255, 100));int width[] = { 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, };t.setWidths(width);t.setWidth(100); // 占页面宽度 %t.setPadding(1);t.setSpacing(0);t.setBorderWidth(2);Cell c1 = new Cell(";header1";);t.addCell(c1);c1 = new Cell(";Header2";);t.addCell(c1);c1 = new Cell(";Header3";);t.addCell(c1);c1 = new Cell(";Header4";);t.addCell(c1);c1 = new Cell(";Header5";);t.addCell(c1);c1 = new Cell(";Header6";);t.addCell(c1);c1 = new Cell(";Header7";);t.addCell(c1);c1 = new Cell(";Header8";);t.addCell(c1);c1 = new Cell(";Header9";);t.addCell(c1);c1 = new Cell(";Header10";);t.addCell(c1);c1 = new Cell(";Header11";);t.addCell(c1);c1 = new Cell(";Header12";);t.addCell(c1);int k = 0;while (k <; 3) {for (int q = 0; q <; 12; q++) {Paragraph par = new Paragraph(k + ";-"; + q, fontChinese);c1 = new Cell(par);c1.setHorizontalAlignment(Element.ALIGN_CENTER);t.addCell(c1);}k++;}for (int i = 0; i <; 24; i++) {String num = Integer.toString(i);c1.setHorizontalAlignment(Element.ALIGN_CENTER);c1 = new Cell(num);c1.setColspan(2);c1.setRowspan(1);t.addCell(c1);}c1 = new Cell(";26";);t.addCell(c1);document.add(t);// 创建一个新页面document.newPage();document.add(t);document.close();} catch (Exception e2) {e2.printStackTrace();}}}2.将网页中的信息,用pdf格式文件弹出package com.me.test;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.OutputStream;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.itextpdf.text.Document;import com.itextpdf.text.DocumentException;import com.itextpdf.text.Paragraph;import com.itextpdf.text.pdf.PdfWriter;/*** 在网页上获取信息,查看pdf格式文件* @author admin**/public class PdfServlet extends HttpServlet {/*** @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)*/protected void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {try {// Get the text that will be added to the PDFString text = request.getParameter(";text";);if (text == null || text.trim().length() == 0) {text = ";You didn't enter any text.";;}// step 1Document document = new Document();// step 2ByteArrayOutputStream baos = new ByteArrayOutputStream();PdfWriter.getInstance(document, baos);// step 3document.open();// step 4document.add(new Paragraph(String.format(";You have submitted the following text using the %s method:";, request.getMethod())));document.add(new Paragraph(text));// step 5document.close();// setting some response headersresponse.setHeader(";Expires";, ";0";);response.setHeader(";Cache-Control";,";must-revalidate, post-check=0, pre-check=0";);response.setHeader(";Pragma";, ";public";);// setting the content typeresponse.setContentType(";application/pdf";);// the contentlengthresponse.setContentLength(baos.size());// write ByteArrayOutputStream to the ServletOutputStreamOutputStream os = response.getOutputStream();baos.writeTo(os);os.flush();os.close();}catch(DocumentException e) {throw new IOException(e.getMessage());}}/*** Serial version UID.*/private static final long serialVersionUID = 6067021675155015602L; }3.在网页上直接以pdf的形式显示package com.me.test;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.lowagie.text.Document;import com.lowagie.text.DocumentException;import com.lowagie.text.pdf.PdfWriter;import com.lowagie.text.Element;import com.lowagie.text.PageSize;import com.lowagie.text.pdf.PdfPTable;/*** 直接在网页中生成PDF格式查看*//*** Hello World example as a Servlet.** @author blowagie*/public class HelloWorldServlet extends HttpServlet {/****/private static final long serialVersionUID = 3710911016238241119L;/*** Returns a PDF, RTF or HTML document.** @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)*/public void doGet (HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {System.out.println(";document.add(BigTable)";);// step1Document document = new Document(PageSize.A4.rotate(), 10, 10, 10, 10); //定义纸张类型及方向,页边距// step 1try {// step 2: we set the ContentType and create an instance of the corresponding Writerresponse.setContentType(";application/pdf";);PdfWriter.getInstance(document, response.getOutputStream());// step3document.open();// step4 定义表格填充内容String[] bogusData = { ";M0065920";, ";SL";, ";FR86000P";, ";PCGOLD";,";119000";, ";96 06";, ";2001-08-13";, ";4350";, ";6011648299";,";FLFLMTGP";, ";153";, ";119000.00"; };int NumColumns = 12; //定义表格列数PdfPTable datatable = new PdfPTable(NumColumns); //创建新表.int headerwidths[] = { 9, 4, 8, 10, 8, 11, 9, 7, 9, 10, 4, 10 }; // percentage 定义表格头宽度datatable.setWidths(headerwidths);datatable.setWidthPercentage(100); // percentagedatatable.getDefaultCell().setPadding(3);datatable.getDefaultCell().setBorderWidth(2);datatable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);//以下是填充表头datatable.addCell(";Clock #";);datatable.addCell(";Trans Type";);datatable.addCell(";Cusip";);datatable.addCell(";Long Name";);datatable.addCell(";Quantity";);datatable.addCell(";Fraction Price";);datatable.addCell(";Settle Date";);datatable.addCell(";Portfolio";);datatable.addCell(";ADP Number";);datatable.addCell(";Account ID";);datatable.addCell(";Reg Rep ID";);datatable.addCell(";Amt To Go ";);datatable.setHeaderRows(1); // this is the end of the table headerdatatable.getDefaultCell().setBorderWidth(1);for (int i = 1; i <; 750; i++) {if (i % 2 == 1) {datatable.getDefaultCell().setGrayFill(0.9f);}for (int x = 0; x <; NumColumns; x++) {datatable.addCell(bogusData[x]);}if (i % 2 == 1) {datatable.getDefaultCell().setGrayFill(0.0f);}}document.add(datatable); //加载新表}catch(DocumentException de) {de.printStackTrace();System.err.println(";document: "; + de.getMessage());}// step 5: we close the document (the outputstream is also closed internally) document.close();}}4.生成PDF到计算机中package com.me.test;import java.awt.*;import java.io.*;import com.lowagie.text.*;import com.lowagie.text.Font;import com.lowagie.text.Image;import com.lowagie.text.Rectangle;import com.lowagie.text.pdf.BaseFont;import com.lowagie.text.pdf.PdfContentByte;import com.lowagie.text.pdf.PdfReader;import com.lowagie.text.pdf.PdfWriter;/*** 通过给定的短语生成pdf文件,并且加密*//*** First iText example: Hello World.*/public class HelloWorld {/** Path to the resulting PDF file. */public static final String RESULT = ";f:/hello.pdf";;public static final String pwd = ";123456";;public static final String result = ";f:/Itext/b.gif";;/*** Creates a PDF file: hello.pdf** @param args* no arguments needed*/public static void main(String[] args) throws DocumentException, IOException {new HelloWorld().createPdf(RESULT);}/*** Creates a PDF document.** @param filename* the path to the new PDF document* @throws DocumentException* @throws IOException*/public void createPdf(String filename) throws DocumentException, IOException {// 设定文本样式Rectangle rec = new Rectangle(PageSize.A4);rec.setBackgroundColor(Color.GRAY);rec.setBorder(Rectangle.TOP);rec.setBorderColor(Color.black);rec.setBorderWidth(50);// 创建本文Document doc = new Document(rec, 100, 201, 20, 20);// 设定路径PdfWriter pdf = PdfWriter.getInstance(doc, new FileOutputStream(HelloWorld.RESULT));// 设定布局pdf.setViewerPreferences(PdfWriter.PageModeUseThumbs| PdfWriter.PageLayoutTwoColumnLeft | PdfWriter.HideMenubar);// 加密pdf.setEncryption(pwd.getBytes(), pwd.getBytes(), PdfWriter.ALLOW_COPY | PdfWriter.ALLOW_PRINTING, PdfWriter.STANDARD_ENCRYPTION_40);// 设置中文BaseFont base = null;Font fontChinese = null;try {base = BaseFont.createFont(";STSong-Light";, ";UniGB-UCS2-H";,BaseFont.EMBEDDED);fontChinese = new Font(base, 18, Font.BOLD);} catch (DocumentException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}doc.open();doc.add(new Paragraph(";你好我是Pro";, fontChinese));doc.close();}}。
iText 生成 PDF (java)
iText 生成PDF (java)标签:itextpdfit 分类:java技术文档public class BL {***// private String rgtno = "580401000130";private SSRS ssrsRgtno = new SSRS();// rgtno 赔案号,grpcontno 团体保单号,grpname// 投保单位,endcasedate 结案日期private SSRS ssrsCustomerno = new SSRS();// customerno客户号private SSRS ssrsIdno = new SSRS();// idno 证件号,bankcode 银行编码,bankaccno// 账号,accname 户名private SSRS ssrsOpt = new SSRS();// 门诊医疗费用理算信息:private SSRS ssrsHos = new SSRS();// 住院医疗费用理算信息:private SSRS ssrsBirth = new SSRS();// 生育医疗费用理算信息:private SSRS sumSsrsOpt = new SSRS();// 门诊医疗费用理算信息:总计private SSRS sumSsrsHos = new SSRS();// 住院医疗费用理算信息:总计private SSRS sumSsrsBirth = new SSRS();// 生育医疗费用理算信息:总计public boolean batchPrint() throws DocumentException, IOException {String rgtno = "580401000130";String rgtno2 = "580401000131";String rgtno3 = "580501000012";ArrayList rgtnoList = new ArrayList();rgtnoList.add(rgtno);rgtnoList.add(rgtno2);rgtnoList.add(rgtno3);Document document = new Document(PageSize.A4, 10, 10, 60, 20);// 参数:第一个是页面大小;接下来是左右上下边距;try {// // 生成名为xxx的文档PdfWriter.getInstance(document, new FileOutputStream("D:\\ITextTest.pdf"));BaseFont bfChinese = BaseFont.createFont("STSongStd-Light","UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);Color colorGray = new Color(217, 217, 217);Color colorBlack = new Color(0, 0, 0);Font titleFont = new Font(bfChinese, 21, Font.BOLD, colorBlack);Font infoFont = new Font(bfChinese, 11, Font.NORMAL, colorBlack);Font infoLittleNormal = new Font(bfChinese, 10, Font.NORMAL,colorBlack);Font infoLittleBold = new Font(bfChinese, 10, Font.BOLD, colorBlack);document.open();for (int i = 0; i < rgtnoList.size(); i++) {String rgtn22o =rgtnoList.get(i).toString();// 查询数据selectData(rgtn22o);// 打开文档,将要写入内容document.newPage();// 插入图片:可以是绝对路径,也可以是URL// String path = "D:\\tkyl.bmp";String path = getClass().getProtectionDomain().getCodeSource().getLocation().getPath();if (path.indexOf( "newlisnew") > 0) {path = path.substring(0, path.indexOf( "/newlisnew/") + 11);}path = path + "ui\\common\\images\\tkyl.bmp";// String path = "D:\\tkyl.bmp";printImage(document, path);// 打印PDF头部信息printHead(document, titleFont, infoFont);// 打印空白表格printBlank(document, titleFont);printInfoTable(document, infoFont);// 门诊医疗费用理算信息String strOpt = " 门诊医疗费用理算信息";// 门诊医疗费用理算信息,表头printInfoTable(document, strOpt, infoLittleBold,infoLittleNormal, colorGray, ssrsOpt, sumSsrsOpt);// 住院医疗费用理算信息String strHos = " 住院医疗费用理算信息";// 门诊医疗费用理算信息,表头printInfoTable(document, strHos, infoLittleBold,infoLittleNormal, colorGray, ssrsHos, sumSsrsHos);// 生育医疗费用理算信息String strBirth = " 生育医疗费用理算信息";// 门诊医疗费用理算信息,表头printInfoTable(document, strBirth, infoLittleBold,infoLittleNormal, colorGray, ssrsBirth, sumSsrsBirth);// 打印PDF结尾部分printEndInfoTable(document, infoFont, colorGray);}} catch (DocumentException de) {System.err.println(de.getMessage());} catch (IOException ioe) {System.err.println(ioe.getMessage());}document.close();return true;}public void setAlignment(PdfPCell pdfPCell, int verticalAlign,int horizontalAlign) {if (verticalAlign == Element.ALIGN_MIDDLE) {pdfPCell.setVerticalAlignment(Element.ALIGN_MIDDLE);// 垂直居中} else if (verticalAlign == Element.ALIGN_TOP) {pdfPCell.setVerticalAlignment(Element.ALIGN_TOP);// 垂直上居中} else if (verticalAlign == Element.ALIGN_BOTTOM) {pdfPCell.setVerticalAlignment(Element.ALIGN_BOTTOM);// 垂直下居中}if (horizontalAlign == Element.ALIGN_CENTER) {pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);// 水平居中} else if (horizontalAlign == Element.ALIGN_LEFT) {pdfPCell.setHorizontalAlignment(Element.ALIGN_LEFT);// 水平左居中} else if (horizontalAlign == Element.ALIGN_RIGHT) {pdfPCell.setHorizontalAlignment(Element.ALIGN_RIGHT);// 水平右居中}}public void setOptInfoStyle(PdfPCell pdfPCell) {setDisableBorder(pdfPCell, 0, 0, 4, 8);// 上下边框显示,左右边框不显示。
iTextSharp做C#的PDF打印和下载
基于iTextSharp的PDF操作(PDF打印,PDF下载)准备1. iTextSharp的简介iTextSharp是一个移植于java平台的iText项目,被封装成c#的组件来用于C#生成PDF 文档,目前,也有不少操作PDF的类库,(国产的有福盺的,免费试用,用于商业用途收费)但是功能普遍没有iText强大,而且使用没有iText广泛。
还有他就是开源的。
目前比较新的是5.5版本的。
2. 使用工具硬件:PC机:一台软件:Windows操作系统Isual studio 2013 (可以是任意版本).Net frameWork 4.5 (可以是任意版本)iTextSharp 5.5 可以到官网下载(iTextSharp)/projects/itextsharp/下载后,解压得到iTextSharp.dll文件基本知识1. 主要对象1).Document 对象:Document 对象主要用于操作页面的大小,就是页面的尺寸。
页面的尺寸一般有以下几种:A0-A10, LEGAL, LETTER, HALFLETTER, _11x17, LEDGER, NOTE, B0-B5, ARCH_A-ARCH_E, FLSA 和 FLSE,例如,需要创建一个A4纸张大小的PDF文档:Document document = new Document(PageSize.A4);这个文档漠然是纵向的,如果满足不了你横向文档的需要,可以加上rotate属性。
有的时候,我们需要生成特定颜色的,特定大小的PDF文档,可以使用下面的方法Rectangle pageSize = new Rectangle(120, 520); //120*520规格pageSize.BackgroundColor = new Color(0xFF, 0xFF, 0xDE); //背景色Document document = new Document(pageSize); //新建Documen对象页边距:Document document = new Document(PageSize.A5, 36, 72, 108, 180);//默认单位为磅。
Java_实现iReport打印
iReport报表打印功能代码编写环境系统:windows xp开发工具:Myeclipes6.0JDK版本:Java6(jdk6.0,jre6.0)服务器:Tomcat5.5Ireport版本:iReport-2.0.5 windows 安装版(iReport-2.0.5-windows-installer.exe)实现步骤一、iReport-2.0.5安装。
选择安装路径默认安装(一直点击下一步)。
二、将iReprot的jasperreports-2.0.5.jar文件复制到Myeclipes中你工程的WEB-INF/lib目录下。
jasperreports-2.0.5.jar文件所在位置在你iReprot的安装路径下,我的是C:\Program Files\JasperSoft\iReport-2.0.5\lib。
三、要实现打印的Jsp文件编写,Jsp文件中打印按钮或者打印连接应该提交给一个javascript,具体代码如:<a href="javascript: print(${exammanage.oid })"><fontcolor="blue">打印</font></a>javascript代码如下function print(oid){if(!confirm("确定要打印该资格证吗?"))return ;window.showModalDialog('${ctx}/exam/exammanage/examprint_cert.jsp?oid='+oid,'','dialogWidth:50px;dialogHeight:150px;dialogTop:1000px;dialogLef t:1000px');document.forms[0].flg.value = "0";document.forms[0].action="${ctx}/ExamPermitPrint.html";document.forms[0].submit();}代码解释:1、window.showModalDialog('${ctx}/exam/exammanage/examprint_cert.jsp?oid='+oid,'','dialogWidth:50px;dialogHeight:150px;dialogTop:1000px;dialogLef t:1000px');此段的功能是显示打印提示窗口,我的文件是WebRoot路径下/exam/exammanage/路径下的examprint_cert.jsp文件,而且需要传一个你所要打印的记录的唯一字段(数据库中唯一代表一条记录的字段),我这里用OID。
Java使用IText(VM模版)导出PDF,IText导出word(二)
Java使⽤IText(VM模版)导出PDF,IText导出word(⼆)===============action===========================//退款导出wordpublic void exportWordTk() throws IOException{Long userId=(Long)ServletActionContext.getContext().getSession().get(Constant.SESSION_USER_ID);//获取⽣成Pdf需要的⼀些路径String tmPath=ServletActionContext.getServletContext().getRealPath("download/template");//vm 模板路径String wordPath=ServletActionContext.getServletContext().getRealPath("download/file");//⽣成word路径//wordPath+"/"+userId+"_"+fk+".doc"//数据Map map=new HashMap();//velocity模板中的变量map.put("date1",this.fk);map.put("date",new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date()));String newFile=wordPath+"/tk_word_"+userId+".doc";File file=new File(newFile);if(!file.exists()){//设置字体,⽀持中⽂显⽰new PdfUtil().addFontAbsolutePath(ServletActionContext.getServletContext().getRealPath("dzz/pdfFont/simsun.ttf"));//这个字体需要⾃⼰去下载PdfUtil.createByVelocityPdf(tmPath,"tk_word.vm", wordPath+"/tk_word_"+userId+".pdf", map);//导出PDFPdfUtil.createByVelocityDoc(tmPath,"tk_word.vm",newFile, map);//导出word}sendMsgAjax("dzz/download/file/tk_word_"+userId+".doc");}=================vm ⽂件模板(tk_word.vm)=====================<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title></title><style type="text/css">body, button, input, select, textarea {color: color:rgb(0,0,0);font: 14px/1.5 tahoma,arial,宋体,sans-serif;}p{margin:0;padding:0;}.title{border-bottom:1px solid rgb(0,0,0);margin:0;padding:0;width:85%;height:25px;}li{list-style:none;}.li_left li{text-align:left;line-height:47px;font-size:14pt;}.li_left{width:610px;}.fnt-21{font-size:16pt;}table{width:90%;/*argin-left:25px;*/}div_cls{width:100%;text-align:center;}</style></head><body style="font-family: songti;width:100%;text-align:center;"><div style="text-align:center;"><b class="fnt-21"> 本组评审结果清单</b> </div> <table border="1" cellpadding="0" cellspacing="0" style="width:90%;margin-left:25px;"> <tr><td style="width:20%" align="center">申报单位</td><td style="width:10%" align="center">申报经费(万元)</td></tr></table><br/><div><ul style="float:right;margin-right:40px;"><li>$date</li><!--获取后天封装的数据--></ul></div></body></html>====================⼯具类======================package com.qgc.dzz.util;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.io.PrintWriter;import .URL;import java.util.ArrayList;import java.util.List;import java.util.Map;import java.util.UUID;import org.apache.struts2.ServletActionContext;import org.apache.velocity.Template;import org.apache.velocity.VelocityContext;import org.apache.velocity.app.VelocityEngine;import org.xhtmlrenderer.pdf.ITextFontResolver;import org.xhtmlrenderer.pdf.ITextRenderer;import com.lowagie.text.Document;import com.lowagie.text.DocumentException;import com.lowagie.text.Font;import com.lowagie.text.Image;import com.lowagie.text.Rectangle;import com.lowagie.text.pdf.BaseFont;import com.lowagie.text.pdf.PdfImportedPage;import com.lowagie.text.pdf.PdfReader;import com.lowagie.text.pdf.PdfWriter;public class PdfUtil {private static List<String> fonts = new ArrayList();//字体路径/*** 使⽤vm导出word* @param localPath VM 模板路径* @param templateFileName vm 模板名称* @param docPath ⽣成⽂件的路径,包含⽂件如:d://temp.doc* @param map 参数,传递到vm* @return*/public static boolean createByVelocityDoc(String localPath, String templateFileName, String docPath, Map<String, Object> map) {try{createFile(localPath,templateFileName,docPath, map);return true;} catch (Exception e) {e.printStackTrace();}return false;}/*** 导出pdf* @param localPath VM 模板路径* @param templateFileName vm 模板名称* @param pdfPath ⽣成⽂件的路径,包含⽂件如:d://temp.pdf* @param map 参数,传递到vm* @return*/public static boolean createByVelocityPdf(String localPath, String templateFileName, String pdfPath, Map<String, Object> map) {try{String htmlPath = pdfPath + UUID.randomUUID().toString() + ".html";createFile(localPath, templateFileName, htmlPath, map);//⽣成html 临时⽂件HTML2OPDF(htmlPath, pdfPath, fonts);//html转成pdfFile file = new File(htmlPath);file.delete();return true;} catch (Exception e) {e.printStackTrace();}return false;}/*** 合并PDF* @param writer* @param document* @param reader* @throws DocumentException*/public void addToPdfUtil(PdfWriter writer, Document document,PdfReader reader) throws DocumentException {int n = reader.getNumberOfPages();Rectangle pageSize = document.getPageSize();float docHeight = pageSize.getHeight();float docWidth = pageSize.getWidth();for (int i = 1; i <= n; i++) {document.newPage();PdfImportedPage page = writer.getImportedPage(reader, i);Image image = Image.getInstance(page);float imgHeight = image.getPlainHeight();float imgWidth = image.getPlainWidth();if (imgHeight < imgWidth) {float temp = imgHeight;imgHeight = imgWidth;imgWidth = temp;image.setRotationDegrees(90.0F);}if ((imgHeight > docHeight) || (imgWidth > docWidth)) {float hc = imgHeight / docHeight;float wc = imgWidth / docHeight;float suoScale = 0.0F;if (hc > wc)suoScale = 1.0F / hc * 100.0F;else {suoScale = 1.0F / wc * 100.0F;}image.scalePercent(suoScale);}image.setAbsolutePosition(0.0F, 0.0F);document.add(image);}}/*** html 转成 pdf ⽅法* @param htmlPath html路径* @param pdfPath pdf路径* @param fontPaths 字体路径* @throws Exception*/public static void HTML2OPDF(String htmlPath, String pdfPath,List<String> fontPaths)throws Exception{String url = new File(htmlPath).toURI().toURL().toString();//获取⽣成html的路径OutputStream os = new FileOutputStream(pdfPath);//创建输出流ITextRenderer renderer = new ITextRenderer();//itext 对象ITextFontResolver fontResolver = renderer.getFontResolver();//字体// //⽀持中⽂显⽰字体// fontResolver.addFont(ServletActionContext.getServletContext().getRealPath("dzz/pdfFont/simsun_0.ttf"), // BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);if ((fontPaths != null) && (!fontPaths.isEmpty())) {URL classPath = PdfUtil.class.getResource("/");for (String font : fontPaths) {if (font.contains(":"))fontResolver.addFont(font, "Identity-H", false);else {fontResolver.addFont(classPath + "/" + font, "Identity-H",false);}}}renderer.setDocument(url);//设置html路径yout();renderer.createPDF(os);//html转换成pdfSystem.gc();os.close();System.gc();}public static boolean createFile(String localPath, String templateFileName,String newFilePath, Map<String, Object> map){try{VelocityEngine engine = new VelocityEngine();engine.setProperty("file.resource.loader.path", localPath);//指定vm路径Template template = engine.getTemplate(templateFileName, "UTF-8");//指定vm模板VelocityContext context = new VelocityContext();//创建上下⽂对象if (map != null){Object[] keys = map.keySet().toArray();for (Object key : keys) {String keyStr = key.toString();context.put(keyStr, map.get(keyStr));//传递参数到上下⽂对象}}PrintWriter writer = new PrintWriter(newFilePath, "UTF-8");//写⼊参数到vm template.merge(context, writer);writer.flush();writer.close();return true;} catch (Exception e) {e.printStackTrace();}return false;}public static Font FONT = getChineseFont();public static BaseFont BSAE_FONT = getBaseFont();/*** ⽀持显⽰中⽂* @return*/public static Font getChineseFont() {BaseFont bfChinese = null;try {bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", false);} catch (DocumentException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}Font fontChinese = new Font(bfChinese);return fontChinese;}public static BaseFont getBaseFont() {BaseFont bfChinese = null;try {bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", false);} catch (DocumentException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return bfChinese;}public void addFontAbsolutePath(String path) {this.fonts.add(path);}public void addFontClassPath(String path) {this.fonts.add(path);}public List<String> getFonts() {return this.fonts;}public void setFonts(List<String> fonts) {this.fonts = fonts;}}。
利用iText包实现Java报表打印
利用iText包实现Java报表打印丁振凡;王小明;吴小元;邓建明;周斌【期刊名称】《微型机与应用》【年(卷),期】2012(031)018【摘要】The use of iText was introduced combing two cases of report generation in the paper. One case is that the whole content of the report file is dynamically generated by program while the other case is that the data fields is just be filled in the existing PDF report documents. The control method of report print implemented by java was also given in the paper.%结合报表制作的两种情形介绍了iText的应用方法。
一种是由程序对象动态产生整个报表文件的内容,另一种是在已存在的PDF报表文档中填写数据域以完成报表。
给出了Java实现报表打印的控制方法。
【总页数】3页(P84-86)【作者】丁振凡;王小明;吴小元;邓建明;周斌【作者单位】南昌铁路局,江西南昌330001;华东交通大学,江西南昌330013;华东交通大学,江西南昌330013;南昌铁路局,江西南昌330001;南昌铁路局,江西南昌330001【正文语种】中文【中图分类】TP393【相关文献】1.浅析在VFP程序中利用Excel实现报表打印功能 [J], 上官圣洁2.利用地址调用在Excel中实现报表打印功能 [J], 香丽芸3.利用Struts + iText在J2EE中实现PDF报表 [J], 王鹏飞;杨和梅;丁俊松4.VB6.0 中利用编程方法实现报表打印 [J], 熊凯;易建湘5.Java实现Web报表打印功能 [J], 谭传恩因版权原因,仅展示原文概要,查看原文内容请购买。
Java报表功能的三种实现方法
1概述面对管理系统中复杂的数据,报表作为数据管理工具,帮助用户快速掌握原始数据中的基本关系,直观的让用户感受到数据的变化,使用户对事务最新的形势状况能够在第一时间掌握并做出正确的决策判断。
传统处理报表的方式是使用Excel,Word等编辑软件进行人为的数据统计。
这种人工统计数据、填写报表的方式不仅效率低下,还容易出错。
为了提高单位工作人员协同办公效率,减少传统报表在生成和使用时所带来的不足之处。
越来越多的单位选择使用信息化办公,即只向系统数据库录入一次数据,再根据数据库中已有数据集进行数据处理、报表打印。
2浏览器直接生成报表利用浏览器自带的打印功能实现报表打印,无疑是所有实现打印报表功能方式中最直接的。
客户端不用下载其他额外的插件,不需要多余的环境配置,便可以很方便的通过浏览器直接实现报表功能打印。
利用浏览器直接生成报表主要有以下4个步骤:步骤一:建立数据库连接。
DBUil db=new DBUtil();步骤二:用JavaBean定义相应的数据操作语言,获取数据集。
public List getAlInfomationO{List infomations=null://初始化报表数据集合infomationsSuing sql="select*from infomations"; //生成数据库查询语句infomations=db.getList(sql,null);//将数据集放入//集合infomations中retum infomations;}步骤三:根据制作报表页面需要的样式。
<IDOCTYPE htm><html>//报表页面设计<head><meta http equiv="Content-Iype"><title></tite><head>//设置网页标题<body><body>//设计网页内容,例如:表格,div流//对象</html>步骤四:通过Jsp获取数据库中报表参数集并向前端传递。
java利用itext导出pdf
java利⽤itext导出pdf项⽬中有⼀功能是导出历史记录,可以导出pdf和excel,这⾥先说导出pdf。
在⽹上查可以⽤那些⽅式导出pdf,⽤itext⽐较多⼴泛。
导出pdf可以使⽤两种⽅式,⼀是可以根据已有的pdf模板,进⾏⽣成⽂档。
⼆是直接⽤代码⽣成pdf⼀、使⽤模板⽣成pdf1、添加依赖<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.10</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency>2、创建word,创建需要的样式,例如,保存为pdf格式,3、使⽤Adobe Acrobat 打开,打开内容编辑,选择编辑域,编辑域的名称与代码的数据属性名对应。
4、java代码import java.io.ByteArrayOutputStream;import java.io.FileOutputStream;import java.util.Iterator;import com.itextpdf.text.Document;import com.itextpdf.text.pdf.AcroFields;import com.itextpdf.text.pdf.PdfCopy;import com.itextpdf.text.pdf.PdfImportedPage;import com.itextpdf.text.pdf.PdfReader;import com.itextpdf.text.pdf.PdfStamper;/*** @Title: CreatePdf.java* @Description: TODO* @author zhangjunhong* @date 2018年10⽉22⽇*/public class CreatePdf {public static void fillTemplate() throws Exception {//读取的模板String templatePath = "D:/mypdf1.pdf";//⽣成的pdf存储的路径String targetPath = "D:/test1.pdf";PdfReader reader;FileOutputStream outputStream;ByteArrayOutputStream bos;PdfStamper stamper;reader = new PdfReader(templatePath);outputStream = new FileOutputStream(targetPath);bos = new ByteArrayOutputStream();stamper = new PdfStamper(reader, bos);//取得模板表单对应的域AcroFields from = stamper.getAcroFields();String[] strings = { "12222", "zahang", "男", "1992-09-12" };int i = 0;Iterator<String> iterator = from.getFields().keySet().iterator();while (iterator.hasNext()) {String name = iterator.next().toString();System.err.println(name);from.setField(name, strings[i++]);}stamper.setFormFlattening(true);stamper.close();Document document = new Document();PdfCopy copy = new PdfCopy(document, outputStream);document.open();PdfImportedPage importedPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);copy.addPage(importedPage);document.close();}public static void main(String[] args) throws Exception{fillTemplate();}}5、结果⼆、根据数据⽣成pdf并导出,这个好像挺简单的,直接代码⼀波,看注释,也可以⽣成表格之类的@RequestMapping("/export/pdf")public void exPdf(HttpServletResponse response){OutputStream os=null;try {// 指定解析器System.setProperty("javax.xml.parsers.DocumentBuilderFactory",".apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");String filename = "⼤⾯积延误历史记录详情.pdf";response.setContentType("application/pdf");response.setHeader("Content-Disposition","attachment;fileName=" + URLEncoder.encode(filename, "UTF-8"));os = new BufferedOutputStream(response.getOutputStream());//⽣成pdfDocument document=new Document();PdfWriter writer=PdfWriter.getInstance(document, os);// 页⾯⼤⼩Rectangle rectangle = new Rectangle(PageSize.A4);// 页⾯背景颜⾊rectangle.setBackgroundColor(BaseColor.WHITE);document.setPageSize(rectangle);// 页边距左,右,上,下document.setMargins(20, 20, 20, 20);document.open();//中⽂字体 ----不然中⽂会乱码BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);//设置字体Font font = new Font(bf, 14, Font.BOLD, BaseColor.BLACK);Paragraph p=new Paragraph("设置了字体样式的标题哈哈哈哈哈今天⽐较闲嘤嘤嘤", font);document.add(p);document.close();} catch (Exception e) {e.printStackTrace();} finally {try {os.close();} catch (IOException e) {e.printStackTrace();}}还有很多对pdf的操作,如添加page,表格等,可查看itext的官⽅⽂档,最后是不是贴上我花了⼏天写的pdf导出,这个技术是简单了,尼玛项⽬业务逻辑贼复杂。
c#itextsharp根据模板导出pdf报表
c#itextsharp根据模板导出pdf报表⼀、前⾔ PDF⽂件在⽬前来说是⽐较流⾏的电⼦⽂档格式,在.Net framework 中⾝并不包含可以和pdf打交道的⽅法,也没有很好操作PDF的类库,所以我们需要对pdf进⾏编辑,加密,模板打印等操作不得不去找可⽤的第三⽅组件,这⾥就可以选择使⽤ITextSharp来实现,这个程序是JAVA⼯具IText的.Net版本。
准备: 1、 2、简单的操作直接查看帮助⽂件,此处先省略后续考虑补充⼆、itextsharp 使⽤ 2.1 pdf模板 本次讲的是根据pdf模板导出数据,⾸先创建模板,我这⾥使⽤的⼯具是Adobe Acrobat 视图——⼯具——准备表单,可以在需要赋值的地⽅放上⼀个⽂本框,把名字改成要⽤的名字。
这是编辑好后的效果 2.2 新建项⽬添加引⽤新建了⼀个导出数据测试窗体 load事件以及测试数据,///<summary>///模拟数据///</summary>DataTable dt;private void frmDemo1_Load(object sender, EventArgs e){#region模拟数据dt = new DataTable();dt.Columns.Add("number", typeof(string));dt.Columns.Add("name", typeof(string));dt.Columns.Add("yw", typeof(string));dt.Columns.Add("sx", typeof(string));dt.Columns.Add("yy", typeof(string));dt.Columns.Add("pd", typeof(string));dt.Columns.Add("pe", typeof(string));dt.Columns.Add("remark", typeof(string));DataRow dr = dt.NewRow();dr["number"] = "1";dr["name"] = "⼩明";dr["yw"] = "95";dr["sx"] = "90";dr["yy"] = "75";dr["pd"] = "80";dr["pe"] = "90";dt.Rows.Add(dr);dr = dt.NewRow();dr["number"] = "2";dr["name"] = "⼩红";dr["yw"] = "100";dr["sx"] = "90";dr["yy"] = "85";dr["pd"] = "100";dr["pe"] = "90";dt.Rows.Add(dr);dr = dt.NewRow();dr["number"] = "3";dr["name"] = "⼩芳";dr["yw"] = "95";dr["sx"] = "95";dr["yy"] = "90";dr["pd"] = "90";dr["pe"] = "90";dt.Rows.Add(dr);dataGridView1.DataSource = dt;#endregion}View Code封装了⼀个导出Pdf帮助类using iTextSharp.text.pdf;using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;namespace itextsharpDemo{///<summary>/// PDF导出类///</summary>public class PdfLeadingHelper{///<summary>///根据路径获取模板///</summary>///<param name="pdfTemplate"></param>///<returns></returns>public static Dictionary<string, string> ReadForm(string pdfTemplate){Dictionary<string, string> dic = new Dictionary<string, string>();PdfReader pdfReader = null;try{pdfReader = new PdfReader(pdfTemplate);AcroFields pdfFormFields = pdfReader.AcroFields;foreach (var de in pdfFormFields.Fields){dic.Add(de.Key, "");}}catch (Exception ex){dic = null;//记录⽇志注释// LogHelper.Logger(LogLevel.Error, "pdf导出类发⽣异常:根据路径获取模板时异常" + ex.ToString(), ex);}finally{if (pdfReader != null){pdfReader.Close();}}return dic;}//////向pdf模版填充内容,并⽣成新的⽂件//////模版路径///⽣成⽂件保存路径///标签字典(即模版中需要填充的控件列表)public static bool FillForm(string pdfTemplate, string newFile, Dictionary<string, string> dic){bool rsBool = true;PdfReader pdfReader = null;PdfStamper pdfStamper = null;try{pdfReader = new PdfReader(pdfTemplate);pdfStamper = new PdfStamper(pdfReader, new FileStream(newFile, FileMode.Create));AcroFields pdfFormFields = pdfStamper.AcroFields;//设置⽀持中⽂字体BaseFont baseFont = BaseFont.CreateFont("C:\\WINDOWS\\FONTS\\STSONG.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); pdfFormFields.AddSubstitutionFont(baseFont);foreach (var de in dic){pdfFormFields.SetField(de.Key, de.Value + "");}pdfStamper.FormFlattening = true;}catch (Exception ex){//记录⽇志注释// LogHelper.Logger(LogLevel.Error, "pdf导出类发⽣异常:向pdf模版填充内容,并⽣成新的⽂件时异常"+ex.ToString(), ex); rsBool = false;}finally{if (pdfStamper != null){pdfStamper.Close();}if (pdfReader != null){pdfReader.Close();}}return rsBool;}}}导出按钮事件private void button1_Click(object sender, EventArgs e){//dic 获取学⽣成绩表 Pdf导出模板string templetPath = System.Environment.CurrentDirectory + @"\学⽣成绩表.pdf";Dictionary<string, string> dic = PdfLeadingHelper.ReadForm(templetPath);#region赋值 dicdic["className"] = textBox1.Text;for (int i = 1; i <= dt.Rows.Count; i++){if (dic.ContainsKey("number_" + i)){dic["number_" + i] = dt.Rows[i-1]["number"] +"";dic["name_" + i] = dt.Rows[i-1]["name"] + "";dic["yw_" + i] = dt.Rows[i-1]["yw"] + "";dic["sx_" + i] = dt.Rows[i-1]["sx"] + "";dic["yy_" + i] = dt.Rows[i-1]["yy"] + "";dic["pd_" + i] = dt.Rows[i-1]["pd"] + "";dic["pe_" + i] = dt.Rows[i-1]["pe"] + "";dic["remark_" + i] = dt.Rows[i-1]["remark"] + "";}}#endregion//保存SaveFileDialog dlg = new SaveFileDialog();dlg.FileName = "成绩单";dlg.DefaultExt = ".pdf";dlg.Filter = "Text documents (.pdf)|*.pdf";if (dlg.ShowDialog() == DialogResult.OK){bool rsBool = PdfLeadingHelper.FillForm(templetPath, dlg.FileName, dic);if (rsBool){MessageBox.Show("导出成功!!");}}}先获取pdf模板变量,Dictionary<string, string> dic 键值对类型赋值对应dic保存成新pdf这样⼀个⼩案例就完成了。
如何利用iText在java程序中生成PDF报表
如何利用iText在java程序中生成PDF报表以下是上述教程中一个最简单的例子,这个例子刻画了通过iText生成PDF 文件的一般程序框架。
读者只需要在document.open();和document.close();两条语句中间加入自己希望放在PDF文件中的内容即可。
该例子只在PDF文件中加了“Hello World“一行文字。
Document document = new Document();try{PdfWriter.getInstance(document, new FileOutputStream("Chap0101.pdf"));document.open();document.add(new Paragraph("Hello World"));}catch(DocumentException de){System.err.println(de.getMessage());}catch(IOException ioe){System.err.println(ioe.getMessage());}document.close();由以上的例子可见,程序的框架十分清楚明了。
然而在PDF中指定文字、图画、表格的位置是一件非常麻烦的事情。
除了不断地在程序中修改位置、然后运行程序、生成PDF文件、观察元素在PDF中的位置是否合理这样的过程以外,似乎还没有其它更好的方法。
如何通过JSP生成PDF报表1)直接在服务器上生成PDF文件。
<%@ page import ="com.lowagie.text.*,com.lowagie.text.pdf.*,java.io.*"%><%String filename = "PDF"+(new Random()).nextInt()+".pdf" ; Document document = new Document(PageSize.A4); ServletOutputStream out1 = response.getOutputStream();try{PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename) );document.open();document.add(new Paragraph("Hello World"));document.close();}catch(Exception e){}%>上面的程序在服务器上生成了一个静态的PDF文件。
itext.jar生成pdf源码
五、表格处理
iText中处理表格的类为:com.lowagie.text.Table和com.lowagie.text.PDF.PDFPTable,对于比较简单的表格处理可以用com.lowagie.text.Table,但是如果要处理复杂的表格,这就需要com.lowagie.text.PDF.PDFPTable进行处理。这里就类com.lowagie.text.Table进行说明。
PDFWriter.getInstance(document, new FileOutputStream("Helloworld.PDF"));
③打开文档。
document.open();
④向文档中添加内容。
document.add(new Paragraph("Hello World"));
public boolean setPageSize(Rectangle pageSize)
public boolean add(Watermark watermark)
public void removeWatermark()
public void setHeader(HeaderFooter header)
添加文档内容
所有向文档添加的内容都是以对象为单位的,如Phrase、Paragraph、Table、Graphic对象等。比较常用的是段落(Paragraph)对象,用于向文档中添加一段文字。
四、文本处理
iText中用文本块(Chunk)、短语(Phrase)和段落(paragraph)处理文本。
18:table.addCell("2.2");
19:table.addCell("cell test1");
JavaiText+FreeMarker生成PDF(HTML转PDF)
JavaiText+FreeMarker⽣成PDF(HTML转PDF)1.背景在某些业务场景中,需要提供相关的电⼦凭证,⽐如⽹银/⽀付宝中转账的电⼦回单,签约的电⼦合同等。
⽅便⽤户查看,下载,打印。
⽬前常⽤的解决⽅案是,把相关数据信息,⽣成对应的pdf⽂件返回给⽤户。
本⽂源码:2.iTextiText是著名的开放源码的站点sourceforge⼀个项⽬,是⽤于⽣成PDF⽂档的⼀个java类库。
通过iText不仅可以⽣成PDF或rtf的⽂档,⽽且可以将XML、Html⽂件转化为PDF⽂件。
iText 官⽹:iText 开发⽂档:iText⽬前有两套版本iText5和iText7。
iText5应该是⽹上⽤的⽐较多的⼀个版本。
iText5因为是很多开发者参与贡献代码,因此在⼀些规范和设计上存在不合理的地⽅。
iText7是后来官⽅针对iText5的重构,两个版本差别还是挺⼤的。
不过在实际使⽤中,⼀般⽤到的都⽐较简单,所以不⽤特别拘泥于使⽤哪个版本。
⽐如我们在中搜索iText,出来的都是iText5的依赖。
来个最简单的例⼦:添加依赖:<!-- https:///artifact/com.itextpdf/itextpdf --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.11</version></dependency>测试代码:JavaToPdfpackage com.lujianing.test;import com.itextpdf.text.Document;import com.itextpdf.text.DocumentException;import com.itextpdf.text.Paragraph;import com.itextpdf.text.pdf.PdfWriter;import java.io.FileNotFoundException;import java.io.FileOutputStream;/*** Created by lujianing on 2017/5/7.*/public class JavaToPdf {private static final String DEST = "target/HelloWorld.pdf";public static void main(String[] args) throws FileNotFoundException, DocumentException {Document document = new Document();PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(DEST));document.open();document.add(new Paragraph("hello world"));document.close();writer.close();}}运⾏结果:3.iText-中⽂⽀持iText默认是不⽀持中⽂的,因此需要添加对应的中⽂字体,⽐如⿊体simhei.ttf可参考⽂档:测试代码:JavaToPdfCNpackage com.lujianing.test;import com.itextpdf.text.Document;import com.itextpdf.text.DocumentException;import com.itextpdf.text.Font;import com.itextpdf.text.FontFactory;import com.itextpdf.text.Paragraph;import com.itextpdf.text.pdf.BaseFont;import com.itextpdf.text.pdf.PdfWriter;import java.io.FileNotFoundException;import java.io.FileOutputStream;/*** Created by lujianing on 2017/5/7.*/public class JavaToPdfCN {private static final String DEST = "target/HelloWorld_CN.pdf";private static final String FONT = "simhei.ttf";public static void main(String[] args) throws FileNotFoundException, DocumentException {Document document = new Document();PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(DEST));document.open();Font f1 = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); document.add(new Paragraph("hello world,我是鲁家宁", f1));document.close();writer.close();}}输出结果:4.iText-Html渲染在⼀些⽐较复杂的pdf布局中,我们可以通过html去⽣成pdf可参考⽂档:添加依赖:<!-- https:///artifact/com.itextpdf.tool/xmlworker --><dependency><groupId>com.itextpdf.tool</groupId><artifactId>xmlworker</artifactId><version>5.5.11</version></dependency>添加模板:template.html<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"/><title>Title</title><style>body{font-family:SimHei;}.red{color: red;}</style></head><body><div class="red">你好,鲁家宁</div></body></html>测试代码:JavaToPdfHtmlpackage com.lujianing.test;import com.itextpdf.text.Document;import com.itextpdf.text.DocumentException;import com.itextpdf.text.pdf.PdfWriter;import com.itextpdf.tool.xml.XMLWorkerFontProvider;import com.itextpdf.tool.xml.XMLWorkerHelper;import com.lujianing.test.util.PathUtil;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.nio.charset.Charset;/*** Created by lujianing on 2017/5/7.*/public class JavaToPdfHtml {private static final String DEST = "target/HelloWorld_CN_HTML.pdf";private static final String HTML = PathUtil.getCurrentPath()+"/template.html";private static final String FONT = "simhei.ttf";public static void main(String[] args) throws IOException, DocumentException {// step 1Document document = new Document();// step 2PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(DEST));// step 3document.open();// step 4XMLWorkerFontProvider fontImp = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS); fontImp.register(FONT);XMLWorkerHelper.getInstance().parseXHtml(writer, document,new FileInputStream(HTML), null, Charset.forName("UTF-8"), fontImp);// step 5document.close();}}输出结果:需要注意:1.html中必须使⽤标准的语法,标签⼀定需要闭合2.html中如果有中⽂,需要在样式中添加对应字体的样式5.iText-Html-Freemarker渲染在实际使⽤中,html内容都是动态渲染的,因此我们需要加⼊模板引擎⽀持,可以使⽤FreeMarker/Velocity,这⾥使⽤FreeMarker举例添加FreeMarke依赖:<!-- https:///artifact/org.freemarker/freemarker --><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.19</version></dependency>添加模板:template_freemarker.html<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"/><title>Title</title><style>body{font-family:SimHei;}.blue{color: blue;}</style></head><body><div class="blue">你好,${name}</div></body></html>测试代码:JavaToPdfHtmlFreeMarkerpackage com.lujianing.test;import com.itextpdf.text.Document;import com.itextpdf.text.DocumentException;import com.itextpdf.text.pdf.PdfWriter;import com.itextpdf.tool.xml.XMLWorkerFontProvider;import com.itextpdf.tool.xml.XMLWorkerHelper;import com.lujianing.test.util.PathUtil;import freemarker.template.Configuration;import freemarker.template.Template;import java.io.ByteArrayInputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.StringWriter;import java.io.Writer;import java.nio.charset.Charset;import java.util.HashMap;import java.util.Map;/*** Created by lujianing on 2017/5/7.*/public class JavaToPdfHtmlFreeMarker {private static final String DEST = "target/HelloWorld_CN_HTML_FREEMARKER.pdf";private static final String HTML = "template_freemarker.html";private static final String FONT = "simhei.ttf";private static Configuration freemarkerCfg = null;static {freemarkerCfg =new Configuration();//freemarker的模板⽬录try {freemarkerCfg.setDirectoryForTemplateLoading(new File(PathUtil.getCurrentPath()));} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) throws IOException, DocumentException {Map<String,Object> data = new HashMap();data.put("name","鲁家宁");String content = JavaToPdfHtmlFreeMarker.freeMarkerRender(data,HTML);JavaToPdfHtmlFreeMarker.createPdf(content,DEST);}public static void createPdf(String content,String dest) throws IOException, DocumentException {// step 1Document document = new Document();// step 2PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));// step 3document.open();// step 4XMLWorkerFontProvider fontImp = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS); fontImp.register(FONT);XMLWorkerHelper.getInstance().parseXHtml(writer, document,new ByteArrayInputStream(content.getBytes()), null, Charset.forName("UTF-8"), fontImp);// step 5document.close();}/*** freemarker渲染html*/public static String freeMarkerRender(Map<String, Object> data, String htmlTmp) {Writer out = new StringWriter();try {// 获取模板,并设置编码⽅式Template template = freemarkerCfg.getTemplate(htmlTmp);template.setEncoding("UTF-8");// 合并数据模型与模板template.process(data, out); //将合并后的数据和模板写⼊到流中,这⾥使⽤的字符流out.flush();return out.toString();} catch (Exception e) {e.printStackTrace();} finally {try {out.close();} catch (IOException ex) {ex.printStackTrace();}}return null;}}输出结果:⽬前为⽌,我们已经实现了iText通过Html模板⽣成Pdf的功能,但是实际应⽤中,我们发现iText并不能对⾼级的CSS样式进⾏解析,⽐如CSS中的position属性等,因此我们要引⼊新的组件若中⽂变量还是不显⽰,则在pom.xml⾥添加如下:<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <!--增加的配置,过滤ttf⽂件的匹配--> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.7</version> <configuration> <encoding>UTF-8</encoding> <nonFilteredFileExtensions> <nonFilteredFileExtension>ttf</nonFilteredFileExtension> </nonFilteredFileExtensions> </configuration> </plugin> </plugins></build>备注:⼯具类的⽅法PathUtil.getCurrentPath() = "src/main/resources/",(这个对新⼿有⽤)6.Flying Saucer-CSS⾼级特性⽀持Flying Saucer is a pure-Java library for rendering arbitrary well-formed XML (or XHTML) using CSS 2.1 for layout and formatting, output to Swing panels, PDF, and images.Flying Saucer是基于iText的,⽀持对CSS⾼级特性的解析。
java生成PDF,并下载到本地
java⽣成PDF,并下载到本地1、⾸先要写⼀个PDF⼯具类,以及相关⼯具2、PDF所需jar包iText是⼀种⽣成PDF报表的Java组件freemarker是基于模板来⽣成⽂本输出<dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency><dependency><groupId>com.lowagie</groupId><artifactId>itext</artifactId><version>2.1.7</version></dependency><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.23</version></dependency>3、需要使⽤Adobe Acrobat pro软件把要⽣成的模板转换为PDF格式打开Adobe Acrobat pro,打开模板,选择 |—— 准备表单,它会⾃动检测并命名表单域,然后保存为pdf格式即可PDF⼯具类public class PDFTemplet {private String templatePdfPath;private String targetPdfpath;private ServiceOrder order ;public PDFTemplet() {}public void PDFTemplet(File file,String basePath)thows Exception{/*模板路径*/PdfReader reader = new PdfReader(templatePdfPath);ByteArrayOutputStream bos=new ByteArrayOutputStream();/* 读取*/PdfStamper pdfStamper= new PdfStamper(reader,bos);/*使⽤中⽂字体*/BaseFont baseFont=BaseFont.createFont(basePath+"WEB-INF/static/SIMHEI.TTF",BaseFont.IDENTITY_H,BaseFont.EMBEDDED); ArrayList<BaseFont> fontList=new ArrayList<>();fontList.add(baseFont);AcroFields s=pdfStamper.getAcroFields();s.setSubstitutionFonts(fontList);/*需要注意的是 setField的name和命名的表单域名字要⼀致*/s.setField("enterpriseName",order.getEnerpriseName());s.setField("incubatorName",order.getIncubatorName());s.setField("recommend","");//孵化器推荐s.setField("contacts",order.getContacts());s.setField("phone",order.getPhone());s.setField("email",order.getEmail());s.setField("category ","");//服务类别s.setField("demand",order.getDemand());SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ");String createTime = formatter.format(order.getCreateTime());String updateTime = formatter.format(order.getUpdateTime());s.setField("createTime",createTime);s.setField("updateTime", updateTime);ps.setFormFlattenning(true);ps.close();FileOutputStream fileSteam =new FileOutPutStream(file);fos.write(bos.toByteArray);fos.close();}}调⽤⽅法@RequestMapping(value ="downloadPdf", method = RequestMethod.GET)public String downloadPDF(@PathVariable("id") Integer id,HttpServletRequest request) throws Exception {ServiceOrder serviceOrder = serviceOrderService.getById(id);PDFTemplet pdfTT = new PDFTemplet();pdfTT.setOrder(serviceOrder);String basePath = request.getSession().getServletContext().getRealPath("/");String template = request.getSession().getServletContext().getRealPath("/") + "WEB-INF/static/excel/confirmation.pdf"; pdfTT.setTemplatePdfPath(template);pdfTT.setTargetPdfpath("D:/企业服务确认单.pdf");pdfTT.setOrder(serviceOrder);File file = new File("D:/企业服务确认单.pdf");file.createNewFile();pdfTT.templetTicket(file,basePath);return "/master/serviceOrder/orderList";}。
itextpdfJAVA输出PDF文档
itextpdfJAVA输出PDF⽂档使⽤JAVA⽣成PDF的时候,还是有些注意事项需要处理的。
第⼀、中⽂问题,默认的itext是不⽀持中⽂的,想要⽀持,需要做些处理。
1、直接引⽤操作系统的中⽂字体库⽀持,由于此⽅案限制性强,⼜绑定了操作系统,所以此处不做实现,有兴趣可在⽹上搜索看看。
2、引⽤itext-asian.jar包的字体⽀持,代码稍后上。
itext pdf引⼊中⽂常见异常: com.itextpdf.text.DocumentException: Font 'STSongStd-Light' with 'UniGB-UCS2-H' is not recognized. 解决⽅案:a、引⼊操作系统字体;2、将字体维护进jar包中,如果没有,直接找到字体放⼊对应jar包中,如果是路径错误,则更改包路径;3、通过itext-asian.jar来加载中⽂包。
第⼆、表格中的设置,特别是上中下,左中右,不同的对象有不同的枚举实现,刚⼊⼿很容易混淆。
其外是前景⾊,背景⾊,表格颜⾊等等。
第三、输出图⽚,很容易报错。
itext pdf常见输出图⽚异常: An error exists on this page. Acrobat may not display the page correctly. Please contact the person who created the PDF document to correct the problem. 原因:PdfContentByte在addImage的时候需要在beginText()和endText()范围以外调⽤,否则⽣成的PDF就会报上述错误。
⽰例:1package com.itext.test;23import java.io.File;4import java.io.FileOutputStream;5import java.io.IOException;6import java.io.InputStream;7import java.util.ArrayList;8import java.util.List;9import java.util.Random;1011import com.itextpdf.text.BaseColor;12import com.itextpdf.text.Document;13import com.itextpdf.text.DocumentException;14import com.itextpdf.text.Element;15import com.itextpdf.text.Font;16import com.itextpdf.text.Image;17import com.itextpdf.text.PageSize;18import com.itextpdf.text.Paragraph;19import com.itextpdf.text.Rectangle;20import com.itextpdf.text.pdf.BarcodeQRCode;21import com.itextpdf.text.pdf.BaseFont;22import com.itextpdf.text.pdf.PdfContentByte;23import com.itextpdf.text.pdf.PdfGState;24import com.itextpdf.text.pdf.PdfPCell;25import com.itextpdf.text.pdf.PdfPTable;26import com.itextpdf.text.pdf.PdfPageEventHelper;27import com.itextpdf.text.pdf.PdfWriter;2829public class D {3031private static String path = "docs/"; // ⽣成PDF后的存放路径32private static final String logoPath = "logo.png";3334public static void main(String[] args) {35// T t = new T();36 initPDF(initData());37 }3839/**40 * 初始化PDF41 *42 * @param apis43*/44public static void initPDF(List<Api> apis) {45 File folder = new File(path);46if (!folder.exists())47 folder.mkdirs(); // 创建⽬录48 Document doc = null;49try {50// 中⽂字体,要有itext-asian.jar⽀持(默认的itext.jar是不⽀持中⽂的)51 BaseFont bfchinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);52 Rectangle pageSize = new Rectangle(PageSize.A4); // 页⾯⼤⼩设置为A453 doc = new Document(pageSize, 20, 20, 40, 40); // 创建doc对象并设置边距54 PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(folder.getAbsolutePath() + File.separator + "API⽂档.pdf"));55 writer.setPageEvent(new SdkPdfPageEvent());56 doc.open();57 doc.addAuthor("Ares-xby");58 doc.addSubject("SDK附属API⽂档");59 doc.addTitle("API⽂档");60 BaseColor borderColor = new BaseColor(90, 140, 200);61 BaseColor bgColor = new BaseColor(80, 130, 180);62for (Api api : apis) {63 PdfPTable table = new PdfPTable({0.25f, 0.25f, 0.25f, 0.25f});64// table.setWidthPercentage(100); // 设置table宽度为100%65// table.setHorizontalAlignment(PdfPTable.ALIGN_CENTER); // 设置table居中显⽰66for (int i = 0; i < api.getParams().size(); i++) {67if (i == 0) {68// row 169 table.addCell(createCell("API", bfchinese, borderColor, bgColor));70 table.addCell(createCell(api.getApiName(), 12, bfchinese, 3, null, borderColor, bgColor));71// row 272 table.addCell(createCell("描述", bfchinese, borderColor));73 table.addCell(createCell(api.getApiDesc(), 12, bfchinese, 3, null, borderColor));74 } else {75 table.addCell(createCell(api.getParams().get(i).getParamName(), 10, bfchinese, null, Paragraph.ALIGN_RIGHT, borderColor));76 table.addCell(createCell(api.getParams().get(i).getParamName(), 10, bfchinese, null, null, borderColor));77 table.addCell(createCell(api.getParams().get(i).getParamType(), 10, bfchinese, null, null, borderColor));78 table.addCell(createCell(api.getParams().get(i).getParamDesc(), 10, bfchinese, null, null, borderColor));79 }80 }81 doc.add(table);82 }83// ⼆维码84 BarcodeQRCode qrcode = new BarcodeQRCode("", 1, 1, null);85 Image qrcodeImage = qrcode.getImage();86 qrcodeImage.setAbsolutePosition(10, 600);87 qrcodeImage.scalePercent(200);88 doc.add(qrcodeImage);89 doc.close();90 System.out.println("init pdf over.");91 } catch (DocumentException e) {92 e.printStackTrace();93 } catch (IOException e) {94 e.printStackTrace();95 } finally {96if (doc != null)97 doc.close();98 }99100 }101102public static List<Api> initData() {103 List<Api> list = new ArrayList<Api>();104for (int i = 0; i < 100; i++) {105 Api api = new Api();106 api.setApiName("api-" + i);107 api.setApiDesc("描述-" + i);108int paramSize = new Random().nextInt(20);109 List<Params> paramList = new ArrayList<Params>();110for (int j = 0; j < paramSize; j++) {111 Params param = new Params();112 param.setParamName("param-" + i + "-" + j);113 param.setParamType("paramType-" + i + "-" + j);114 param.setParamDesc("描述-" + i + "-" + j);115 paramList.add(param);116 }117 api.setParams(paramList);118 list.add(api);119 }120 System.out.println("init data over. size=" + list.size());121return list;122 }123// ⽤於⽣成cell124private static PdfPCell createCell(String text, BaseFont font, BaseColor borderColor) {125return createCell(text, 12, font, null, null, borderColor, null);126 }127// ⽤於⽣成cell128private static PdfPCell createCell(String text, BaseFont font, BaseColor borderColor, BaseColor bgColor) {129return createCell(text, 12, font, null, null, borderColor, bgColor);130 }131// ⽤於⽣成cell132private static PdfPCell createCell(String text, int fontsize, BaseFont font, Integer colspan, Integer align, BaseColor borderColor) {133return createCell(text, fontsize, font, colspan, align, borderColor, null);134 }135136/**137 * ⽤於⽣成cell138 * @param text Cell⽂字内容139 * @param fontsize 字体⼤⼩140 * @param font 字体141 * @param colspan 合并列数量142 * @param align 显⽰位置(左中右,Paragraph对象)143 * @param borderColor Cell边框颜⾊144 * @param bgColor Cell背景⾊145 * @return146*/147private static PdfPCell createCell(String text, int fontsize, BaseFont font, Integer colspan, Integer align, BaseColor borderColor, BaseColor bgColor) { 148 Paragraph pagragraph = new Paragraph(text, new Font(font, fontsize));149 PdfPCell cell = new PdfPCell(pagragraph);150 cell.setFixedHeight(20);151 cell.setVerticalAlignment(Element.ALIGN_MIDDLE); // 上中下,Element对象152if (align != null)153 cell.setHorizontalAlignment(align);154if (colspan != null && colspan > 1)155 cell.setColspan(colspan);156if (borderColor != null)157 cell.setBorderColor(borderColor);158if (bgColor != null)159 cell.setBackgroundColor(bgColor);160return cell;161 }162163/**164 * SDK中PDF相关的PageEvent165*/166static class SdkPdfPageEvent extends PdfPageEventHelper {167168 @Override169public void onStartPage(PdfWriter writer, Document document) {170// ⽔印(water mark)171 PdfContentByte pcb = writer.getDirectContent();172 pcb.saveState();173 BaseFont bf;174try {175 bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);176 pcb.setFontAndSize(bf, 36);177 } catch (DocumentException e) {178 e.printStackTrace();179 } catch (IOException e) {180 e.printStackTrace();181 }182// 透明度设置183 PdfGState gs = new PdfGState();184 gs.setFillOpacity(0.2f);185 pcb.setGState(gs);186187 pcb.beginText();188 pcb.setTextMatrix(60, 90);189 pcb.showTextAligned(Element.ALIGN_LEFT, "XX公司有限公司", 200, 300, 45);190191 pcb.endText();192 pcb.restoreState();193 }194195 @Override196public void onEndPage(PdfWriter writer, Document document) {197// 页眉、页脚198 PdfContentByte pcb = writer.getDirectContent();199try {200 pcb.setFontAndSize(BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED), 10);201 } catch (Exception e) {202 e.printStackTrace();203 } // ⽀持中⽂字体204 pcb.saveState();205try {206// pcb.addImage()⽅法要在pcb.beginText();pcb.endText();之外调⽤,207// 否则⽣成的PDF打开时会报错: An error exists on this page. Acrobat may not display the page correctly. Please contact the person who created the PDF document to correct the problem.208byte[] logoBytes = new byte[1000 * 1024]; // 此处数组⼤⼩要⽐logo图⽚⼤⼩要⼤, 否则图⽚会损坏;能够直接知道图⽚⼤⼩最好不过.209 InputStream logoIs = getClass().getResourceAsStream(logoPath);210if(logoIs != null){211int logoSize = logoIs.read(logoBytes); // 尝试了⼀下,此处图⽚复制不完全,需要专门写个⽅法,将InputStream转换成Byte数组,详情参考org.apache.io.IOUtils.java的toByteArray(InputStream in)⽅法212if(logoSize > 0){213byte[] logo = new byte[logoSize];214 System.arraycopy(logoBytes, 0, logo, 0, logoSize);215 Image image = Image.getInstance(logo);// 如果直接使⽤logoBytes,并且图⽚是jar包中的话,会报图⽚损坏异常;本地图⽚可直接getInstance时候使⽤路径。
Eclipse教程(六)Java报表打印
Eclipse教程(六)Java报表打印Sun的报表⽰例package com;import java.awt.event.*;import javax.swing.*;import java.awt.event.ActionListener;import java.awt.event.ActionEvent;import java.awt.*;import java.awt.geom.*;import java.awt.print.*;public class Test1 extends JPanel implements ActionListener{final static Color bg = Color.white;final static Color fg = Color.black;final static Color red = Color.red;final static Color white = Color.white;final static BasicStroke stroke = new BasicStroke(2.0f);final static BasicStroke wideStroke = new BasicStroke(8.0f);final static float dash1[] = {10.0f};final static BasicStroke dashed = new BasicStroke(1.0f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER,10.0f, dash1, 0.0f);final static JButton button = new JButton("Print");public Test1() {setBackground(bg);button.addActionListener(this);}public void actionPerformed(ActionEvent e) {// Get a PrinterJobPrinterJob job = PrinterJob.getPrinterJob();// Create a landscape page formatPageFormat landscape = job.defaultPage();landscape.setOrientation(NDSCAPE);// Set up a bookBook bk = new Book();bk.append(new PaintCover(), job.defaultPage());bk.append(new PaintContent(), landscape);// Pass the book to the PrinterJobjob.setPageable(bk);// Put up the dialog boxif (job.printDialog()) {// Print the job if the user didn't cancel printingtry { job.print(); }catch (Exception exc) { /* Handle Exception */ }}}public void paintComponent(Graphics g) {super.paintComponent(g);Graphics2D g2 = (Graphics2D) g;drawShapes(g2);}static void drawShapes(Graphics2D g2){int gridWidth = 600 / 6;int gridHeight = 250 / 2;int rowspacing = 5;int columnspacing = 7;int rectWidth = gridWidth - columnspacing;int rectHeight = gridHeight - rowspacing;Color fg3D = Color.lightGray;g2.setPaint(fg3D);g2.drawRect(80, 80, 605 - 1, 265);g2.setPaint(fg);int x = 85;int y = 87;// draw Line2D.Doubleg2.draw(new Line2D.Double(x, y+rectHeight-1, x + rectWidth, y));x += gridWidth;Graphics2D temp = g2;// draw Rectangle2D.Doubleg2.setStroke(stroke);g2.draw(new Rectangle2D.Double(x, y, rectWidth, rectHeight));x += gridWidth;// draw RoundRectangle2D.Doubleg2.setStroke(dashed);g2.draw(new RoundRectangle2D.Double(x, y, rectWidth,rectHeight, 10, 10));x += gridWidth;// draw Arc2D.Doubleg2.setStroke(wideStroke);g2.draw(new Arc2D.Double(x, y, rectWidth, rectHeight, 90,135, Arc2D.OPEN));x += gridWidth;// draw Ellipse2D.Doubleg2.setStroke(stroke);g2.draw(new Ellipse2D.Double(x, y, rectWidth, rectHeight));x += gridWidth;// draw GeneralPath (polygon)int x1Points[] = {x, x+rectWidth, x, x+rectWidth};int y1Points[] = {y, y+rectHeight, y+rectHeight, y};GeneralPath polygon = new GeneralPath(GeneralPath.WIND_EVEN_ODD, x1Points.length);polygon.moveTo(x1Points[0], y1Points[0]);for ( int index = 1; index < x1Points.length; index++ ) {polygon.lineTo(x1Points[index], y1Points[index]);};polygon.closePath();g2.draw(polygon);// NEW ROWx = 85;y += gridHeight;// draw GeneralPath (polyline)int x2Points[] = {x, x+rectWidth, x, x+rectWidth};int y2Points[] = {y, y+rectHeight, y+rectHeight, y};GeneralPath polyline = new GeneralPath(GeneralPath.WIND_EVEN_ODD, x2Points.length);polyline.moveTo (x2Points[0], y2Points[0]);for ( int index = 1; index < x2Points.length; index++ ) {polyline.lineTo(x2Points[index], y2Points[index]);};g2.draw(polyline);x += gridWidth;// fill Rectangle2D.Double (red)g2.setPaint(red);g2.fill(new Rectangle2D.Double(x, y, rectWidth, rectHeight));g2.setPaint(fg);x += gridWidth;// fill RoundRectangle2D.DoubleGradientPaint redtowhite = new GradientPaint(x,y,red,x+rectWidth,y,white);g2.setPaint(redtowhite);g2.fill(new RoundRectangle2D.Double(x, y, rectWidth,rectHeight, 10, 10));g2.setPaint(fg);x += gridWidth;// fill Arc2Dg2.setPaint(red);g2.fill(new Arc2D.Double(x, y, rectWidth, rectHeight, 90,135, Arc2D.OPEN));g2.setPaint(fg);x += gridWidth;// fill Ellipse2D.Doubleredtowhite = new GradientPaint(x,y,red,x+rectWidth, y,white);g2.setPaint(redtowhite);g2.fill (new Ellipse2D.Double(x, y, rectWidth, rectHeight));g2.setPaint(fg);x += gridWidth;// fill and stroke GeneralPathint x3Points[] = {x, x+rectWidth, x, x+rectWidth};int y3Points[] = {y, y+rectHeight, y+rectHeight, y};GeneralPath filledPolygon = new GeneralPath(GeneralPath.WIND_EVEN_ODD, x3Points.length);filledPolygon.moveTo(x3Points[0], y3Points[0]);for ( int index = 1; index < x3Points.length; index++ ) {filledPolygon.lineTo(x3Points[index], y3Points[index]);};filledPolygon.closePath();g2.setPaint(red);g2.fill(filledPolygon);g2.setPaint(fg);g2.draw(filledPolygon);g2.setStroke(temp.getStroke());}public static void main(String[] args) {WindowListener l = new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0);}public void windowClosed(WindowEvent e) {System.exit(0);}};JFrame f = new JFrame();f.addWindowListener(l);JPanel panel = new JPanel();panel.add(button);f.getContentPane().add(BorderLayout.SOUTH, panel);f.getContentPane().add(BorderLayout.CENTER, new Test1());f.setSize(775, 450);f.show();}}class PaintCover implements Printable {Font fnt = new Font("Helvetica-Bold", Font.PLAIN, 48);public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException {g.setFont(fnt);g.setColor(Color.black);g.drawString("Sample Shapes", 100, 200);return Printable.PAGE_EXISTS;}}class PaintContent implements Printable {public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException {Test1.drawShapes((Graphics2D) g);return Printable.PAGE_EXISTS;}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
利用iText包实现Java报表打印摘要:结合报表制作的两种情形介绍了iText的应用方法。
一种是由程序对象动态产生整个报表文件的内容,另一种是在已存在的PDF报表文档中填写数据域以完成报表。
给出了Java实现报表打印的控制方法。
关键词: Java报表;iText包;动态报表;填充型报表;报表打印在信息系统应用中,报表处理一直起着比较重要的作用。
Java报表制作中最常使用的是iText组件,它是一种生成PDF报表的Java组件。
本文讨论两种形式的PDF报表处理,一种是通过程序对象生成整个PDF报表文档,另一种是利用制作好的含报表的PDF文档模板,通过在模板填写数据实现数据报表。
1 通过编程绘制实现报表的生成对于内容动态变化的表格,适合使用程序绘制办法进行生成处理。
这类表格中数据项和数据均是动态存在的。
1.1使用iText编程生成含报表的PDF文档的步骤[1] (1)建立Document对象。
Document是PDF文件所有元素的容器。
Document document = new Document(); (2)建立一个与Document对象关联的书写器(Writer)。
通过书写器(Writer)对象可以将具体文档存盘成需要的格式,PDFWriter可以将文档保存为PDF文件。
PDFWriter.getInstance(document, new FileOutputStream("my.PDF")); (3)打开文档。
如:document.open(); (4)向文档中添加内容。
所有向文档添加的内容都是以对象为单位的,iText中用文本块(Chunk)、短语(Phrase)和段落(Paragraph)处理文本。
document.add(new Paragraph("HelloWorld"));//添加一个段落值得注意的是文本中汉字的显示,默认的iText字体设置不支持中文字体,需要下载远东字体包iTextAsian.jar,否则不能往PDF文档中输出中文字体[2]。
(5)关闭文档。
如:document.close();1.2 表格绘制要在PDF文件中创建表格,iText提供了两个类——Table和PdfPTable。
Table类用来实现简单表格,PdfPTable类则用来实现比较复杂的表格。
本文主要讨论PdfPTable类的应用。
(1)创建PdfPTable对象创建PdfPTable对象只需要指定列数,不用指定行数。
通常生成的表格默认以80%的比例显示在页面上。
例如定义3列的表格,每列的宽度分别为15%、25%和60%,语句如下:float[] widths = {15f, 25f, 60f}; PdfPTable table = newPdfPTable(widths); 用setWidthPercentage(float widthPercentage)方法可设置表格的按百分比的宽度。
而用setTotalWidth则可设置表格按像素计算的宽度。
如果表格的内容超过了300 px,表格的宽度会自动加长。
用setLockedWidth(true)方法可锁定表格宽度。
通过表格对象的系列方法可设置表格的边界以及对齐、填充方式。
(2)添加单元格表格创建完成以后,可通过addCell(Object object)方法插入单元格元素(PdfPCell)。
其中,Object对象可以是PdfPCell、String、Phrase、Image,也可以是PdfPTable对象本身,即在表格中嵌套一个表格。
通过单元格的方法可设定单元格的列跨度、边框粗细、对齐方式、填充间隙等。
(3)合并单元格为了实现某些特殊的表格形式,需要合并单元格。
PdfPCell类提供了setColspan(int colspan)方法用于合并横向单元格,参数colspan为合并的单元格数。
但要合并纵向单元格需要使用嵌套表格的方法。
将某个子表加入单元格,且安排单元格所占列数为子表中列数,则其行跨度也就是子表中的行数。
由于实际编程时,经常出现各类结构的嵌套情形,可以将产生某种结构的表格模块进行封装,编制成方法,通过传递方法参数完成表格特定模块的绘制。
例如,可以将生成一个整齐行列表格的代码编写成方法。
方法返回表格,填充的数据通过二维对象数组传递。
代码如下:public staticPdfPTable creatSubTable(Object x[][]){ PdfPTable t= new PdfPTable(x[0].length);t.getDefaultCell ().setHorizontalAlignment (Element.ALIGN_CENTER); for (intk=0;k<x.length;k++) { for (int j=0;j<x[0].length;j++) t.addCell(new Phrase(x[k][j].toString(),FontChinese)); } return t;}以下代码调用上述方法,绘制图1表格中黑框内部分: PdfPTable t2= new PdfPTable(3);String x1[][]={ {"+601k","10","合格"},{"-601k","11","合格"},{"+601k-601k","12","合格"}}; PdfPCellm=new PdfPCell(creatSubTable(x1));//将创建的子表放入单元格 m.setColspan(3);//单元格占用外层表格的3栏 t2.addCell(m);2 基于PDF报表模板的报表生成有些表格具有固定的格式,实际工作中只是给表格填写数据。
这类表格可转换为PDF文件格式的报表模板,通过特殊工具在文件中定义若干数据域,通过给数据域写入数据实现对报表数据的填充处理。
它具有格式灵活的特点。
基于报表模板的报表处理步骤如下: (1)利用Word制作打印报表; (2)利用Adobe Acrobat 7.0 Professional将Word文档转换为PDF格式; (3)利用Adobe Designer 7.0对PDF进行设计,定义数据域; (4)利用iText组件实现对报表数据字段的写入。
可利用AdobeDesigner 7.0导入某个PDF文件进行设计,在任意位置添加文本域。
每个文本域有一个绑定的名称和值,在Java程序中正是通过文本域的名称访问文本域对象。
图2给出了利用Adobe Acrobat 7.0 Professional打开一个制作好的带数据域定义的PDF文档模板文件的浏览界面,出于清晰考虑,图中特别将数据域采用高亮度显示。
以下给出了打开报表模板实现数据写入的关键代码:importcom.itextpdf.text.DocumentException; import com.itextpdf.text.pdf.AcroFields;import com.itextpdf.text.pdf.PdfReader; importcom.itextpdf.text.pdf.PdfStamper; …… PdfReader r=newPdfReader("d:\\预检模板(DC600V方式).pdf"); // ① PdfStamper s=new PdfStamper(r,new FileOutputStream("d:\\结果.pdf")); //② AcroFieldsform=s.getAcroFields(); // ③ Stringx[]=detectlog.getYjdata(date,cheNumber,code);//读取数据库数据form.setField("日期", x[1]); // ④ form.setField("修规",x[2]); …… s.close(); 【说明】①利用PdfReader读取PDF文档;通过实例化PdfReader对象来获取pdf模板,传入的字符串就是pdf文件所放置的路径,可以用绝对路径表示。
②取得对象后,需要用PdfStamper来编辑PdfReader对象,同时获取一个OutputStream输出流作为输出对象。
③利用PdfStamper获取文件中定义的AcroFields对象。
④用AcroFields对象的setField填写各个字段的数据到表格中。
3 Java打印PDF报表文件在Web应用中要在客户端打印PDF文档只需要将文件送客户浏览器显示,利用浏览器客户端的文件打印功能可实现打印。
以下讨论在Java应用程序中如何打印报表文件。
Java实现报表打印首先要获取打印服务对象,然后利用服务对象开始一个作业的打印。
以下给出了新的JDK1.4以上版本中实现打印的具体步骤和关键代码。
// ① 构建打印请求属性集PrintRequestAttributeSet pras = new HashPrintRequest-AttributeSet(); // ② 设置打印格式,因为未确定文件类型,这里选择AUTOSENSE DocFlavor flavor=DocFlavor.INPUT_STREAM.AUTOSENSE;// ③ 查找所有的可用打印服务PrintService printService[] = PrintServiceLookup.lookup-PrintServices(flavor, pras); // ④ 定位默认的打印服务PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService(); // ⑤ 显示打印对话框PrintService service = ServiceUI.printDialog(null, 200,200, printService, defaultService, flavor, pras); if (service != null) { DocPrintJob job = service.createPrintJob(); // ⑥创建打印作业 FileInputStream fis = new FileInputStream(file); // 假设file为具体文件对象 DocAttributeSet das = new HashDocAttributeSet(); Doc doc = new SimpleDoc(fis, flavor, das); // ⑦ 建立打印文件格式job.print(doc, pras); // ⑧ 进行文件的打印 } 本文介绍了利用iText实现PDF报表打印的编程处理方法。