jodconverter水印java,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, 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;
}
}
總結
以上是生活随笔為你收集整理的jodconverter水印java,OpenOffice实现Office转Pdf(支持自定义添加水印、页眉、页脚)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拼多多Q3营收增长94% 市值1847亿
- 下一篇: 雷军向武汉大学捐赠 13 亿元现金,创全