1. 程式人生 > >java實現word轉pdf第二種方法

java實現word轉pdf第二種方法

import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.io.InputStream;  
import java.io.OutputStream;  
import java.util.HashMap;  
import java.util.List;  
import java.util.Map;  
   
import org.apache.commons.collections.MapUtils;  
import org.apache.poi.xwpf.converter.pdf.PdfConverter;  
import org.apache.poi.xwpf.converter.pdf.PdfOptions;  
import org.apache.poi.xwpf.usermodel.XWPFDocument;  
import org.apache.poi.xwpf.usermodel.XWPFParagraph;  
import org.apache.poi.xwpf.usermodel.XWPFRun;  
import org.apache.poi.xwpf.usermodel.XWPFTable;  
import org.apache.poi.xwpf.usermodel.XWPFTableCell;  
import org.apache.poi.xwpf.usermodel.XWPFTableRow;  
import org.slf4j.Logger;  
import org.slf4j.LoggerFactory;  
   
import fr.opensagres.xdocreport.utils.StringUtils;  
   
/** 
 * @author Rocca 
 * 
 */  
public class DocxToPdf2 {  
   
    protected static final Logger logger = LoggerFactory.getLogger(DocxToPdf2.class);  
       
    
    public static void main(String[] args) throws Exception{  
        String filepath = "D:/yan.docx";  
        String outpath = "D:/yan.pdf";   
           
        InputStream source = new FileInputStream(filepath);  
        OutputStream target = new FileOutputStream(outpath);  
        Map<String, String> params = new HashMap<String, String>();  
           
           
        PdfOptions options = PdfOptions.create();  
           
        wordConverterToPdf(source, target, options, params);  
    }  
   
    public static void convertPdf(String docxFilePath,String pdfFilePath) throws Exception{
    InputStream source = new FileInputStream(docxFilePath);  
        OutputStream target = new FileOutputStream(pdfFilePath);  
        Map<String, String> params = new HashMap<String, String>();  
           
           
        PdfOptions options = PdfOptions.create();  
           
        wordConverterToPdf(source, target, options, params); 
    }
    /** 
     * 將word文件, 轉換成pdf, 中間替換掉變數 
     * @param source 源為word文件, 必須為docx文件 
     * @param target 目標輸出 
     * @param params 需要替換的變數 
     * @throws Exception 
     */  
    public static void wordConverterToPdf(InputStream source,  
            OutputStream target, Map<String, String> params) throws Exception {  
        wordConverterToPdf(source, target, null, params);      
    }  
   
    /** 
     * 將word文件, 轉換成pdf, 中間替換掉變數 
     * @param source 源為word文件, 必須為docx文件 
     * @param target 目標輸出 
     * @param params 需要替換的變數 
     * @param options PdfOptions.create().fontEncoding( "windows-1250" ) 或者其他 
     * @throws Exception 
     */  
    public static void wordConverterToPdf(InputStream source, OutputStream target,   
            PdfOptions options,  
            Map<String, String> params) throws Exception {  
         XWPFDocument doc = new XWPFDocument(source);  
         paragraphReplace(doc.getParagraphs(), params);  
         for (XWPFTable table : doc.getTables()) {  
           for (XWPFTableRow row : table.getRows()) {  
               for (XWPFTableCell cell : row.getTableCells()) {  
                   paragraphReplace(cell.getParagraphs(), params);  
               }  
           }  
       }  
       PdfConverter.getInstance().convert(doc, target, options);  
    }  
       
    /** 替換段落中內容 */  
    private static void paragraphReplace(List<XWPFParagraph> paragraphs, Map<String, String> params) {  
        if (MapUtils.isNotEmpty(params)) {  
            for (XWPFParagraph p : paragraphs){  
                for (XWPFRun r : p.getRuns()){  
                    String content = r.getText(r.getTextPosition());  
                    logger.info(content);  
                    if(StringUtils.isNotEmpty(content) && params.containsKey(content)) {  
                        r.setText(params.get(content), 0);  
                    }  
                }  
            }  
        }  
    }  
       
}