`
Veromca-源代码
  • 浏览: 41424 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多
最近项目需要实现下载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;
    }
}

  • juh.jar (57.8 KB)
  • 下载次数: 40
2
1
分享到:
评论

相关推荐

    Java用OpenOffice将office转换为PDF

    Java使用OpenOffice转换Office文档为PDF是一种常见的技术需求,尤其在企业级应用中,为了保持一致性和跨平台兼容性,可能会需要将Word、Excel或PowerPoint文档转换为PDF格式。以下将详细介绍如何在Java环境中利用...

    java Spring+openOffice实现office转pdf在线预览

    Java Spring 框架结合 OpenOffice 实现 Office 文件到 PDF 的在线预览是一个常见的技术应用场景,尤其是在企业级 Web 应用中。以下是对这个主题的详细讲解: **1. Java Spring 框架** Spring 是一个开源的 Java ...

    OpenOffice转换Office文档为PDF、HTML

    OpenOffice是一款开源的办公软件套件,它支持多种文件格式,包括Microsoft Office的Word、PowerPoint和Excel。在处理跨平台或需要固定布局的文档时,将这些文档转换为PDF或HTML格式非常有用。本文将详细讲解如何使用...

    php版本 office文档(word,ppt,excel)转pdf转swf(加水印),实现在线预览

    3. **添加水印**:在生成PDF的过程中,通过Imagick库,可以向PDF文件的每一页添加自定义的文本或图像水印,增加版权保护和视觉标识。 4. **PDF转SWF**:使用`unoconv`工具,将生成的PDF文件转换为SWF格式,SWF是...

    OpenOffice office转pdf需要的jar

    `OpenOffice office转pdf jar`是指使用Java语言开发的库,这个库可以与OpenOffice服务进行交互,完成从OpenOffice支持的文档格式到PDF的转换。 在Java环境中,`jar`文件(Java Archive)是用于封装Java类和资源的...

    openoffice实现office在线预览

    OpenOffice 提供了相应的解决方案,使得开发者可以通过服务器端处理 Office 文档并将其转换为网页可显示的格式,如 HTML 或 PDF,从而实现在线预览。 **一、OpenOffice 与在线预览原理** 1. **OpenOffice API**: ...

    java OpenOffice wordExcel转换PDF

    Java OpenOffice库是一种用于在Java应用程序中处理Office文档的强大工具,尤其在进行word和Excel到PDF的转换时。OpenOffice提供了API,使得开发者能够通过编程方式处理这些转换任务,而无需依赖用户界面或手动操作。...

    Java通过JobConverter操作OpenOffice实现Word转PDF功能

    Java技术通过JobConverter操作OpenOffice实现Word转PDF,支持(doc转PDF,docx转PDF),且OpenOffice支持linux、windows、mac等操作系统,本案例只测试了windows

    OpenOffice 实现JPG.DOC转PDF转SWF在线预览(Java版)

    总结,通过OpenOffice和相关的Java库,我们可以实现Java环境下的文件格式转换,包括JPG图片和DOC文档转PDF,以及PDF转SWF。这些操作对于构建在线文档预览系统至关重要。同时,确保正确配置和安装相关软件、字体以及...

    Java使用open office实现各种文档转pdf

    总的来说,Java通过OpenOffice实现文档转PDF是一种有效的方法,尤其适用于已经使用Java开发的系统。这种解决方案不仅支持多种文档格式,而且具有良好的可扩展性和灵活性,可以根据项目需求进行定制。通过理解并掌握...

    OPenOffice 实现用Java实现文件转换PDF和SWF

    总的来说,利用OpenOffice和Java可以方便地实现文件转换功能,无论是简单的PDF转换还是更复杂的格式互转。在实际应用中,你可能需要考虑并发转换、错误处理、性能优化等问题,以适应大规模的文件处理需求。

    java使用OpenOffice实现的Excel转pfd

    在Java中使用OpenOffice实现Excel到PDF的转换,主要涉及到以下几个关键步骤和知识点: 1. **OpenOffice连接**:首先,你需要在Java程序中建立与OpenOffice服务器的连接。这通常通过JODConverter库(基于OpenOffice ...

    word转pdf并加水印

    - **在线工具**:同样,一些在线PDF编辑工具也支持添加水印,如Sejda PDF,操作流程与软件类似。 3. **高级技巧与注意事项**: - **批量处理**:如果需要处理大量文件,可以选择支持批量操作的软件或工具,以提高...

    asp.net利用OpenOffice转换WORD/EXCEL/PDF为PDF,加水印源码

    总结,通过ASP.NET结合OpenOffice库,我们可以方便地实现跨格式的文档转换,并且能够添加自定义的水印。在实际项目中,我们需要根据系统环境和性能需求选择合适的工具和方法,同时注意处理错误和异常,确保服务的...

    java调用openOffice转换office为pdf的jar包

    总的来说,这个jar包为Java开发者提供了一个便捷的工具,使他们能够在不离开Java环境的情况下,利用OpenOffice的强大功能,实现Office文档向PDF的转换,极大地扩展了Java在文档处理方面的可能性。

Global site tag (gtag.js) - Google Analytics