项目需要导出PDF,导出的内容包含图片和文本,而且图片的数量不确定,在网上百度发现大家都在用iText,在官网发现可以把html转换为PDF,但是需要收费,那就只能自己写了。

在开始之前先在网上百度了一下,发现网上的博客都是一大堆代码,注释也没几句,根本看不懂,所以就去了官网,官网的快速开始是iText7,在使用过程中发现如果文档中有图片,水印会被图片遮盖,找了好久也没找到怎么设置,网上大部分都是iText5的设置方法,所以就弃用了iText7。

1.添加依赖:

         <dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.</version>
</dependency> <dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.</version>
</dependency>

2.首先还是从helloWorld开始

public static final String DEST = "D:/biolims/results/chapter01/hello_world.pdf";
public static final String[] IMAGES = { "C:/Users/Administrator/Pictures/Screenshots/屏幕截图(1).png",
"C:/Users/Administrator/Pictures/20190830133125.png" }; public static void main(String args[]) throws Exception {
File file = new File(DEST);
file.getParentFile().mkdirs();
new Test().createPdf(DEST);
} public void createPdf(String dest) throws Exception {
// 第一步 创建文档实例
Document document = new Document();
// 第二步 获取PdfWriter实例
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
// 第三步 打开文档
document.open();
// 第四步 添加段落内容
document.add(new Paragraph("Hello World!")); // 第五部 操作完成后必须执行文档关闭操作。
document.close(); System.out.print("生成成功");
}

2.添加图片及文本(目前iText支持的图像有:GIF,JPEG,PNG,BMP等格式,对于不同的图像格式,iText用同样的构造函数自动识别图像格式):

注:后来客户又要导出图注,格式是上面是图片,图片的下面是图注,图注为文字,出现了一个问题,就是上一页剩余的空间不足够放图片了,所以图片到了下一页,但是上一页的空间可以放下图注,那么图注就会跑到上一页,导致格式错乱,这时候只要在创建PdfWriter后加上这句代码就可以了(

writer.setStrictImageSequence(true); //设置图片是否精确放置,选择是(true),否(false):)

 import com.biolims.file.util.PDFEventHandler;
import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter; public static final String DEST = "D:/biolims/results/chapter01/hello_world.pdf";
public static final String[] IMAGES = { "C:/Users/Administrator/Pictures/Screenshots/屏幕截图(1).png",
"C:/Users/Administrator/Pictures/20190830133125.png" }; public static void main(String args[]) throws Exception {
File file = new File(DEST);
file.getParentFile().mkdirs();
new Test().createPdf(DEST);
} public void createPdf(String dest) throws Exception {
// 第一步 创建文档实例
Document document = new Document();
// 第二步 获取PdfWriter实例
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest)); // 第三步 打开文档
document.open();
// 第四步 添加段落内容
document.add(new Paragraph("Hello World!"));
for(int i = 0;i<IMAGES.length;i++) {
Image image = Image.getInstance(IMAGES[i]);
float documentWidth = document.getPageSize().getWidth() - document.leftMargin() - document.rightMargin();
float documentHeight = documentWidth / 580 * 320;//重新设置宽高
image.scaleAbsolute(documentWidth, documentHeight);//重新设置宽高
document.add(image);
} // 第五部 操作完成后必须执行文档关闭操作。
document.close(); System.out.print("生成成功");
}

3.添加页眉页脚以及水印(使用PDF事件添加,PdfPageEventHelper是事件类)(客户需要的页眉页脚既有图片也有文字,写在了最下方)

PdfPageEventHelper中包含以下事件处理器。

onOpenDocument() — 当打开一个文档时触发,可以用于初始化文档的全局变量。
       onStartPage() — 当一个页面初始化时触发,可用于初始化页面的设置参数,但是注意这个函数触发时,该页面并没有创建好,不用利用这个函数添加内容,最好利用onEndPage()处理页面的初始化。
       onEndPage() — 在创建一个新页面完成但写入内容之前触发,是添加页眉、页脚、水印等最佳时机。

onCloseDocument() — 在文档关闭之前触发,可以用于释放一些资源。

onCloseDocument() — 在文档关闭之前触发,可以用于释放一些资源。

