zoukankan      html  css  js  c++  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;
    }
    }

  • 相关阅读:
    CSS3总结一:border(边框)
    浏览器控制台使用
    CSS3选择器
    jQuery实现搜索框插件+豆瓣音乐接口实现豆瓣搜索框
    服务器代理+jQuery.ajax实现图片瀑布流
    计算机网络之iframe内联框架跨域
    计算机网络之JSONP跨域
    程序集加载与反射(一):理论篇
    垃圾回收机制,是不是这样理解?
    异常处理机制
  • 原文地址:https://www.cnblogs.com/7231485/p/11577777.html
Copyright © 2011-2022 走看看