OpenOffice实现文件转Pdf加水印(支持自定义添加水印、页眉、页脚)
最近项目需要实现下载Office文档时自动转成PDF文档,
以下代码支持2003及2007版的Word,PPT,Excel转换,并支持自定义添加水印、页眉、页脚
实现需要事先安装最新版 OpenOffice 下载地址: http://www.openoffice.org/
JodConverter 下载地址: http://sourceforge.net/projects/jodconverter/files/JODConverter
方式一 :
import java.awt.Color;
import java.io.File;
import java.io.FileOutputStream;
import java.util.regex.Pattern;
import org.apache.commons.io.FileUtils;
import org.artofsolving.jodconverter.OfficeDocumentConverter;
import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration;
import org.artofsolving.jodconverter.office.OfficeManager;
import com.lowagie.text.Document;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.Phrase;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.ColumnText;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfCopy;
import com.lowagie.text.pdf.PdfCopy.PageStamp;
import com.lowagie.text.pdf.PdfImportedPage;
import com.lowagie.text.pdf.PdfReader;
/**
* @filename: OfficeToPdf.java
* @package: common
* @description: OfficeToPdf
* @author: leon
* @date: 2019年6月14日 下午5:25:32
* @version: V1.0
*
*/
public class OfficeToPdf {
public static void main(String[] args) {
String inputFilePath = "F://officeToPdf/WordToPdf测试.docx";
//String inputFilePath = "F://officeToPdf/pptToPdf测试.pptx";
//String inputFilePath = "F://officeToPdf/xlsxToPdf测试.xlsx";
String outputFilePath = getOutputFilePath(inputFilePath);
//Office转换成Pdf
OfficeToPdf.office2pdf(inputFilePath,outputFilePath);
//添加水印、页眉、页脚
addFooterAndWater("F://officeToPdf//WordToPdf测试.pdf", "F://officeToPdf//WordToPdf测试2.pdf", "WordToPdf水印严禁复制", "WordToPdf页眉", "WordToPdf页脚");
}
/**
* 将Office文档转换为PDF. 需要安装OpenOffice
*
* @param inputFilePath
* 源文件,绝对路径. 可以是Office2003-2007全部格式的文档, 包括.doc, .docx, .xls, .xlsx, .ppt, .pptx等.
*
* @param outputFilePath
* 目标文件.绝对路径.
*/
public static void office2pdf(String inputFilePath,String outputFilePath) {
DefaultOfficeManagerConfiguration config = new DefaultOfficeManagerConfiguration();
String officeHome = getOfficeHome();
//设置OpenOffice.org安装目录
config.setOfficeHome(officeHome);
//设置转换端口,默认为8100
//config.setPortNumbers(8100);
//设置任务执行超时为60分钟
config.setTaskExecutionTimeout(1000 * 60 * 60L);
//设置任务队列超时为24小时
config.setTaskQueueTimeout(1000 * 60 * 60 * 24L);
OfficeManager officeManager = config.buildOfficeManager();
officeManager.start();
System.out.println("office转换服务启动成功!");
OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);
File inputFile = new File(inputFilePath);
if (inputFile.exists()) {// 找不到源文件, 则返回
File outputFile = new File(outputFilePath);
if (!outputFile.getParentFile().exists()) { // 假如目标路径不存在, 则新建该路径
outputFile.getParentFile().mkdirs();
}
converter.convert(inputFile, outputFile);
}
if (null != officeManager){
officeManager.stop();
System.out.println("office转换服务完成。");
}
}
/**
* 根据源文件路径获取PDF文件路径
* @param inputFilePath
* @return
*/
public static String getOutputFilePath(String inputFilePath) {
String outputFilePath = "";
String temp = inputFilePath.substring(inputFilePath.lastIndexOf(".")) ;
outputFilePath = inputFilePath.replaceAll(temp, ".pdf");
return outputFilePath;
}
/**
* 获取OpenOffice安装目录
* @return
*/
public static String getOfficeHome() {
String osName = System.getProperty("os.name");
if (Pattern.matches("Linux.*", osName)) {
return "/opt/openoffice.org3";
} else if (Pattern.matches("Windows.*", osName)) {
return "E:/software/OpenOffice 4";
} else if (Pattern.matches("Mac.*", osName)) {
return "/Application/OpenOffice.org.app/Contents";
}
return null;
}
/**
* 添加水印、页眉、页脚
* @param fileName 源文件路径
* @param savepath 目标文件路径
* @param waterMarkName 文字水印
* @param pageHeade 页眉
* @param foot 页脚
* @return
*/
public static int addFooterAndWater(String fileName, String savepath, String waterMarkName, String pageHeade, String foot) {
// 文档总页数
int num = 0;
Document document = new Document();
try
{
PdfReader reader = new PdfReader(fileName);
BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
num = reader.getNumberOfPages();
PdfCopy copy = new PdfCopy(document, new FileOutputStream(savepath));
document.open();
for (int i = 0; i < num;)
{
PdfImportedPage page = copy.getImportedPage(reader, ++i);
PageStamp stamp = copy.createPageStamp(page);
Font f = new Font(base);
// 添加页脚,左侧文字,右侧页码
ColumnText.showTextAligned(stamp.getUnderContent(),
Element.ALIGN_RIGHT,
new Phrase(String.format("第 %d 页/共 %d 页", i, num), f),
550f, 28, 0);
ColumnText.showTextAligned(stamp.getUnderContent(),
Element.ALIGN_LEFT, new Phrase(foot, f), 50f, 28, 0);
// 添加页眉 (文字页眉,居中)
ColumnText.showTextAligned(stamp.getUnderContent(),
Element.ALIGN_CENTER, new Phrase(pageHeade, f), 150f,
800, 0);
// 页眉添加logo (图片页眉,居右)
/*Image img = Image.getInstance("template/logo.png");// 选择图片
img.setAlignment(1);
img.scaleAbsolute(436 / 5, 96 / 5);// 控制图片大小
img.setAbsolutePosition(450f, 800);// 控制图片位置
stamp.getUnderContent().addImage(img);*/
// 添加水印
PdfContentByte under = stamp.getUnderContent();
under.beginText();
under.setColorFill(Color.LIGHT_GRAY);
// 字符越长,字体越小,设置字体
int fontSize = getFontSize(waterMarkName);
under.setFontAndSize(base, fontSize);
// 设置水印文字字体倾斜 开始
float pageWidth = reader.getPageSize(i).getWidth();
float pageHeight = reader.getPageSize(i).getHeight();
under.showTextAligned(Element.ALIGN_CENTER, waterMarkName,
pageWidth / 2, pageHeight / 2, 60);// 水印文字成60度角倾斜,且页面居中展示
// 字体设置结束
under.endText();
stamp.alterContents();
copy.addPage(page);
}
} catch (Exception e) {
e.printStackTrace();
return -1;
} finally {
if (null != document)
{
document.close();
}
}
System.out.println("pdf totalpages:" + num);
return num;
}
/**
* 根据水印文字长度计算获取字体大小
* @param waterMarkName
* @return
*/
private static int getFontSize(String waterMarkName){
int fontSize = 80;
if(null != waterMarkName && !"".equals(waterMarkName)){
int length = waterMarkName.length();
if(length <=26 && length >= 18){
fontSize = 26;
}else if(length <18 && length >= 8){
fontSize = 40;
}else if(length <8 && length >= 1){
fontSize = 80;
}else {
fontSize = 16;
}
}
return fontSize;
}
}
方式二:
import java.awt.Color;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfGState;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;
/**
* @filename: D2P.java
* @package: common
* @author: leon
* @date: 2019年6月14日 下午5:25:32
* @version: V1.0
*
*/
public class D2P {
public static void main(String[] argv) {
//String pdfPath = argv[0];
String pdfPath = "C:\\Users\\qianql\\Desktop\\测试\\16BSB16";
BufferedOutputStream bos;
try {
office2PDF(pdfPath + ".doc", pdfPath + "temp.pdf");
bos = new BufferedOutputStream(new FileOutputStream(new File(pdfPath + ".pdf")));
setWatermark(bos, pdfPath + "temp.pdf");
(new File(pdfPath + "temp.pdf")).delete();
System.out.println("转换成功!");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static int office2PDF(String sourceFile, String destFile) {
try {
File inputFile = new File(sourceFile);
if (!inputFile.exists()) {
return -1;// 找不到源文件, 则返回-1
}
// 如果目标路径不存在, 则新建该路径
File outputFile = new File(destFile);
if (!outputFile.getParentFile().exists()) {
outputFile.getParentFile().mkdirs();
}
String OpenOffice_HOME = "D:\\Program Files\\MyDrivers\\OpenOffice4.1.3\\OpenOffice 4";
//这里是OpenOffice的安装目录, 在我的项目中,为了便于拓展接口,没有直接写成这个样子,但是这样是绝对没问题的
// 如果从文件中读取的URL地址最后一个字符不是 '\',则添加'\'
if (OpenOffice_HOME.charAt(OpenOffice_HOME.length() - 1) != '\\') {
OpenOffice_HOME += "\\";
}
// 启动OpenOffice的服务
String command = OpenOffice_HOME
+ "program\\soffice.exe -headless -accept=\"socket,host=127.0.0.1,port=8100;urp;\"";
Process pro = Runtime.getRuntime().exec(command);
// connect to an OpenOffice.org instance running on port 8100
OpenOfficeConnection connection = new SocketOpenOfficeConnection("127.0.0.1", 8100);
// OpenOfficeConnection connection = new SocketOpenOfficeConnection("yourIP",8100);
connection.connect();
// convert
DocumentConverter converter = new OpenOfficeDocumentConverter(
connection);
converter.convert(inputFile, outputFile);
// close the connection
connection.disconnect();
// 关闭OpenOffice服务的进程
pro.destroy();
return 0;
} catch (IOException e) {
e.printStackTrace();
}
return 1;
}
public static void setWatermark(BufferedOutputStream bos, String input) throws DocumentException, IOException {
PdfReader reader = new PdfReader(input);
PdfStamper stamper = new PdfStamper(reader, bos);
int total = reader.getNumberOfPages() + 1;
PdfContentByte content;
BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
//BaseFont base = BaseFont.createFont("/data/tmis/uploads/file/font/simsun.ttc,1", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
PdfGState gs = new PdfGState();
for (int i = 1; i < total; i++) {
// content = stamper.getOverContent(i);// 在内容上方加水印
content = stamper.getUnderContent(i);// 在内容下方加水印
gs.setFillOpacity(0.2f);
// content.setGState(gs);
content.beginText();
content.setRGBColorFill(192, 192, 192);
content.setFontAndSize(base, 50);
content.setTextMatrix(100, 250);
content.showTextAligned(Element.ALIGN_CENTER, "安徽省建筑工程质量第二监督检测站", 250, 400, 55);
// content.showTextAligned(Element.ALIGN_CENTER,
// "检测管理信息系统!",400,250, 55);
content.setRGBColorFill(0, 0, 0);
content.setFontAndSize(base, 8);
content.endText();
}
stamper.close();
}
}