package com.biolims.file.util;

import java.io.IOException;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfTemplate;
import com.itextpdf.text.pdf.PdfWriter; public class PDFEventHandler extends PdfPageEventHelper { /**
* 页眉
*/
public String header = ""; /**
* 文档字体大小,页脚页眉最好和文本大小一致
*/
public int presentFontSize = 12; /**
* 文档页面大小,最好前面传入,否则默认为A4纸张
*/
public Rectangle pageSize = PageSize.A4; // 模板
public PdfTemplate total; // 基础字体对象
public BaseFont bf = null; // 利用基础字体生成的字体对象,一般用于生成中文文字
public Font fontDetail = null;
/***
* 水印
*/
public String watermark = ""; /**
*
* Creates a new instance of PdfReportM1HeaderFooter 无参构造方法.
*
*/
public PDFEventHandler() { } /**
*
* Creates a new instance of PdfReportM1HeaderFooter 构造方法.
*
* @param yeMei 页眉字符串
* @param presentFontSize 数据体字体大小
* @param pageSize 页面文档大小,A4,A5,A6横转翻转等Rectangle对象
* @param watermark 水印字符串
*/
public PDFEventHandler(String yeMei, int presentFontSize, Rectangle pageSize,String watermark) {
this.header = yeMei;
this.presentFontSize = presentFontSize;
this.pageSize = pageSize;
this.watermark = watermark;
} public void setHeader(String header) {
this.header = header;
} public void setPresentFontSize(int presentFontSize) {
this.presentFontSize = presentFontSize;
} public void setWatermark(String watermark) {
this.watermark = watermark;
} /**
*
* TODO 文档打开时创建模板
*
* @see com.itextpdf.text.pdf.PdfPageEventHelper#onOpenDocument(com.itextpdf.text.pdf.PdfWriter,
* com.itextpdf.text.Document)
*/
public void onOpenDocument(PdfWriter writer, Document document) {
total = writer.getDirectContent().createTemplate(50, 50);// 共 页 的矩形的长宽高
} /**
*
* TODO 关闭每页的时候,写入页眉,写入'第几页共'这几个字。
*
* @see com.itextpdf.text.pdf.PdfPageEventHelper#onEndPage(com.itextpdf.text.pdf.PdfWriter,
* com.itextpdf.text.Document)
*/
public void onEndPage(PdfWriter writer, Document document) { try {
if (bf == null) {
bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);
}
if (fontDetail == null) {
fontDetail = new Font(bf, presentFontSize, Font.NORMAL);// 数据体字体
}
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} // 1.写入页眉
ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_LEFT, new Phrase(header, fontDetail),
document.left() / 2, document.top() + 20, 0); // 2.写入前半部分的 第 X页/共
int pageS = writer.getPageNumber();
String foot1 = "第 " + pageS + " 页 /共";
Phrase footer = new Phrase(foot1, fontDetail); // 3.计算前半部分的foot1的长度,后面好定位最后一部分的'Y页'这俩字的x轴坐标,字体长度也要计算进去 = len
float len = bf.getWidthPoint(foot1, presentFontSize); // 4.拿到当前的PdfContentByte
PdfContentByte cb = writer.getDirectContent();//如果用getDirectContentUnder方法,如果PDF中有图片,那么水印会被覆盖 // 自己增加的
// if(pageS==1){
// Phrase footerLeft = new Phrase("978-1-4799-0530-031.00 ©2013 IEEE", fontDetail);
// ColumnText.showTextAligned(cb, Element.ALIGN_LEFT, footerLeft, document.left(), document.bottom() - 20, 0);
// } // 5.写入页脚1,x轴就是(右margin+左margin + right() -left()- len)/2.0F
// 再给偏移20F适合人类视觉感受,否则肉眼看上去就太偏左了
// ,y轴就是底边界-20,否则就贴边重叠到数据体里了就不是页脚了;注意Y轴是从下往上累加的,最上方的Top值是大于Bottom好几百开外的。
ColumnText.showTextAligned(cb, Element.ALIGN_CENTER, footer,
(document.rightMargin() + document.right() + document.leftMargin() - document.left() - len) / 2.0F
+ 20F,
document.bottom() - 20, 0); // 6.写入页脚2的模板(就是页脚的Y页这俩字)添加到文档中,计算模板的和Y轴,X=(右边界-左边界 - 前半部分的len值)/2.0F + len , y
// 轴和之前的保持一致,底边界-20
cb.addTemplate(total,
(document.rightMargin() + document.right() + document.leftMargin() - document.left()) / 2.0F + 20F,
document.bottom() - 20); // 调节模版显示的位置 // 文字水印
PdfGState gs = new PdfGState();
// 开始
cb.beginText();
gs.setFillOpacity(0.3f);
gs.setStrokeOpacity(0.3f);
cb.saveState();
cb.setGState(gs);
// 设置颜色
cb.setColorFill(BaseColor.RED);
// 设置字体及字号
try {
cb.setFontAndSize(BaseFont.createFont(), 300);
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 设置起始位置
cb.setTextMatrix(298, 421);
// 开始写入水印
cb.showTextAligned(Element.ALIGN_CENTER, watermark, 298, 421, 45);
cb.restoreState();
// 结束
cb.endText(); } /**
*
* TODO 关闭文档时,替换模板,完成整个页眉页脚组件
*
* @see com.itextpdf.text.pdf.PdfPageEventHelper#onCloseDocument(com.itextpdf.text.pdf.PdfWriter,
* com.itextpdf.text.Document)
*/
public void onCloseDocument(PdfWriter writer, Document document) {
// 7.最后一步了,就是关闭文档的时候,将模板替换成实际的 Y 值,至此,page x of y 制作完毕,完美兼容各种文档size。
total.beginText();
total.setFontAndSize(bf, presentFontSize);// 生成的模版的字体、颜色
String foot2 = " " + (writer.getPageNumber()) + " 页";
total.showText(foot2);// 模版显示的内容
total.endText();
total.closePath();
} }

