2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > ITEXT 页眉页脚页码三件套

ITEXT 页眉页脚页码三件套

时间:2020-07-07 13:33:56

相关推荐

ITEXT 页眉页脚页码三件套

问题场景

利用itext写PDF的过程中遇到生成页眉页脚页码的问题,记录下。

整体思路

编写相应事件在适当位置添加事件

效果

CODE

需要导入的包:itext-pdfa-5.5.6.jar、itext-xtra-5.5.6.jar、itext-5.5.6.jar、itext-asian.jar

import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import .MalformedURLException;import com.itextpdf.text.Document;import com.itextpdf.text.DocumentException;import com.itextpdf.text.ExceptionConverter;import com.itextpdf.text.Font;import com.itextpdf.text.Image;import com.itextpdf.text.PageSize;import com.itextpdf.text.Paragraph;import com.itextpdf.text.pdf.BaseFont;import com.itextpdf.text.pdf.PdfContentByte;import com.itextpdf.text.pdf.PdfPCell;import com.itextpdf.text.pdf.PdfPTable;import com.itextpdf.text.pdf.PdfPageEventHelper;import com.itextpdf.text.pdf.PdfTemplate;import com.itextpdf.text.pdf.PdfWriter;/*** @author youxingyang* @Date -5-9 下午1:15:46*/public class pdfPage {//页码事件private static class PageXofYTest extends PdfPageEventHelper{/** The PdfTemplate that contains the total number of pages. */public PdfTemplate total;public BaseFont bfChinese;/*** 重写PdfPageEventHelper中的onOpenDocument方法*/@Overridepublic void onOpenDocument(PdfWriter writer, Document document) {// 得到文档的内容并为该内容新建一个模板total = writer.getDirectContent().createTemplate(500, 500);try {String prefixFont = "";String os = System.getProperties().getProperty("os.name");if(os.startsWith("win") || os.startsWith("Win")){prefixFont = "C:\\Windows\\Fonts" + File.separator;}else {prefixFont = "/usr/share/fonts/chinese" + File.separator;}// 设置字体对象为Windows系统默认的字体bfChinese = BaseFont.createFont(prefixFont + "simsun.ttc,0", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);} catch (Exception e) {throw new ExceptionConverter(e);}}/*** 重写PdfPageEventHelper中的onEndPage方法*/@Overridepublic void onEndPage(PdfWriter writer, Document document) {// 新建获得用户页面文本和图片内容位置的对象PdfContentByte pdfContentByte = writer.getDirectContent();// 保存图形状态pdfContentByte.saveState();String text = writer.getPageNumber() + "/";// 获取点字符串的宽度float textSize = bfChinese.getWidthPoint(text, 9);pdfContentByte.beginText();// 设置随后的文本内容写作的字体和字号pdfContentByte.setFontAndSize(bfChinese, 9);// 定位'X/'float x = (document.right() + document.left()) / 2;float y = 56f;pdfContentByte.setTextMatrix(x, y);pdfContentByte.showText(text);pdfContentByte.endText();// 将模板加入到内容(content)中- // 定位'Y'pdfContentByte.addTemplate(total, x + textSize, y);pdfContentByte.restoreState();}/*** 重写PdfPageEventHelper中的onCloseDocument方法*/@Overridepublic void onCloseDocument(PdfWriter writer, Document document) {total.beginText();try {String prefixFont = "";String os = System.getProperties().getProperty("os.name");if(os.startsWith("win") || os.startsWith("Win")){prefixFont = "C:\\Windows\\Fonts" + File.separator;}else {prefixFont = "/usr/share/fonts/chinese" + File.separator;}bfChinese = BaseFont.createFont(prefixFont + "simsun.ttc,0",BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);total.setFontAndSize(bfChinese, 9);} catch (DocumentException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}total.setTextMatrix(0, 0);// 设置总页数的值到模板上,并应用到每个界面total.showText(String.valueOf(writer.getPageNumber() - 1));total.endText();}}//页眉事件private static class Header extends PdfPageEventHelper {public static PdfPTable header;public Header(PdfPTable header) {Header.header = header;}@Overridepublic void onEndPage(PdfWriter writer, Document document) {//把页眉表格定位header.writeSelectedRows(0, -1, 36, 806, writer.getDirectContent());}/*** 设置页眉* @param writer* @param req* @throws MalformedURLException* @throws IOException* @throws DocumentException*/public void setTableHeader(PdfWriter writer) throws MalformedURLException, IOException, DocumentException {String imageAddress = "E://TESTPDF/";PdfPTable table = new PdfPTable(1);table.setTotalWidth(555);PdfPCell cell = new PdfPCell();cell.setBorder(0);Image image01;image01 = Image.getInstance(imageAddress + "testhead.png"); //图片自己传//image01.scaleAbsolute(355f, 10f);image01.setWidthPercentage(80);cell.setPaddingLeft(30f);cell.setPaddingTop(-20f);cell.addElement(image01);table.addCell(cell);Header event = new Header(table);writer.setPageEvent(event);} }//页脚事件private static class Footer extends PdfPageEventHelper {public static PdfPTable footer;@SuppressWarnings("static-access")public Footer(PdfPTable footer) {this.footer = footer;}@Overridepublic void onEndPage(PdfWriter writer, Document document) {//把页脚表格定位footer.writeSelectedRows(0, -1, 38, 50, writer.getDirectContent());}/*** 页脚是图片* @param writer* @throws MalformedURLException* @throws IOException* @throws DocumentException*/public void setTableFooter(PdfWriter writer) throws MalformedURLException, IOException, DocumentException {String imageAddress = "E://TESTPDF/";PdfPTable table = new PdfPTable(1);table.setTotalWidth(523);PdfPCell cell = new PdfPCell();cell.setBorder(1);Image image01;image01 = Image.getInstance(imageAddress + "testfooter.png"); //图片自己传image01.scaleAbsoluteWidth(523);image01.scaleAbsoluteHeight(30f);image01.setWidthPercentage(100);cell.addElement(image01);table.addCell(cell);Footer event = new Footer(table);writer.setPageEvent(event);}/*** 页脚是文字* @param writer* @param songti09*/public void setTableFooter(PdfWriter writer, Font songti09) {PdfPTable table = new PdfPTable(1);table.setTotalWidth(520f);PdfPCell cell = new PdfPCell();cell.setBorder(1);String string = "地址: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 网址: 咨询热线: 400x-xxx-xxx";Paragraph p = new Paragraph(string, songti09);cell.setPaddingLeft(10f);cell.setPaddingTop(-2f);cell.addElement(p);table.addCell(cell);Footer event = new Footer(table);writer.setPageEvent(event);}}public static void main(String[] args) throws Exception {Document document = new Document(PageSize.A4, 48, 48, 60, 65);// add index page.String path = "test.pdf";String dir = "E://TEST";File file = new File(dir);if (!file.exists()) {file.mkdir();}path = dir + File.separator + path;FileOutputStream os = new FileOutputStream(path);PdfWriter writer = PdfWriter.getInstance(document, os);// 设置页面布局writer.setViewerPreferences(PdfWriter.PageLayoutOneColumn);// 为这篇文档设置页面事件(X/Y)writer.setPageEvent(new PageXofYTest());String prefixFont = "";String oss = System.getProperties().getProperty("os.name");if(oss.startsWith("win") || oss.startsWith("Win")){prefixFont = "C:\\Windows\\Fonts" + File.separator;}else {prefixFont = "/usr/share/fonts/chinese" + File.separator;}BaseFont baseFont1 = BaseFont.createFont(prefixFont + "simsun.ttc,0", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);Font songti09 = new Font(baseFont1, 9f); //宋体 小五document.open();document.newPage();PdfPTable pdfPTable = new PdfPTable(1);// 为报告添加页眉,事件的发生是在生成报告之后,写入到硬盘之前Header headerTable = new Header(pdfPTable);headerTable.setTableHeader(writer);Footer footerTable = new Footer(pdfPTable);footerTable.setTableFooter(writer, songti09);document.add(pdfPTable);for (int i = 0; i < 36; i++) {document.add(new Paragraph("the first page"));}document.newPage();document.add(new Paragraph("the second page"));document.close();os.close();}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。