Java将获取的参数,图片以及pdf文件放入到word文档指定位置

首先引入的依赖

  
       
            org.apache.poi
            poi
            4.1.2
        
        
            org.apache.poi
            poi-ooxml
            4.1.2
        
        
            org.apache.poi
            poi-ooxml-schemas
            4.1.2
        

        
            org.apache.pdfbox
            pdfbox
            2.0.27
        

接下面的是template.docx文档,参数是以{{paramName}}格式的,但是从数据库获取的参数跟模板中的参数一一对应上即可,格式如下(我是json形式展示的):

{
    "countQuota": "",
    "noEmission": "",
    "greenConsume": "",
    "pollutCharge": "",
    "emissionPermit": "",
    "capitalOutlay": "",
    "carbonTarget": "",
    "zeroEmissionPower": "",
    "kgce": "",
    "productStandard": "",
    "totalConsume": "",
    "carbonEmission": "",
    "consumePer": "",
    "fileNames": "",
    "directEmission": "",
    "indirectEmission": "",
    "partiEmission": ""
}

template.docx文档

大体上长这样

Java将获取的参数,图片以及pdf文件放入到word文档指定位置_第1张图片

 这里主要给图片中4.15排污许可证那里插入文件

具体代码如下:

package com.example.threaddemo.test;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.*;
import org.apache.poi.util.IOUtils;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.List;

public class WordTest2 {
    public static void main(String[] args) {
        try {
            // 加载Word文档
            XWPFDocument document = new XWPFDocument(new FileInputStream("C:\\Users\\Administrator\\Desktop\\template.docx"));
            // 获取文档中的表格列表
            List tables = document.getTables();

            // 遍历表格
            for (XWPFTable table : tables) {
                // 遍历表格的行
                List rows = table.getRows();
                for (XWPFTableRow row : rows) {
                    // 遍历行的单元格
                    List cells = row.getTableCells();
                    for (XWPFTableCell cell : cells) {
                        // 获取单元格的文本内容
                        String cellText = cell.getText();
                        if (cellText.equals("{{emissionPermit}}")) {
                            XWPFRun run = cell.getParagraphs().get(0).getRuns().get(0);

                            // 在字段位置插入图片
                            String imagePath = "C:\\Users\\Administrator\\Desktop\\1.png";
                            InputStream pngInputStream = new FileInputStream(imagePath);
                            byte[] pngBytes = IOUtils.toByteArray(pngInputStream);
                            //XWPFRun pngRun = targetParagraph.createRun();
                            run.setText("", 0);
                            run.addPicture(new ByteArrayInputStream(pngBytes), XWPFDocument.PICTURE_TYPE_PNG, "image.png", Units.toEMU(300), Units.toEMU(200));
                            pngInputStream.close();

                            // 在指定位置插入JPG图片
                            String jpgFilePath = "C:\\Users\\Administrator\\Desktop\\2.jpg";
                            InputStream jpgInputStream = new FileInputStream(jpgFilePath);
                            byte[] jpgBytes = IOUtils.toByteArray(jpgInputStream);
                            run.addPicture(new ByteArrayInputStream(jpgBytes), XWPFDocument.PICTURE_TYPE_JPEG, "image.jpg", Units.toEMU(300), Units.toEMU(200));
                            jpgInputStream.close();
                            // 在字段位置插入附件
                            String pdfPath = "C:\\Users\\Administrator\\Desktop\\滴滴电子发票.pdf";
                            String imagePath1 = "C:\\Users\\Administrator\\Desktop\\滴滴电子发票.png";
                            convertPdfToImage(pdfPath,imagePath1);
                            InputStream pngInputStream1 = new FileInputStream(imagePath1);
                            byte[] pngBytes1 = IOUtils.toByteArray(pngInputStream1);
                            //XWPFRun pngRun = targetParagraph.createRun();
                            run.setText("", 0);
                            run.addPicture(new ByteArrayInputStream(pngBytes1), XWPFDocument.PICTURE_TYPE_PNG, "image.png", Units.toEMU(300), Units.toEMU(200));
                            pngInputStream1.close();
                        }
                        //System.out.println(cellText);
                    }
                }
            }

            // 保存修改后的文档
            FileOutputStream outputStream = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\1.docx");
            document.write(outputStream);
            outputStream.close();

            System.out.println("附件插入成功!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void convertPdfToImage(String pdfPath, String imagePath) throws IOException {
        PDDocument document = PDDocument.load(new File(pdfPath));
        PDFRenderer renderer = new PDFRenderer(document);
        BufferedImage image = renderer.renderImage(0); // 渲染第一页为图像
        ImageIO.write(image, "PNG", new File(imagePath));
        document.close();
    }
}

以上代码只是插入了图片,其他的参数都没有变,如果需要将其它参数也改了,就用下面的代码

XWPFTemplate template = XWPFTemplate.compile(templatePath + File.separator + "template.docx").render(jsonObject);
template.write(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\1.docx"));
template.close();

在网上找了半天也么有什么好的方式可以在指定的位置直接将pdf插入进去,如果哪位大神有好的方式,可以留个言

你可能感兴趣的:(Java,java,pdf,word)