Java freemarker生成word模板文件(如合同文件)及转pdf文件方法

2024-10-09 08:34:46 浏览数 (1)

Java freemarker生成word模板文件(如合同文件)及转pdf文件方法 创建模板文件 ContractTemplate.docx

ContractTemplate.xml

导入的Jar包 compile("junit:junit") compile("org.springframework:spring-test") compile("org.springframework.boot:spring-boot-test") testCompile 'org.springframework.boot:spring-boot-starter-test'

compile 'org.freemarker:freemarker:2.3.28' compile 'fakepath:aspose-words:19.5jdk' compile 'fakepath:aspose-cells:8.5.2'

Java工具类 xml文档 转换 Word XmlToDocx.java

代码语言:javascript复制
package com.test.docxml.utils;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

/**
 * xml文档 转换 Word
 */
public class XmlToDocx {
    /** 
     *  
     * @param documentFile 动态生成数据的docunment.xml文件 
     * @param docxTemplate docx的模板 
     * @param toFilePath 需要导出的文件路径
     * @throws Exception 
     */  
  
    public static void outDocx(File documentFile, String docxTemplate, String toFilePath,String key) throws Exception {  
        try {
            File docxFile = new File(docxTemplate);  
            ZipFile zipFile = new ZipFile(docxFile);
            Enumeration<? extends ZipEntry> zipEntrys = zipFile.entries();
            FileOutputStream fileOutputStream = new FileOutputStream(toFilePath);
            ZipOutputStream zipout = new ZipOutputStream(fileOutputStream);
            int len = -1;
            byte[] buffer = new byte[1024];  
            while (zipEntrys.hasMoreElements()) {
                ZipEntry next = zipEntrys.nextElement();
                InputStream is = zipFile.getInputStream(next);
                // 把输入流的文件传到输出流中 如果是word/document.xml由我们输入  
                zipout.putNextEntry(new ZipEntry(next.toString()));
                if ("word/document.xml".equals(next.toString())) {
                    InputStream in = new FileInputStream(documentFile);
                    while ((len = in.read(buffer)) != -1) {  
                        zipout.write(buffer, 0, len);
                    }  
                    in.close();
                } else {
                    while ((len = is.read(buffer)) != -1) {
                        zipout.write(buffer, 0, len);
                    }
                    is.close();
                }
            }
            zipout.close();
        } catch (Exception e) {
            e.printStackTrace();  
        }
    }

}

Java工具类 word文档 转换 PDF WordToPdf.java

代码语言:javascript复制
package com.test.docxml.utils;

import com.aspose.cells.*;
import com.aspose.cells.License;
import com.aspose.words.*;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;

/**
 * word文档 转换 PDF
 */
public class WordToPdf {

    /**
     * 获取license许可凭证
     * @return
     */
    private static boolean getLicense() {
        boolean result = false;
        try {
            String licenseStr = "<License>n"
                      " <Data>n"
                      " <Products>n"
                      " <Product>Aspose.Total for Java</Product>n"
                      " <Product>Aspose.Words for Java</Product>n"
                      " </Products>n"
                      " <EditionType>Enterprise</EditionType>n"
                      " <SubscriptionExpiry>20991231</SubscriptionExpiry>n"
                      " <LicenseExpiry>20991231</LicenseExpiry>n"
                      " <SerialNumber>23dcc79f-44ec-4a23-be3a-03c1632404e9</SerialNumber>n"
                      " </Data>n"
                      " <Signature>0nRuwNEddXwLfXB7pw66G71MS93gW8mNzJ7vuh3Sf4VAEOBfpxtHLCotymv1PoeukxYe31K441Ivq0Pkvx1yZZG4O1KCv3Omdbs7uqzUB4xXHlOub4VsTODzDJ5MWHqlRCB1HHcGjlyT2sVGiovLt0Grvqw5 QXBuinoBY0suX0=</Signature>n"
                      "</License>";

            InputStream license = new ByteArrayInputStream(licenseStr.getBytes("UTF-8"));
            License asposeLic = new License();
            asposeLic.setLicense(license);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * word文档  转换为 PDF
     * @param inPath 源文件
     * @param outPath 目标文件
     */
    public static File doc2pdf(String inPath, String outPath) {

        //验证License,获取许可凭证
        if (!getLicense()) {
            return null;
        }
        //新建一个PDF文档
        File file = new File(outPath);
        try {
            //新建一个IO输出流
            FileOutputStream os = new FileOutputStream(file);
            //获取将要被转化的word文档
            Document doc = new Document(inPath);
            // 全面支持DOC, DOCX,OOXML, RTF HTML,OpenDocument,PDF, EPUB, XPS,SWF 相互转换
            doc.save(os, com.aspose.words.SaveFormat.PDF);
            os.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return file;
    }

    public static void main(String[] args) {
        doc2pdf("D:/1.doc", "D:/1.pdf");
    }
}

Java单元测试类 XmlDocTest.java

代码语言:javascript复制
package com.test.docxml;


import com.test.docxml.utils.WordToPdf;
import com.test.docxml.utils.XmlToDocx;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;

import java.io.File;
import java.io.PrintWriter;
import java.io.Writer;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

/**
 * 本地单元测试
 */
@RunWith(SpringJUnit4ClassRunner.class)
//@RunWith(SpringRunner.class)
@SpringBootTest(classes= TemplateApplication.class)
@WebAppConfiguration
public class XmlDocTest {

    //短租
    @Test
    public void testContract() throws Exception{

        String contractNo = "1255445544";
        String contractCorp = "银河宇宙无敌测试soft";
        String contractDate = "2022-01-27";
        String contractItem = "房地产交易中心";
        String contractContent = "稳定发展中的文案1万字";

        //doc xml模板文件
        String docXml = "ContractTemplate.xml";  //使用替换内容
        //xml中间临时文件
        String xmlTemp = "tmp-ContractTemplate.xml";
        //生成文件的doc文件
        String toFilePath = contractNo   ".docx";
        //模板文档
        String docx = "ContractTemplate.docx";
        //生成pdf文件
        String toPdfFilePath = contractNo   ".pdf";;

        String CONTRACT_ROOT_URL = "/template";

        Resource contractNormalPath = new ClassPathResource(CONTRACT_ROOT_URL   File.separator   docXml);
        String docTemplate = contractNormalPath.getURI().getPath().replace(docXml, docx);

        //设置文件编码(注意点1)
        Writer writer = new PrintWriter(new File(xmlTemp),"UTF-8");
        Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);

        configuration.setEncoding(Locale.CHINESE, Charset.forName("UTF-8").name());
        //设置配置(注意点3)
        configuration.setDefaultEncoding("UTF-8");


        String filenametest = contractNormalPath.getURI().getPath().replace(docXml, "");
        System.out.println("filenametest="   filenametest);

        configuration.setDirectoryForTemplateLoading(new File(filenametest));

//        Template template = configuration.getTemplate(ContractConstants.CONTRACT_NORMAL_URL orderType type ".xml");
        //设置模板编码(注意点2)
        Template template = configuration.getTemplate(docXml,"UTF-8");  //绝对地址

        Map paramsMap = new HashMap();
        paramsMap.put("contractCorp",contractCorp);
        paramsMap.put("contractDate",contractDate);
        paramsMap.put("contractNo",contractNo);
        paramsMap.put("contractItem",contractItem);
        paramsMap.put("contractContent",contractContent);

        template.process(paramsMap, writer);
        XmlToDocx.outDocx(new File(xmlTemp), docTemplate, toFilePath, null);
        System.out.println("do finish");

        //转成pdf
        WordToPdf.doc2pdf(toFilePath,toPdfFilePath);

    }

}

创建成功之后的文件如下:

0 人点赞