OpenOffice实现Office转Pdf(支持自定义添加水印、页眉、页脚)


java OpenOffice officetopdf
最近项目需要实现下载Office文档时自动转成PDF文档,以下代码支持2003及2007版的Word,PPT,Excel转换,并支持自定义添加水印、页眉、页脚
实现需要事先安装OpenOffice(我这里安装的是OpenOffice 4)
OpenOffice 下载: http://www.openoffice.org/
JodConverter 下载地址 http://sourceforge.net/projects/jodconverter/files/JODConverter

需要代码正常运行还需要其他jar包(见附件)
Java代码

/**
* @filename: OfficetoPdf.java
* @package: common
* @description: OfficetoPdf
* @author: lsq
* @date: 2015年10月14日 下午5:25:32
* @version: V1.0
*
*/
package officetopdf;

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;
/**
* @className: OfficetoPdf
* @description: OfficetoPdf
* @author: lsq
* @date: 2015年10月14日 下午5:25:32
*/
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,50f,0);

// 添加页眉 (文字页眉,居中)
ColumnText.showtextAligned(stamp.getUnderContent(),
Element.ALIGN_CENTER,new Phrase(pageHeade,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; }}

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...