4.最后,在document.open();上方添加事件

 //PDF事件类
PDFEventHandler pdfEventHandler = new PDFEventHandler("页眉",12,PageSize.A4,"水印");
//给当前PDF添加事件(页眉,页脚,水印)
writer.setPageEvent(pdfEventHandler);

5.客户想要的页眉页脚有图片加文字,百度了一下好像没有设置图片的方法,所以我用的定位把内容定位到了页眉页脚的位置

package com.biolims.file.util;

import java.io.IOException;
import java.net.MalformedURLException; import com.biolims.file.test.Test;
import com.itextpdf.text.BadElementException;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfTemplate;
import com.itextpdf.text.pdf.PdfWriter; public class PDFEventHandler extends PdfPageEventHelper { /**
* 页眉
*/
public String header = ""; /**
* 文档字体大小,页脚页眉最好和文本大小一致
*/
public int presentFontSize = ; /**
* 文档页面大小,最好前面传入,否则默认为A4纸张
*/
public Rectangle pageSize = PageSize.A4; // 模板
public PdfTemplate total; // 基础字体对象
public BaseFont bf = null; // 利用基础字体生成的字体对象,一般用于生成中文文字
public Font fontDetail = null;
/***
* 水印
*/
public String watermark = ""; /**
*
* Creates a new instance of PdfReportM1HeaderFooter 无参构造方法.
*
*/
public PDFEventHandler() { } /**
*
* Creates a new instance of PdfReportM1HeaderFooter 构造方法.
*
* @param yeMei 页眉字符串
* @param presentFontSize 数据体字体大小
* @param pageSize 页面文档大小,A4,A5,A6横转翻转等Rectangle对象
* @param watermark 水印字符串
*/
public PDFEventHandler(String yeMei, int presentFontSize, Rectangle pageSize, String watermark) {
this.header = yeMei;
this.presentFontSize = presentFontSize;
this.pageSize = pageSize;
this.watermark = watermark;
} public void setHeader(String header) {
this.header = header;
} public void setPresentFontSize(int presentFontSize) {
this.presentFontSize = presentFontSize;
} public void setWatermark(String watermark) {
this.watermark = watermark;
} /**
*
* TODO 文档打开时创建模板
*
* @see com.itextpdf.text.pdf.PdfPageEventHelper#onOpenDocument(com.itextpdf.text.pdf.PdfWriter,
* com.itextpdf.text.Document)
*/
public void onOpenDocument(PdfWriter writer, Document document) {
total = writer.getDirectContent().createTemplate(, );// 共 页 的矩形的长宽高
} /**
*
* TODO 关闭每页的时候,写入页眉,写入'第几页共'这几个字。
*
* @see com.itextpdf.text.pdf.PdfPageEventHelper#onEndPage(com.itextpdf.text.pdf.PdfWriter,
* com.itextpdf.text.Document)
*/
public void onEndPage(PdfWriter writer, Document document) { try {
if (bf == null) {
bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);
}
if (fontDetail == null) {
fontDetail = new Font(bf, presentFontSize, Font.NORMAL);// 数据体字体
}
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} // 1.写入页眉
// ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_LEFT, new Phrase(header, fontDetail),
// (document.rightMargin() + document.right() + document.leftMargin() - document.left()) / 2.0F,
// document.top() + 20, 0); // 2.写入前半部分的 第 X页/共
// int pageS = writer.getPageNumber();
// String foot1 = "第 " + pageS + " 页 /共";
// Phrase footer = new Phrase(foot1, fontDetail);
//
// // 3.计算前半部分的foot1的长度,后面好定位最后一部分的'Y页'这俩字的x轴坐标,字体长度也要计算进去 = len
// float len = bf.getWidthPoint(foot1, presentFontSize);
//
// // 4.拿到当前的PdfContentByte
PdfContentByte cb = writer.getDirectContent();// 如果用getDirectContentUnder方法,如果PDF中有图片,那么水印会被覆盖 // 自己增加的
// if(pageS==1){
// Phrase footerLeft = new Phrase("978-1-4799-0530-031.00 ©2013 IEEE", fontDetail);
// ColumnText.showTextAligned(cb, Element.ALIGN_LEFT, footerLeft, document.left(), document.bottom() - 20, 0);
// } // 5.写入页脚1,x轴就是(右margin+左margin + right() -left()- len)/2.0F
// 再给偏移20F适合人类视觉感受,否则肉眼看上去就太偏左了
// ,y轴就是底边界-20,否则就贴边重叠到数据体里了就不是页脚了;注意Y轴是从下往上累加的,最上方的Top值是大于Bottom好几百开外的。
// ColumnText.showTextAligned(cb, Element.ALIGN_CENTER, footer,
// (document.rightMargin() + document.right() + document.leftMargin() - document.left() - len) / 2.0F
// + 20F,
// document.bottom() - 20, 0);
//
// // 6.写入页脚2的模板(就是页脚的Y页这俩字)添加到文档中,计算模板的和Y轴,X=(右边界-左边界 - 前半部分的len值)/2.0F + len , y
// // 轴和之前的保持一致,底边界-20
// cb.addTemplate(total,
// (document.rightMargin() + document.right() + document.leftMargin() - document.left()) / 2.0F + 20F,
// document.bottom() - 20); // 调节模版显示的位置 // 图片页眉 try {
Image image = Image.getInstance("C:\\Users\\Administrator\\Desktop\\1576139413(1).jpg");
float documentWidth = 7.21f * ;
float documentHeight = 1.34f * ;// 重新设置宽高
image.scaleAbsolute(documentWidth, documentHeight);// 重新设置宽高
// 设置图片绝对位置
image.setAbsolutePosition(document.left(), document.top() - );
document.add(image); // 加载文本
cb.beginText();
// 设置文本为中文、和字体大小
cb.setFontAndSize(bf, );
cb.setColorFill(BaseColor.BLUE);
// 设置文本绝对坐标
cb.setTextMatrix(document.left() + , document.top()); // 设置文本
cb.showText("Innovative Models to Empower Health Sciences");
cb.endText(); Image image2 = Image.getInstance("C:\\Users\\Administrator\\Desktop\\1576139562(1).jpg");
float documentWidth2 = document.rightMargin() + document.right() - document.leftMargin() - document.left();
float documentHeight2 = 5.0f;// 重新设置宽高
image2.scaleAbsolute(documentWidth2, documentHeight2);// 重新设置宽高
// 设置图片绝对位置
image2.setAbsolutePosition(document.left(), document.top() - );
document.add(image2); } catch (Exception e1) {
e1.printStackTrace();
}
// end图片页眉 // 图片页脚
try {
Image image2 = Image.getInstance("C:\\Users\\Administrator\\Desktop\\1576139562(1).jpg");
float documentWidth2 = document.rightMargin() + document.right() - document.leftMargin() - document.left();
float documentHeight2 = 5.0f;// 重新设置宽高
image2.scaleAbsolute(documentWidth2, documentHeight2);// 重新设置宽高
// 设置图片绝对位置
image2.setAbsolutePosition(document.left(), document.bottom() - 8);
document.add(image2); // 加载文本
cb.beginText();
// 设置文本为中文、和字体大小
cb.setFontAndSize(bf, );
cb.setColorFill(BaseColor.BLACK);
// 设置文本绝对坐标
cb.setTextMatrix(document.left(), document.bottom() - ); // 设置文本
cb.showText("Biocytogen Boston Corp. ");
cb.endText(); // 加载文本
cb.beginText();
// 设置文本为中文、和字体大小
cb.setFontAndSize(bf, );
cb.setColorFill(BaseColor.BLACK);
// 设置文本绝对坐标
cb.setTextMatrix(document.left(), document.bottom() - 24); // 设置文本
cb.showText("50CAudubon Rd, Wakefield, MA 01880. Ph: (781)-587-3558. ");
cb.endText(); // 加载文本
cb.beginText();
// 设置文本为中文、和字体大小
cb.setFontAndSize(bf, );
cb.setColorFill(BaseColor.BLACK);
// 设置文本绝对坐标
cb.setTextMatrix(document.left(), document.bottom() - 32); // 设置文本
cb.showText("Email: info@biocytogen.com. http://www.biocytogen.com");
cb.endText(); } catch (Exception e1) {
e1.printStackTrace();
}
// end图片页脚 // 文字水印
PdfGState gs = new PdfGState();
// 开始
cb.beginText();
gs.setFillOpacity(0.3f);
gs.setStrokeOpacity(0.3f);
cb.saveState();
cb.setGState(gs);
// 设置颜色
cb.setColorFill(BaseColor.GRAY);
// 设置字体及字号
try {
cb.setFontAndSize(BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED), );
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 设置起始位置
cb.setTextMatrix(, );
// 开始写入水印
cb.showTextAligned(Element.ALIGN_CENTER, watermark, , , );
cb.restoreState();
// 结束
cb.endText(); } /**
*
* TODO 关闭文档时,替换模板,完成整个页眉页脚组件
*
* @see com.itextpdf.text.pdf.PdfPageEventHelper#onCloseDocument(com.itextpdf.text.pdf.PdfWriter,
* com.itextpdf.text.Document)
*/
public void onCloseDocument(PdfWriter writer, Document document) {
// 7.最后一步了,就是关闭文档的时候,将模板替换成实际的 Y 值,至此,page x of y 制作完毕,完美兼容各种文档size。
total.beginText();
total.setFontAndSize(bf, presentFontSize);// 生成的模版的字体、颜色
String foot2 = " " + (writer.getPageNumber()) + " 页";
total.showText(foot2);// 模版显示的内容
total.endText();
total.closePath();
} }

