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.Image;
import com.itextpdf.text.Phrase;
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.PdfWriter;
public class PdfFileExportUtil {
private static Font pdf8Font = null;
private static Font pdf20Font = null;
/**
*
* 设置PDF创建者信息
*
* @param pdfDocument
*/
public static Document setCreatorInfo(Document pdfDocument) {
if (pdfDocument == null) {
return null;
}
// 文档属性
pdfDocument.addTitle("XX公司PDF文档");
pdfDocument.addAuthor("XXX公司");
pdfDocument.addSubject("XX分析页");
pdfDocument.addKeywords("综合分析");// 文档关键字信息
pdfDocument.addCreator("XX数据平台");// 应用程序名称
return pdfDocument;
}
/**
*
* 获取中文字符集且是8号字体,常用作表格内容的字体格式
*
* @param fullFilePath
*/
public static Font getChinese8Font() throws DocumentException, IOException {
final String os1 = System.getProperty("os.name").toLowerCase();
BaseFont bfChinese=null;
if (pdf8Font == null) {
// 设置中文字体和字体样式
if("linux".equals(os1)){//此处使用系统字体
bfChinese=BaseFont.createFont("/usr/share/fonts/chinese/TrueType/ukai.ttf",
BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
}else{
bfChinese = BaseFont.createFont("c:\\windows\\fonts\\simkai.ttf",
BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
}
pdf8Font = new Font(bfChinese, 8, Font.NORMAL);
}
return pdf8Font;
}
/**
*
* 获取中文字符集且是8号字体,常用作文字水印信息
*
* @param fullFilePath
*/
public static Font getChinese20Font() throws DocumentException, IOException {
final String os1 = System.getProperty("os.name").toLowerCase();
BaseFont bfChinese=null;
if (pdf20Font == null) {
// 设置中文字体和字体样式
if("linux".equals(os1)){
bfChinese=BaseFont.createFont("/usr/share/fonts/chinese/TrueType/ukai.ttf",
BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
}else{
bfChinese = BaseFont.createFont("c:\\windows\\fonts\\simkai.ttf",
BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
}
pdf20Font = new Font(bfChinese);
pdf20Font.setSize(20);
pdf20Font.setColor(BaseColor.LIGHT_GRAY);
}
return pdf20Font;
}
/**
*
* 设置成只读权限
*
* @param pdfWriter
*/
public static PdfWriter setReadOnlyPDFFile(PdfWriter pdfWriter)
throws DocumentException {
pdfWriter.setEncryption(null, null, PdfWriter.ALLOW_PRINTING,
PdfWriter.STANDARD_ENCRYPTION_128);
return pdfWriter;
}
/**
*
* 变更一个图片对象的展示位置和角度信息
*
* @param waterMarkImage
*
* @param xPosition
*
* @param yPosition
*
* @return
*/
public static Image getWaterMarkImage(Image waterMarkImage,
float xPosition, float yPosition) {
waterMarkImage.setAbsolutePosition(xPosition, yPosition);// 坐标
waterMarkImage.setRotation(-20);// 旋转 弧度
waterMarkImage.setRotationDegrees(-45);// 旋转 角度
waterMarkImage.scalePercent(100);// 依照比例缩放
return waterMarkImage;
}
/**
*
* 为PDF分页时创建添加文本水印的事件信息
*/
public class TextWaterMarkPdfPageEvent extends PdfPageEventHelper {
private String waterMarkText;
public TextWaterMarkPdfPageEvent(String waterMarkText) {
this.waterMarkText = waterMarkText;
}
public void onEndPage(PdfWriter writer, Document document) {
try {
float pageWidth = document.right() + document.left();// 获取pdf内容正文页面宽度
float pageHeight = document.top() + document.bottom();// 获取pdf内容正文页面高度
// 设置水印字体格式
Font waterMarkFont = PdfFileExportUtil.getChinese20Font();
PdfContentByte waterMarkPdfContent = writer.getDirectContent();//决定了水印图层高低
Phrase phrase = new Phrase(waterMarkText, waterMarkFont);
for(int i = 0 ; i < 100; i ++){
for(int j = 0 ; j < 20 ; j ++ ){
ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER, phrase,pageWidth * 0.8f * j, pageHeight * 0.16f * i, 45);
}
}
} catch (DocumentException de) {
de.printStackTrace();
System.err.println("pdf watermark font:" + de.getMessage());
} catch (IOException de) {
de.printStackTrace();
System.err.println("pdf watermark font:" + de.getMessage());
}
}
}
/**
*
* 为PDF分页时创建添加图片水印的事件信息
*/
public class PictureWaterMarkPdfPageEvent extends PdfPageEventHelper {
private String waterMarkFullFilePath;
private Image waterMarkImage;
public PictureWaterMarkPdfPageEvent(String waterMarkFullFilePath) {
this.waterMarkFullFilePath = waterMarkFullFilePath;
}
public void onEndPage(PdfWriter writer, Document document) {
try {
float pageWidth = document.right() + document.left();// 获取pdf内容正文页面宽度
float pageHeight = document.top() + document.bottom();// 获取pdf内容正文页面高度
PdfContentByte waterMarkPdfContent = writer.getDirectContent();
// 仅设置一个图片实例对象,整个PDF文档只应用一个图片对象,极大减少因为增加图片水印导致PDF文档大小增加
if (waterMarkImage == null) {
waterMarkImage = Image.getInstance(waterMarkFullFilePath);
}
// 添加水印图片,文档正文内容采用横向三列,竖向两列模式增加图片水印
for(int i = 0 ; i < 100; i ++){
for(int j = 0 ; j < 4 ; j ++ ){
waterMarkPdfContent.addImage(getWaterMarkImage(waterMarkImage,pageWidth * 0.3f * j , pageHeight * 0.05f * i));
}
}
PdfGState gs = new PdfGState();
gs.setFillOpacity(0.8f);// 设置透明度为0.2
gs.setStrokeOpacity(0.8f);
gs.setOverPrintStroking(true);
waterMarkPdfContent.setGState(gs);
} catch (DocumentException de) {
de.printStackTrace();
System.err.println("pdf watermark font:" + de.getMessage());
} catch (IOException de) {
de.printStackTrace();
System.err.println("pdf watermark font:" + de.getMessage());
}
}
}
/**
*
* 为PDF分页时创建添加header和footer信息的事件信息
*/
public class HeadFootInfoPdfPageEvent extends PdfPageEventHelper {
public HeadFootInfoPdfPageEvent() {
}
public void onEndPage(PdfWriter writer, Document document) {
try {
PdfContentByte headAndFootPdfContent = writer
.getDirectContent();
headAndFootPdfContent.saveState();
headAndFootPdfContent.beginText();
final String os1 = System.getProperty("os.name").toLowerCase();
BaseFont bfChinese=null;
if("linux".equals(os1)){
bfChinese=BaseFont.createFont("/usr/share/fonts/chinese/TrueType/ukai.ttf",
BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
}else{
bfChinese = BaseFont.createFont("c:\\windows\\fonts\\simkai.ttf",
BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
}
headAndFootPdfContent.setFontAndSize(bfChinese, 10);
// 文档页头信息设置
float x = document.top(-20);
// 页头信息左面
headAndFootPdfContent.showTextAligned(
PdfContentByte.ALIGN_LEFT,
"综合分析",
document.left(), x, 0);
// 页头信息中间
headAndFootPdfContent.showTextAligned(
PdfContentByte.ALIGN_CENTER,
"第" + writer.getPageNumber() + "页",
(document.right() + document.left()) / 2,
x, 0);
// 页头信息右面
headAndFootPdfContent.showTextAligned(
PdfContentByte.ALIGN_RIGHT,
"XXX公司",
document.right(), x, 0);
// 文档页脚信息设置
float y = document.bottom(-20);
// 页脚信息左面
headAndFootPdfContent.showTextAligned(
PdfContentByte.ALIGN_LEFT,
"--",
document.left(), y, 0);
// 页脚信息中间
headAndFootPdfContent.showTextAligned(
PdfContentByte.ALIGN_CENTER,
"-",
(document.right() + document.left()) / 2,
y, 0);
// 页脚信息右面
headAndFootPdfContent.showTextAligned(
PdfContentByte.ALIGN_RIGHT,
"--",
document.right(), y, 0);
headAndFootPdfContent.endText();
headAndFootPdfContent.restoreState();
} catch (DocumentException de) {
de.printStackTrace();
System.err.println("pdf watermark font:" + de.getMessage());
} catch (IOException de) {
de.printStackTrace();
System.err.println("pdf watermark font:" + de.getMessage());
}
}
}
}
//resultlist为pdf表格中数据
public String exportPdf(String title,List resultlist,String fileName,HttpServletResponse response){
try{
String waterMarkName="XXX";
// 第一步,实例化一个document对象
Document document = new Document();
// 第三步,设置字符
BaseFont bfChinese=null;
final String os1 = System.getProperty("os.name").toLowerCase();
System.out.println("=============================="+os1);
// 设置中文字体和字体样式
if("linux".equals(os1)){
bfChinese=BaseFont.createFont("/usr/share/fonts/chinese/TrueType/ukai.ttf",
BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
}else{
bfChinese = BaseFont.createFont("c:\\windows\\fonts\\simkai.ttf",
BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
}
Font fontZH = new Font(bfChinese, 12.0F, 0);
//如果是浏览器通过request请求需要在浏览器中输出则使用下面方式
ByteArrayOutputStream buff=new ByteArrayOutputStream();
// 第四步,将pdf文件输出到磁盘
PdfWriter writer = PdfWriter.getInstance(document, buff);
//writer=PdfFileExportUtil.setReadOnlyPDFFile(writer);
// 第五步,打开生成的pdf文件
document.open();
PdfFileExportUtil pdfFileExportUtil = new PdfFileExportUtil();
//添加水印
writer.setPageEvent(pdfFileExportUtil.new TextWaterMarkPdfPageEvent("XXXXXXXX"));
//添加页眉页脚
//writer.setPageEvent(pdfFileExportUtil.new HeadFootInfoPdfPageEvent());
// 第六步,设置内容
document.add(new Paragraph(new Chunk(title, fontZH).setLocalDestination(title)));
document.add(new Paragraph("\n"));
// 创建table,注意这里的9是9列的意思,下面通过table.addCell添加的时候必须添加整行内容的所有列
PdfPTable table = new PdfPTable(9);
//table.setWidthPercentage(100.0F);
//table.setTotalWidth(1000.0F);//设置表格的总宽度
table.setTotalWidth(new float[] {50.0F,50.0F,70.0F,100.0F,50.0F,50.0F,50.0F,50.0F,50.0F});//设置表格的各列宽度
//table.setWidths(new int[] {1,1,1,2,1,1,1,1,1});
table.setLockedWidth(true);
table.setHeaderRows(1);
table.getDefaultCell().setHorizontalAlignment(1);
table.addCell(new Paragraph("X1", fontZH));
table.addCell(new Paragraph("X2", fontZH));
table.addCell(new Paragraph("X3", fontZH));
int record=resultlist.size();
for (int i = 0; i < record; i++) {
Object[] objArr =(Object[]) resultlist.get(i);
for(int j=0;j<objArr.length;j++){
table.addCell(new Paragraph(objArr[j] == null ? "" : objArr[j].toString(),fontZH));
}
}
document.add(table);
document.add(new Paragraph("\n"));
document.add(new Paragraph(new Chunk(title, fontZH).setLocalDestination(title2)));
document.add(new Paragraph("\n"));
// 第七步,关闭document
document.close();
iStream=new ByteArrayInputStream(buff.toByteArray());
response.reset();
response.setContentType("application/x-msdownload;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename=" + new String((fileName+ ".pdf").getBytes("gbk"), "iso-8859-1"));
ServletOutputStream oStream = response.getOutputStream();
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
bis = new BufferedInputStream(iStream);
bos = new BufferedOutputStream(oStream);
byte[] buffer = new byte[2048];
int bytesRead;
while(-1 != (bytesRead = bis.read(buffer,0,buffer.length))){
bos.write(buffer,0 ,bytesRead);
}
} catch (Exception e) {
throw e;
} finally {
try {
if(bis != null){
bis.close();
}
if(bos != null){
bos.close();
}
if(iStream != null){
iStream.close();
}
if(oStream != null){
oStream.close();
}
if(buff != null){
buff.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
}catch(Exception e){
e.getStackTrace();
}
return "success";
}