OpenOffice实现文档转PDF加水印

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();
    }


}

 

你可能感兴趣的:(#,Java基础,开发架构)