最后附上效果图(下面的那张图片被拉伸了,请忽略)

参考博客:

https://blog.csdn.net/younkerjqb/article/details/14125955

https://www.cnblogs.com/tankqiu/p/4412898.html

iText导出PDF(图片,水印,页眉,页脚)的更多相关文章

  1. iText + Freemarker实现pdf的导出,支持中文、css以及图片,页眉页脚,页眉添加图片

    本文为了记录自己的实现过程,具体的实现步骤是参考博文 https://www.cnblogs.com/youzhibing/p/7692366.html 来实现的,只是在他的基础上添加了页眉页脚及页眉 ...

  2. c# iText 生成PDF 有文字,图片,表格,文字样式,对齐方式,页眉页脚,等等等,

    #region 下载说明书PDF protected void lbtnDownPDF_Click(object sender, EventArgs e) { int pid = ConvertHel ...

  3. itext 生成pdf文件添加页眉页脚

    原文来自:https://www.cnblogs.com/joann/p/5511905.html 我只是记录所有jar版本,由于版本冲突及不兼容很让人头疼的,一共需要5个jar, 其中itextpd ...

  4. 【Itext】7步制作Itext5页眉页脚pdf实现第几页共几页

    itext5页眉页脚工具类,实现page x of y 完美兼容各种格式大小文档A4/B5/B3,兼容各种文档格式自动计算页脚XY轴坐标 鉴于没人做的这么细致,自己就写了一个itext5页眉页脚工具类 ...

  5. Itext导出PDF,word,图片案例

    iText导出pdf.word.图片 一.前言 在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过在服务器端使用Jsp或JavaBean生 ...

  6. 怎么给PDF去除页眉页脚

    PDF文件我们现在都会使用到,但有时需编辑PDF文件的时候,小伙伴们都知道该怎么操作吗,不知道的小伙伴不用担心,今天小编就来跟大家分享一下怎么删除PDF文件的页眉页脚,我们一起来看看下面的文章吧 操作 ...

  7. ABBYY FineReader 15 如何为PDF文档添加页眉页脚

    页眉.页脚是文档页面顶部或底部重复出现的文本信息.很多用户会习惯在文档页面的顶部与底部区域添加页眉.页脚来展现页码.文档标题.作者姓名.品牌名称等附加信息.而ABBYY FineReader 15(W ...

  8. 【itext】7步制作兼容各种文档格式的Itext5页眉页脚 实现page x pf y

    itext5页眉页脚工具类,实现page x of y 完美兼容各种格式大小文档A4/B5/B3,兼容各种文档格式自动计算页脚XY轴坐标 鉴于没人做的这么细致,自己就写了一个itext5页眉页脚工具类 ...

  9. C#word(2007)操作类--新建文档、添加页眉页脚、设置格式、添加文本和超链接、添加图片、表格处理、文档格式转化

    转:http://www.cnblogs.com/lantionzy/archive/2009/10/23/1588511.html 1.新建Word文档 #region 新建Word文档/// &l ...

随机推荐

  1. 1px渲染成2px的场景及解决方案

    1.场景一: IE6 下默认div最小高度为2px,如何创建高为1px的容器? .minContainer{font-size:0px;overflow:hidden}   2.场景二: 移动端高分辨 ...

  2. WPF Good UI 2

    自定义一个漂亮的window窗口UI <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation& ...

  3. RFC、EMCA-262、TC-39等名词

    请求意见稿(英语:Request For Comments,缩写:RFC)是一系列备忘录. The RFC series contains technical and organizational d ...

  4. 通过git新增、更新代码内容到github

    github可用于个人用户托管公开项目,对于异地上传下载十分方便 1.  准备工作 2.  首次上传执行命令集合 3.  更新执行命令集合 4.  命令总结 1.准备工作 a.注册github帐号 , ...

  5. 类HashMap

    /* * Map集合的特点 * 将键映射值的对象,一个映射不能包含重复的值:每个键最多只能映射到一个值 * * Map集合和Collection集合的区别? * Map集合存储元素是成对出现的,Map ...

  6. VUe.js 父组件向子组件中传值及方法

    父组件向子组件中传值 1.  Vue实例可以看做是大的组件,那么在其内部定义的私有组件与这个实例之间就出现了父子组件的对应关系. 2. 父子组件在默认的情况下,子组件是无妨访问到父组件中的数据的,所以 ...

  7. SVG.JS 画弧线

    需求描述: 使用svg.js,绘制一个弧线.下图绿色弧线. 准备工作: 1.了解SVG Path中的A指令 详细文档,请戳这里 给定x半径.y半径后,经过指定的两点,可以有2个椭圆,因此两点间有2条弧 ...

  8. python基础-7.3模块 configparser logging subprocess os.system shutil

    1. configparser模块 configparser用于处理特定格式的文件,其本质上是利用open来操作文件. 继承至2版本 ConfigParser,实现了更多智能特征,实现更有可预见性,新 ...

  9. python 重点理论知识点

    Python多线程 GIL blablabla concurrent blablabla 简单地说就是作为可能是仅有的支持多线程的解释型语言(perl的多线程是残疾,PHP没有多线程),Python的 ...

  10. 使用JS增加标签

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...