1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > itext给已有pdf添加页眉页脚

itext给已有pdf添加页眉页脚

时间:2021-11-26 04:11:11

相关推荐

itext给已有pdf添加页眉页脚

网上百度到的基本都是生成pdf的时候,添加页眉页脚,但是假如对已有的pdf添加页眉页脚就比较麻烦,突然想到了可以曲线救国,用itext进行复制pdf的时候,在添加页眉页脚,最后可以成功的。

生成pdf的代码忘记参考谁的了。。。。

生成Pdf的代码如下:

/*** @author WGR* @create /8/18 -- 15:57*/public class PdfReport {// main测试public static void main(String[] args) throws Exception {try {// 1.新建document对象Document document = new Document(PageSize.A4);// 建立一个Document对象// 2.建立一个书写器(Writer)与document对象关联File file = new File("D:\\PDFDemo.pdf");// file.createNewFile();PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));// writer.setPageEvent(new Watermark("HELLO ITEXTPDF"));// 水印// writer.setPageEvent(new MyHeaderFooter());// 页眉/页脚// // 3.打开文档document.open();document.addTitle("Title@PDF-Java");// 标题document.addAuthor("Author@umiz");// 作者document.addSubject("Subject@iText pdf sample");// 主题document.addKeywords("Keywords@iTextpdf");// 关键字document.addCreator("Creator@umiz`s");// 创建者// 4.向文档中添加内容new PdfReport().generatePDF(document);// 5.关闭文档document.close();} catch (Exception e) {e.printStackTrace();}}// 定义全局的字体静态变量private static Font titlefont;private static Font headfont;private static Font keyfont;private static Font textfont;// 最大宽度private static int maxWidth = 520;// 静态代码块static {try {// 不同字体(这里定义为同一种字体:包含不同字号、不同style)BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);titlefont = new Font(bfChinese, 16, Font.BOLD);headfont = new Font(bfChinese, 14, Font.BOLD);keyfont = new Font(bfChinese, 10, Font.BOLD);textfont = new Font(bfChinese, 10, Font.NORMAL);} catch (Exception e) {e.printStackTrace();}}// 生成PDF文件public void generatePDF(Document document) throws Exception {// 段落Paragraph paragraph = new Paragraph("美好的一天从早起开始!", titlefont);paragraph.setAlignment(1); //设置文字居中 0靠左 1,居中2,靠右paragraph.setIndentationLeft(12); //设置左缩进paragraph.setIndentationRight(12); //设置右缩进paragraph.setFirstLineIndent(24); //设置首行缩进paragraph.setLeading(20f); //行间距paragraph.setSpacingBefore(5f); //设置段落上空白paragraph.setSpacingAfter(10f); //设置段落下空白// 直线Paragraph p1 = new Paragraph();p1.add(new Chunk(new LineSeparator()));// 点线Paragraph p2 = new Paragraph();p2.add(new Chunk(new DottedLineSeparator()));// 超链接Anchor anchor = new Anchor("baidu");anchor.setReference("");// 定位Anchor gotoP = new Anchor("goto");gotoP.setReference("#top");// 添加图片Image image = Image.getInstance("C:\\Users\\asus\\Desktop\\123.jpg");image.setAlignment(Image.ALIGN_CENTER);image.scalePercent(40); //依照比例缩放// 表格PdfPTable table = createTable(new float[] { 40, 120, 120, 120, 80, 80 });table.addCell(createCell("美好的一天", headfont, Element.ALIGN_LEFT, 6, false));table.addCell(createCell("早上9:00", keyfont, Element.ALIGN_CENTER));table.addCell(createCell("中午11:00", keyfont, Element.ALIGN_CENTER));table.addCell(createCell("中午13:00", keyfont, Element.ALIGN_CENTER));table.addCell(createCell("下午15:00", keyfont, Element.ALIGN_CENTER));table.addCell(createCell("下午17:00", keyfont, Element.ALIGN_CENTER));table.addCell(createCell("晚上19:00", keyfont, Element.ALIGN_CENTER));Integer totalQuantity = 0;for (int i = 0; i < 5; i++) {table.addCell(createCell("起床1", textfont));table.addCell(createCell("吃午饭1", textfont));table.addCell(createCell("午休1", textfont));table.addCell(createCell("下午茶", textfont));table.addCell(createCell("回家", textfont));table.addCell(createCell("吃晚饭", textfont));totalQuantity ++;}table.addCell(createCell("总计", keyfont));table.addCell(createCell("", textfont));table.addCell(createCell("", textfont));table.addCell(createCell("", textfont));table.addCell(createCell(String.valueOf(totalQuantity) + "件事", textfont));table.addCell(createCell("", textfont));document.add(paragraph);document.add(anchor);document.add(p2);document.add(gotoP);document.add(p1);document.add(table);document.add(image);}/**------------------------创建表格单元格的方法start----------------------------*//*** 创建单元格(指定字体)* @param value* @param font* @return*/public PdfPCell createCell(String value, Font font) {PdfPCell cell = new PdfPCell();cell.setVerticalAlignment(Element.ALIGN_MIDDLE);cell.setHorizontalAlignment(Element.ALIGN_CENTER);cell.setPhrase(new Phrase(value, font));return cell;}/*** 创建单元格(指定字体、水平..)* @param value* @param font* @param align* @return*/public PdfPCell createCell(String value, Font font, int align) {PdfPCell cell = new PdfPCell();cell.setVerticalAlignment(Element.ALIGN_MIDDLE);cell.setHorizontalAlignment(align);cell.setPhrase(new Phrase(value, font));return cell;}/*** 创建单元格(指定字体、水平居..、单元格跨x列合并)* @param value* @param font* @param align* @param colspan* @return*/public PdfPCell createCell(String value, Font font, int align, int colspan) {PdfPCell cell = new PdfPCell();cell.setVerticalAlignment(Element.ALIGN_MIDDLE);cell.setHorizontalAlignment(align);cell.setColspan(colspan);cell.setPhrase(new Phrase(value, font));return cell;}/*** 创建单元格(指定字体、水平居..、单元格跨x列合并、设置单元格内边距)* @param value* @param font* @param align* @param colspan* @param boderFlag* @return*/public PdfPCell createCell(String value, Font font, int align, int colspan, boolean boderFlag) {PdfPCell cell = new PdfPCell();cell.setVerticalAlignment(Element.ALIGN_MIDDLE);cell.setHorizontalAlignment(align);cell.setColspan(colspan);cell.setPhrase(new Phrase(value, font));cell.setPadding(3.0f);if (!boderFlag) {cell.setBorder(0);cell.setPaddingTop(15.0f);cell.setPaddingBottom(8.0f);} else if (boderFlag) {cell.setBorder(0);cell.setPaddingTop(0.0f);cell.setPaddingBottom(15.0f);}return cell;}/*** 创建单元格(指定字体、水平..、边框宽度:0表示无边框、内边距)* @param value* @param font* @param align* @param borderWidth* @param paddingSize* @param flag* @return*/public PdfPCell createCell(String value, Font font, int align, float[] borderWidth, float[] paddingSize, boolean flag) {PdfPCell cell = new PdfPCell();cell.setVerticalAlignment(Element.ALIGN_MIDDLE);cell.setHorizontalAlignment(align);cell.setPhrase(new Phrase(value, font));cell.setBorderWidthLeft(borderWidth[0]);cell.setBorderWidthRight(borderWidth[1]);cell.setBorderWidthTop(borderWidth[2]);cell.setBorderWidthBottom(borderWidth[3]);cell.setPaddingTop(paddingSize[0]);cell.setPaddingBottom(paddingSize[1]);if (flag) {cell.setColspan(2);}return cell;}/**------------------------创建表格单元格的方法end----------------------------*//**--------------------------创建表格的方法start------------------- ---------*//*** 创建默认列宽,指定列数、水平(居中、右、左)的表格* @param colNumber* @param align* @return*/public PdfPTable createTable(int colNumber, int align) {PdfPTable table = new PdfPTable(colNumber);try {table.setTotalWidth(maxWidth);table.setLockedWidth(true);table.setHorizontalAlignment(align);table.getDefaultCell().setBorder(1);} catch (Exception e) {e.printStackTrace();}return table;}/*** 创建指定列宽、列数的表格* @param widths* @return*/public PdfPTable createTable(float[] widths) {PdfPTable table = new PdfPTable(widths);try {table.setTotalWidth(maxWidth);table.setLockedWidth(true);table.setHorizontalAlignment(Element.ALIGN_CENTER);table.getDefaultCell().setBorder(1);} catch (Exception e) {e.printStackTrace();}return table;}/*** 创建空白的表格* @return*/public PdfPTable createBlankTable() {PdfPTable table = new PdfPTable(1);table.getDefaultCell().setBorder(0);table.addCell(createCell("", keyfont));table.setSpacingAfter(20.0f);table.setSpacingBefore(20.0f);return table;}/**--------------------------创建表格的方法end------------------- ---------*/}

添加页眉页脚的类

/*** @author WGR* @create /8/18 -- 15:59*/public class MyHeaderFooter extends PdfPageEventHelper {// 总页数PdfTemplate totalPage;Font hfFont;{try {hfFont = new Font(BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED), 8, Font.NORMAL);} catch (DocumentException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}// 打开文档时,创建一个总页数的模版@Overridepublic void onOpenDocument(PdfWriter writer, Document document) {PdfContentByte cb =writer.getDirectContent();totalPage = cb.createTemplate(30, 16);}// 一页加载完成触发,写入页眉和页脚@Overridepublic void onEndPage(PdfWriter writer, Document document) {PdfContentByte cb =writer.getDirectContent();totalPage = cb.createTemplate(30, 16);PdfPTable table = new PdfPTable(3);try {table.setTotalWidth(PageSize.A4.getWidth() - 100);table.setWidths(new int[] { 24, 24, 3});table.setLockedWidth(true);table.getDefaultCell().setFixedHeight(-10);table.getDefaultCell().setBorder(Rectangle.BOTTOM);table.addCell(new Paragraph("我是页眉/页脚", hfFont));// 可以直接使用addCell(str),不过不能指定字体,中文无法显示table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT);table.addCell(new Paragraph("第" + writer.getPageNumber() + "页/", hfFont));// 总页数PdfPCell cell = new PdfPCell(Image.getInstance(totalPage));cell.setBorder(Rectangle.BOTTOM);table.addCell(cell);// 将页眉写到document中,位置可以指定,指定到下面就是页脚table.writeSelectedRows(0, -1, 50, PageSize.A4.getHeight() - 20, writer.getDirectContent());} catch (Exception de) {throw new ExceptionConverter(de);}}// 全部完成后,将总页数的pdf模版写到指定位置@Overridepublic void onCloseDocument(PdfWriter writer, Document document) {String text = "总" + (writer.getPageNumber()) + "页";ColumnText.showTextAligned(totalPage, Element.ALIGN_LEFT, new Paragraph(text,hfFont), 2, 2, 0);}}

如果想指定页眉为图片的可以用:

class PdfHeaderFooter extends PdfPageEventHelper {Font bfChinese;int fontSize = 10;Image image;@Overridepublic void onOpenDocument(PdfWriter writer, Document document) {try {bfChinese = new Font(BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED), fontSize, Font.NORMAL, BaseColor.GRAY);image = Image.getInstance(PDFUtil.class.getResource("/template/small.png"));image.scalePercent(50);image.setAbsolutePosition(8, document.top());} catch (Exception e) {throw new RuntimeException(e);}}@Overridepublic void onEndPage(PdfWriter writer, Document document) {try {Rectangle rect = new Rectangle(0, 38, 50, 50);String line1 = String.format("- %d -", writer.getPageNumber());ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER,new Phrase(line1, bfChinese),(document.rightMargin() + document.right() + document.leftMargin() - document.left() - bfChinese.getBaseFont().getWidthPoint(line1, fontSize) / 2) / 2.0F,document.bottom() - 22,0);String line2 = "本文件保密,未经允许,不得向任何第三方提供。";ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER,new Phrase(line2, bfChinese),(document.rightMargin() + document.right() + document.leftMargin() - document.left()) / 2.0F,document.bottom() - 32,0);writer.getDirectContent().addImage(image);} catch (Exception e) {throw new RuntimeException(e);}}}

最终要的就是下面的方法:

public static void main(String[] args) throws DocumentException, IOException {// Create output PDFDocument document = new Document(PageSize.A4);File file = new File("D:\\PDFDemo1.pdf");PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));document.open();PdfContentByte cb = writer.getDirectContent();writer.setPageEvent(new MyHeaderFooter());// 页眉/页脚// Load existing PDFFile file2 = new File("D:\\PDFDemo.pdf");PdfReader reader = new PdfReader(new FileInputStream(file2));PdfImportedPage page = writer.getImportedPage(reader, 1);// Copy first page of existing PDF into output PDFdocument.newPage();cb.addTemplate(page, 0, 0);// Add your new data / text here// for example...// document.addKeywords("Keywords@iTextpdf");// 关键字// document.addCreator("Creator@umiz`s");// 创建者// document.add(new Paragraph("my timestamp"));document.close();}

这个只是一页的,假如多页,可以获取源pdf的页面进行for循环就可以了。

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