java WordUtils word文檔工具類


package com.sicdt.library.core.utils;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.Set;

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.xwpf.converter.core.XWPFConverterException;

public class WordUtils {

    /**
     * <br>
     * 描 述: doc內容改變 <br>
     * 作 者: shizhenwei <br>
     * 歷 史: (版本) 作者 時間 注釋
     * 
     * @param is
     *            doc文檔模板
     * @param params
     *            key value 將模板里的可以替換為響應VALUE
     * @return
     * @throws IOException
     */
    public static byte[] docContentChange(InputStream is, Map<String, String> params) throws IOException {
        HWPFDocument document = new HWPFDocument(is);
        Range range = document.getRange();

        Set<String> keys = params.keySet();
        for (String key : keys) {
            range.replaceText(key, params.get(key));
        }
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        document.write(baos);
        byte[] bytes = baos.toByteArray();

        document.close();
        baos.close();
        return bytes;
    }

    /**
     * <br>
     * 描 述: docx內容改變 <br>
     * 作 者: shizhenwei <br>
     * 歷 史: (版本) 作者 時間 注釋
     * 
     * @param is
     *            docx文檔模板
     * @param params
     *            key value 將模板里的可以替換為響應VALUE
     * @return
     * @throws IOException
     * @throws XWPFConverterException
     */
    public static byte[] docxContentChange(InputStream is, Map<String, String> params)
            throws XWPFConverterException, IOException {
        return DocxUtils.docxContentChange(is, params);
    }

    /**
     * <br>
     * 描 述: 將docx字節數組流轉換為pdf字節數組流 <br>
     * 作 者: shizhenwei <br>
     * 歷 史: (版本) 作者 時間 注釋
     * 
     * @param docxBytes
     *            docx文檔字節數組
     * @return
     * @throws XWPFConverterException
     * @throws IOException
     *             注:需在部署系統安裝word對應的中文字體
     */
    public static byte[] docx2pdf(byte[] docxBytes) throws XWPFConverterException, IOException {
        return DocxUtils.docx2pdf(docxBytes);
    }

    /**
     * <br>
     * 描 述: 將Word模板流改變內容后轉換為pdf字節數組流 <br>
     * 作 者: shizhenwei <br>
     * 歷 史: (版本) 作者 時間 注釋
     * 
     * @param is
     *            docx文檔輸入流
     * @param params
     *            key value 將模板里的可以替換為響應VALUE
     * @return
     * @throws IOException
     * @throws XWPFConverterException
     *             * 注:需在部署系統安裝word對應的中文字體
     */
    public static byte[] docx2pdf(InputStream is, Map<String, String> params)
            throws XWPFConverterException, IOException {
        return DocxUtils.docx2pdf(is, params);
    }
}
package com.sicdt.library.core.utils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.xwpf.converter.core.XWPFConverterException;
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;
/**
 * 
 * @author zhenwei.shi
 *
 */
public class DocxUtils {
    
     /**
     * <br>
     * 描 述: doc內容改變 <br>
     * 作 者: shizhenwei <br>
     * 歷 史: (版本) 作者 時間 注釋
     * 
     * @param is
     *            doc文檔模板
     * @param params
     *            key value 將模板里的可以替換為響應VALUE
     * @return
     * @throws IOException
     */
    public static byte[] docContentChange(InputStream is, Map<String, String> params) throws IOException {
        HWPFDocument document = new HWPFDocument(is);
        Range range = document.getRange();

        Set<String> keys = params.keySet();
        for (String key : keys) {
            range.replaceText("{{"+key.toString()+"}}", params.get(key));
        }
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        document.write(baos);
        byte[] bytes = baos.toByteArray();

        document.close();
        baos.close();
        return bytes;
    }
    
