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;

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

当Java、C++、Python等编程语言都变成妹子。。。

试想一下&#xff0c;当Java、C、Python、Ruby、PHP、C#、JS等编程语言变成了动漫人物会是怎样的一幅场景呢&#xff1f;下面就一起看看在日本作家渡辺将人的笔下&#xff0c;各种编程语言都是哪类“美女”的吧&#xff01;Java犹如宫泽贤治的《不畏风雨》中出现的、性格木讷的…

对MySQL 进行深入学习是非常必要的

MySQL 在互联网行业非常流行&#xff0c;腾讯&#xff0c;阿里等互联网巨头都在深入使用MySQL&#xff0c; 我在腾讯时也使用MySQL&#xff0c;我在微信群里经常听到大家对MySQL 的意见也很大。在传统企业环境下使用最多的数据库产品是Oracle,SQL Server等企业级数据库&#xf…

windows下的NTP服务

近期的项目用到NTP&#xff0c;在使用的时候碰到一些问题&#xff0c;特记录如下&#xff1a; &#xff08;1&#xff09;NTP Server部分若要将内部时间服务器配置为与外部时间源同步&#xff0c;请按照下列步骤操作&#xff1a; 1. 将服务器类型更改为 NTP。为此&#xff0…

php判断是否是关联数组,php 关联数组判断是否为空

先看一个关联数组判断为空的代码&#xff0c;然后我们详细讲讲关于数据空的处理。$array array(0);if(empty($array)){echo "我空了 ";}else{echo "我不空啊 ";}$array[array]我是数组;print_r($array);$array[array1]我是数组1;print_r($array);unset($a…

4月 .NET 线上 Meetup,快来报名

点击蓝字关注我们.NET 6 preview 2 在3月11日已经发布&#xff0c;.NET 6 将是 .NET Core 3.1 之后的第一个 LTS 版本&#xff0c;也是微软开启全平台统一一个 .NET 计划以来的第一个 LTS 版本&#xff0c;意义不可谓不大&#xff0c;那么 .NET 5/6 又会带来哪些新特性呢&#…

机器学习资料第3版,助你继续成长!

之前分享的两份机器学习资料得到很多人的支持&#xff0c;因此小编决定再分享一份机器学习的资料。前两份资料传送门&#xff1a;【资源】机器学习资料包来袭机器学习资料升级版来了&#xff01;&#xff01;&#xff01;现在&#xff0c;再来看看有什么新资料吧。How to Build…

php框架快速入门,php-laravel4.0框架 简单快速入门

前提必须已经安装好了laravel4.0版本。写入权限&#xff1a;  安装完 Laravel &#xff0c;你还需要为web服务器设置 app/storage目录的写入权限。目录结构&#xff1a;  安装完框架后&#xff0c;你需要熟悉一下该项目的目录结构。app 文件夹包含了一些如views &#xff0…

Filter+Redis解决项目之间调用的幂等性

幂等&#xff08;idempotent、idempotence&#xff09;是一个数学与计算机学概念&#xff0c;常见于抽象代数中。在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同在项目远程调用中&#xff0c;如果接口调用失败或者是超时&#xff0c;客户端都会…

人工智能、机器学习、深度学习,到底他们哥仨是什么关系?

有三个词&#xff0c;这两年出现的频率越来越高&#xff1a;人工智能&#xff08;AI&#xff09;&#xff0c;机器学习&#xff08;ML&#xff09;&#xff0c;深度学习&#xff08;DL&#xff09;&#xff0c;到底他们哥仨是什么关系&#xff1f;今天小编化繁为简&#xff0c;…

一起谈.NET技术,也玩MVC3.0 Razor自定义视图引擎来修改默认的Views目录结构

刚刚爱上MVC3.0&#xff0c;几个不眠夜的学习越来越有趣。今天随手尝试自定义Mvc3.0的视图引擎&#xff0c;虽然已成功&#xff0c;但是还发现有点小疑问。随手贴出来希望大家指教指教。 MVC的视图文件目录被固定/Views目录内&#xff0c;区域视图文件也是被固定在/Areas目录下…

如何在 ASP.NET Core 中使用 HttpClientFactory ?

ASP.Net Core 是一个开源的&#xff0c;跨平台的&#xff0c;轻量级模块化框架&#xff0c;可用它来构建高性能的Web程序&#xff0c;这篇文章我们将会讨论如何在 ASP.Net Core 中使用 HttpClientFactory。为什么要使用 HttpClientFactory 可以用 HttpClientFactory 来集中化管…

php dechex 补零,PHP dechex()函数

定义和用法dechex()函数返回包含十六进制给出等效的十进制数参数的字符串。此函数返回带有十六进制字符的字符串。语法dechex ( int $number ) : string参数序号参数及说明1数字以等效的十六进制表示形式转换的十进制数字返回值PHPdechex()函数在字符串内部返回一个十六进制数。…

如何选择合适的损失函数,请看......

机器学习中的所有算法都依赖于最小化或最大化某一个函数&#xff0c;我们称之为“目标函数”。最小化的这组函数被称为“损失函数”。损失函数是衡量预测模型预测期望结果表现的指标。寻找函数最小值的最常用方法是“梯度下降”。把损失函数想象成起伏的山脉&#xff0c;梯度下…

关于IIS服务启动失败的问题:“IIS提示‘另一个程序正在使用此文件,进程无法访问’”,的解决方法...

IIS中网站服务所占用的是80端口&#xff0c;出现这样的提示我们可以判定是端口冲突造成的&#xff0c;故&#xff0c;查看真正运行的占用80端口的程序&#xff0c; 在“运行”输入“cmd”&#xff0c;进入命令行&#xff0c; 输入netstat -abn > c:/port80.txt 此命令既是查…

OxyPlot.SkiaSharp中文显示乱码的问题

oxyplot 图表控件功能强大&#xff0c;使用很广泛。最近考虑到性能使用OxyPlot.SkiaSharp替代OxyPlot.WPF&#xff0c;曲线图表初步测试&#xff0c;性能提升近10倍左右。基于SkiaSharp图形引擎的一些控件常遇见中文乱码的问题&#xff0c;所以改用OxyPlot.SkiaSharp时也有心里…

php return 变量,php内核笔记–函数返回变量return_value

//这些宏都定义在Zend/zend_API.h文件里#define RETVAL_RESOURCE(l)ZVAL_RESOURCE(return_value, l)#define RETVAL_BOOL(b)ZVAL_BOOL(return_value, b)#define RETVAL_NULL() ZVAL_NULL(return_value)#define RETVAL_LONG(l) ZVAL_LONG(return_value, l)#define RETVAL_DOUBLE…

想入门平均月薪2.58w人工智能领域?看看BAT的工程师在学什么

在这个贩卖焦虑的时代&#xff0c;职场人士和新晋父母成为了重点呵护对象&#xff0c;前有“摩拜同龄人”超越你&#xff0c;后有“月薪 3 万支撑不起的暑假班”等着你&#xff0c;而人工智能&#xff0c;又威胁要彻底抢走你的饭碗。京东无人分拣中心曝光&#xff0c;华尔街顶级…

formcheck 自定义验证

POST提交前的验证:formcheck new FormCheck(formular,{onSubmit:onsubmitfun});onSubmit:onsubmitfun提交前的验证function方法formcheck.options.submitfalse时就不提交了自定义验证function方法:<input type"text" name"custom" class"validate[…

.NET 6 Preview 3 发布

前言2021/4/8 .NET 6 Preview 3 发布&#xff0c;这个版本的改进大多来自于底层&#xff0c;一起来看看都有什么新特性和改进吧。库改进新增值类型作为字典值时更快的处理方法.NET 6 Preview 3 引入了新的 unsafe API CollectionsMarshal.GetValueRef&#xff0c;这个 API 允许…

php mysql datetime时区,Django models通过DateTimeField保存到MySQL的时间的时区问题

最近开始使用Django开发一些系统&#xff0c;在models.py中设置一些数据库表结构并给日期时间字段赋初值&#xff0c;不过在使用的过程中&#xff0c;遇到一点问题。问题是&#xff0c;我本来服务器使用的市区是“Asia/Shanghai”(08:00)&#xff0c;然后用datetime.now保存到数…