自个整理的一个生成PDF的常用方法:
package com.huangt.util.function;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import javax.swing.ImageIcon;
import com.lowagie.text.Document;
import com.lowagie.text.HeaderFooter;
import com.lowagie.text.Image;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Phrase;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;
import com.lowagie.text.pdf.PdfWriter;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import de.schlichtherle.io.FileReader;
public class PDFUtils {
/**
* 生成水印的图片
* @author huangt
* @time 2012.6.14
*
*/
public static void createJpgByFont(String str, String jpgName) {
try {
// 宽度 高度
final int smallWidth = 60 ;
BufferedImage bimage = new BufferedImage((str.length() + 3)
* smallWidth/2,smallWidth, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bimage.createGraphics();
g.setColor(Color.WHITE); // 背景色
g.fillRect(0, 0, smallWidth * (str.length() + 2),smallWidth); // 画一个矩形
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
// 去除锯齿(当设置的字体过大的时候,会出现锯齿)
g.setColor(Color.LIGHT_GRAY); // 字的颜色
File file = new File("C:/WINDOWS/Fonts/Arial.ttf"); // 字体文件
Font font = Font.createFont(Font.TRUETYPE_FONT, file);
// 根据字体文件所在位置,创建新的字体对象(此语句在jdk1.5下面才支持)
g.setFont(font.deriveFont((float) smallWidth));
g.drawString(str,0,smallWidth);
//旋转图片
bimage = PDFUtils.rotateImage(bimage, -45);
// 在指定坐标除添加文字
g.dispose();
FileOutputStream out = new FileOutputStream(jpgName); // 指定输出文件
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bimage);
param.setQuality(50f, true);
encoder.encode(bimage, param); // 存盘
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* txt文件转换为pdf文件
* @author huangt
* @time 2012.6.14
* @param txtFile txt文件路径
* @param pdfFile pdf文件路径
* @param userPassWord 用户密码
* @param waterMarkName 水印内容
* @param permission 操作权限
*/
public static void generatePDFWithTxt(String txtFile, String pdfFile,
String userPassWord, String waterMarkName) {
try {
// 生成临时文件
File file = File.createTempFile("huangt", ".pdf");
// 创建pdf文件到临时文件
if (createPDFFile(txtFile, file)) {
// 增加水印和加密
//waterMark(file.getPath(), pdfFile,waterMarkName);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @author huangt
* @time 2012.6.14
* 创建PDF文档
*
* @param txtFilePath txt文件路径(源文件)
* @param pdfFilePath pdf文件路径(新文件)
*/
private static boolean createPDFFile(String txtFilePath, File file) {
// 设置纸张
Rectangle rect = new Rectangle(PageSize.A4);
// 设置页码
HeaderFooter footer = new HeaderFooter(new Phrase("页码:"), true);
footer.setBorder(Rectangle.NO_BORDER);
// step1
Document doc = new Document(rect, 50, 50, 50, 50);
doc.setFooter(footer);
try {
FileReader fileRead = new FileReader(txtFilePath);
BufferedReader read = new BufferedReader(fileRead);
// 设置pdf文件生成路径 step2
PdfWriter.getInstance(doc, new FileOutputStream(file));
// 打开pdf文件 step3
doc.open();
// 实例化Paragraph 获取写入pdf文件的内容,调用支持中文的方法. step4
while (read.ready()) {
// 添加内容到pdf(这里将会按照txt文件的原始样式输出)
doc.add(new Paragraph(read.readLine()));
}
// 关闭pdf文件 step5
doc.close();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 在pdf文件中添加水印
* @author huangt
* @time 2012.6.14
* @param inputFile 原始文件
* @param outputFile 水印输出文件
* @param waterMarkName 水印名字
* @param picPath 图片的路径
*/
public static void waterMark(String inputFile,String outputFile,String waterMarkName,String picPath) {
try {
PdfReader reader = new PdfReader(inputFile);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(
outputFile));
int total = reader.getNumberOfPages() + 1;
//生成水印图片
createJpgByFont(waterMarkName, picPath) ;
Image image = Image.getInstance(picPath);
image.setAbsolutePosition(0,100);
PdfContentByte under;
for (int i = 1; i < total; i++) {
under = stamper.getUnderContent(i);
// 添加图片
under.addImage(image);
}
stamper.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 图片旋转
* @author huangt
* @time 2012.6.14
*
*/
public static BufferedImage rotateImage(final BufferedImage bufferedimage,
final int degree){
int w = bufferedimage.getWidth();
int h = bufferedimage.getHeight();
int b = w>h?w:h ;
int type = bufferedimage.getColorModel().getTransparency();
BufferedImage img;
Graphics2D graphics2d;
graphics2d = (img = new BufferedImage(b, b, type))
.createGraphics();
graphics2d.setColor(Color.WHITE); // 背景色
graphics2d.fillRect(0, 0,b,b); // 画一个矩形
graphics2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
graphics2d.setColor(Color.WHITE); // 背景色
graphics2d.rotate(Math.toRadians(degree),w,h);
graphics2d.drawImage(bufferedimage,-(int)(b*0.28)/2,0, null);
graphics2d.dispose();
return img;
}
}