    /**
     * <br>描 述: docx內容改變
     * <br>作 者: shizhenwei 
     * <br>歷 史: (版本) 作者 時間 注釋
     * @param is    docx文檔模板
     * @param params key value 將模板里的可以替換為響應VALUE
     * @return
     * @throws IOException 
     * @throws XWPFConverterException 
     */
    public static byte[] docxContentChange(InputStream is,Map<String,String> params) throws XWPFConverterException, IOException{
        XWPFDocument document = new XWPFDocument(is);
        List<XWPFParagraph> list = document.getParagraphs();
        for(XWPFParagraph paragraph : list){
            String regex = "(\\w|\\W)*\\{\\{\\w+\\}\\}(\\w|\\W)*";//{{string}}匹配
            if(!paragraph.getText().matches(regex)){
                continue;
            }
            List<XWPFRun> runs = paragraph.getRuns();
            loop : for(int i=0; i<runs.size(); i++){
                XWPFRun run = runs.get(i);
                if(!run.text().matches(regex)){
                    continue;
                }
                if(null==params || params.keySet().size()<1){
                    run.setText("",0);
                    continue;
                }
                Set<String> keySet = params.keySet();
                for(String key : keySet){
                    if(run.text().contains(key)){
                        String text = run.text().replaceAll(getReplaceAllKey("{{"+key.toString()+"}}"), params.get(key));
                        run.setText(text,0);
                        continue loop;
                    }
                }
                run.setText("",0);
            }
        }
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        document.write(baos);
        byte[] bytes = baos.toByteArray();
        document.close();
        baos.close();
        return bytes;
    }
    
    /**
     * <br>描 述:    將docx字節數組流轉換為pdf字節數組流
     * <br>作 者: shizhenwei 
     * <br>歷 史: (版本) 作者 時間 注釋
     * @param docxBytes docx文檔字節數組
     * @return
     * @throws XWPFConverterException
     * @throws IOException
     * 注:需在部署系統安裝word對應的中文字體
     */
    public static byte[] docx2pdf(byte[] docxBytes) throws XWPFConverterException, IOException{
        PdfOptions options = PdfOptions.create();
        XWPFDocument document = new XWPFDocument(new ByteArrayInputStream(docxBytes));
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PdfConverter.getInstance().convert(document, baos, options);
        return baos.toByteArray();
    }
    
    
    /**
     * <br>描 述:    將Word模板流改變內容后轉換為pdf字節數組流
     * <br>作 者: shizhenwei 
     * <br>歷 史: (版本) 作者 時間 注釋
     * @param is docx文檔輸入流
     * @param params key value 將模板里的可以替換為響應VALUE
     * @return
     * @throws IOException 
     * @throws XWPFConverterException 
     * * 注:需在部署系統安裝word對應的中文字體
     */
    public static byte[] docx2pdf(InputStream is,Map<String, String> params) throws XWPFConverterException, IOException{
        XWPFDocument document = new XWPFDocument(is);
        List<XWPFParagraph> list = document.getParagraphs();
        for(XWPFParagraph paragraph : list){
            String regex = "(\\w|\\W)*\\{\\{\\w+\\}\\}(\\w|\\W)*";//{{string}}匹配
            if(!paragraph.getText().matches(regex)){
                continue;
            }
            List<XWPFRun> runs = paragraph.getRuns();
            for(int i=0; i<runs.size(); i++){
                XWPFRun run = runs.get(i);
                if(!run.text().matches(regex)){
                    continue;
                }
                Set<String> keySet = params.keySet();
                for(String key : keySet){
                    key = "{{"+key+"}}";
                    if(run.text().contains(key)){
                        String text = run.text().replaceAll(getReplaceAllKey(key), params.get(key));
                        run.setText(text,0);
                    }
                }
            }
        }
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PdfOptions options = PdfOptions.create();
        PdfConverter.getInstance().convert(document, baos, options);
        byte[] bytes = baos.toByteArray();
        document.close();
        baos.close();
        return bytes;
    }
    
    /**
     * 
     * <br>描 述:    String replaceAll方法默認正則 {{}} 對特殊字符進行轉義,如 {} == \\{\\}
     * <br>作 者: shizhenwei 
     * <br>歷 史: (版本) 作者 時間 注釋
     * @param key
     * @return
     */
    public static String getReplaceAllKey(String key){
        String afterKey = "";
        for(int i=0; i<key.length(); i++){
            if('{'==key.charAt(i)){
                afterKey+="\\{";
            }else if('}'==key.charAt(i)){
                afterKey+="\\}";
            }else{
                afterKey+=key.charAt(i);
            }
        }
        return afterKey;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM