poi动态操作word填充数据,操作docx,转成pdf

本文介绍了一个使用Java动态操作Word模板,填充来自接口的数据,生成新的Word文件,然后将其转换为PDF的流程。涉及的关键技术包括Jacob库的使用以及数据对象的结构。
摘要由CSDN通过智能技术生成

场景:请求接口,将数据输出成pdf

思路:一个word模板,用请求的数据填充,生成新的word,再将新word转成pdf

  1. 准备jar包和dll ,jacob.jar;jacob-1.18-x64.dll,jacob-1.18-x86.dll;
  2. jar包下载链接:https://pan.baidu.com/s/16n7zYR4hCH03LyalYVNTQw
    提取码:d461

    请求数据:
    {
    “CF_COMPANY”: “个人股份”,
    “DEFAULT_EFFECTIVE_DATE”: “2017年06月26日”,
    “JE_NUMBER”: “1706003980”,
    “CP_ATTACH_NUM”: “1张”,
    “CP_DOC_NUM”: " ",
    “SERIAL”: “10003998”,
    “JE_SOURCE”: “人工”,
    “JE_CATEGORY”: “记账”,
    “CURRENCY_CODE”: “CNY”,
    “CURRENCY_CONVERSION_RATE”: “1.0000”,
    “HEADER_DESC”: “山海自有归期,风雨自有相逢。意难平终将和解,万事终将如意”,
    “CF_CAP_SUM”: “贰佰万圆整”,
    “CS_ACCOUNTED_DR”: “2,000,000.00”,
    “CS_ACCOUNTED_CR”: “2,000,000.00”,
    “MANAGER_NAME”: “张三”,
    “POST_NAME”: “李四”,
    “CP_CREATED_BY”: “王五”,
    “items”: [{
    “ENTERED_DR”: “2,000,000.00”,
    “ACCOUNTED_DR”: “2,000,000.00”,
    “ENTERED_CR”: “”,
    “ACCOUNTED_CR”: “”,
    “LINE_DESC”: “山海自有归期,风雨自有相逢。意难平终将和解,万事终将如意”,
    “CF_ACCOUNT_DESC”: “…真正的强大不是忘记,而是接受,接受分道扬镳,接受内心的不安接受不完美的自己,…”,
    “CF_ACCOUNT_VALUE”: “0.100201010000.B10102.0”
    },
    {
    “ENTERED_DR”: “”,
    “ACCOUNTED_DR”: “”,
    “ENTERED_CR”: “2,000,000.00”,
    “ACCOUNTED_CR”: “2,000,000.00”,
    “LINE_DESC”: “接受自己的不安困惑和焦虑和遗憾,调整好自己的状态,找到前进的力量,成为更好的自己”,
    “CF_ACCOUNT_DESC”: “…接受自己…”,
    “CF_ACCOUNT_VALUE”: “0.224198000000.0.0”
    }
    ]
    }

    word模板:
    在这里插入图片描述

实现效果:
在这里插入图片描述

参考:https://blog.csdn.net/weixin_43674794/article/details/103101221

代码

package com.test.Electronic.util;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.shuying.saidi.Electronic.ElectronicRequest;
import org.apache.poi.POIXMLDocument;
import org.apache.poi.xwpf.usermodel.*;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.*;
import java.util.Map.Entry;

/**
 * 通过word模板生成新的word工具类
 *
 * @author zhiheng
 */
public class WorderToNewWordUtils {
   

    /**
     * 根据模板生成新word文档
     * 判断表格是需要替换还是需要插入,判断逻辑有$为替换,表格无$为插入
     *
     * @param inputUrl  模板存放地址
     * @param textMap   需要替换的信息集合
     * @param tableList 需要插入的表格信息集合
     * @return 成功返回true, 失败返回false
     */
    public static boolean changWord(String inputUrl, String outputUrl,
                                    Map<String, String> textMap, List<String[]> tableList) {
   

        //模板转换默认成功
        boolean changeFlag = true;
        try {
   
            //获取docx解析对象
            XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(inputUrl));
            //解析替换文本段落对象
            WorderToNewWordUtils.changeText(document, textMap);
            //解析替换表格对象
            WorderToNewWordUtils.changeTable(document, textMap, tableList);

            //生成新的word
            File file = new File(outputUrl);
            FileOutputStream stream = new FileOutputStream(file);
            document.write(stream);
            stream.close();

        } catch (IOException e) {
   
            e.printStackTrace();
            changeFlag = false;
        }

        return changeFlag;

    }

    /**
     * 替换段落文本
     *
     * @param document docx解析对象
     * @param textMap  需要替换的信息集合
     */
    public static void changeText(XWPFDocument document, Map<String, String> textMap) {
   
        //获取段落集合
        List<XWPFParagraph> paragraphs = document.getParagraphs();

        for (XWPFParagraph paragraph : paragraphs) {
   
            //判断此段落时候需要进行替换
            String text = paragraph.getText();
            if (checkText(text)) {
   
                List<XWPFRun> runs = paragraph.getRuns();
                for (XWPFRun run : runs) {
   
                    //替换模板原来位置
                    run.setText(changeValue(run.toString(), textMap), 0);
                }
            }
        }

    }

    /**
     * 替换表格对象方法
     *
     * @param document  docx解析对象
     * @param textMap   需要替换的信息集合
     * @param tableList 需要插入的表格信息集合
     */
    public static void changeTable(XWPFDocument document, Map<String, String> textMap,
                                   List<String[]> tableList) {
   
        //获取表格对象集合
        List<XWPFTable> tables = document.getTables();
        for (int i = 0; i 
要将Java POI Word文档转换为PDF,可以使用以下步骤: 1. 添加POI和iText库的依赖关系。可以使用以下maven坐标: ``` <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13</version> </dependency> ``` 2. 创建Word文档并填充内容。可以使用POI的XWPFDocument类来创建和操作Word文档。例如: ``` XWPFDocument document = new XWPFDocument(); XWPFParagraph paragraph = document.createParagraph(); XWPFRun run = paragraph.createRun(); run.setText("Hello, World!"); ``` 3. 将Word文档写入输出流。可以使用Java的FileOutputStream类将文档写入文件或使用ByteArrayOutputStream类将文档写入内存中的字节数组。 4. 使用iText库将Word文档转换为PDF。可以使用iText的PdfWriter和PdfReader类来将Word文档转换为PDF。例如: ``` PdfWriter writer = PdfWriter.getInstance(document, outputStream); writer.setInitialLeading(12.5f); document.open(); PdfReader reader = new PdfReader(inputStream); PdfContentByte cb = writer.getDirectContent(); for (int i = 1; i <= reader.getNumberOfPages(); i++) { document.newPage(); PdfImportedPage page = writer.getImportedPage(reader, i); cb.addTemplate(page, 0, 0); } document.close(); ``` 5. 关闭输入流和输出流。 完整代码示例: ``` import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; import com.itextpdf.text.pdf.PdfContentByte; import com.itextpdf.text.pdf.PdfImportedPage; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfWriter; public class WordToPdfConverter { public static void main(String[] args) throws Exception { // Create Word document XWPFDocument document = new XWPFDocument(); XWPFParagraph paragraph = document.createParagraph(); XWPFRun run = paragraph.createRun(); run.setText("Hello, World!"); // Write Word document to output stream ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); document.write(outputStream); // Convert Word document to PDF InputStream inputStream = new FileInputStream("input.docx"); OutputStream pdfOutputStream = new FileOutputStream("output.pdf"); PdfWriter writer = PdfWriter.getInstance(document, pdfOutputStream); writer.setInitialLeading(12.5f); document.open(); PdfReader reader = new PdfReader(inputStream); PdfContentByte cb = writer.getDirectContent(); for (int i = 1; i <= reader.getNumberOfPages(); i++) { document.newPage(); PdfImportedPage page = writer.getImportedPage(reader, i); cb.addTemplate(page, 0, 0); } document.close(); // Close streams outputStream.close(); inputStream.close(); pdfOutputStream.close(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值