当前位置: 首页 > article >正文

Java图片转word

该方法可以控制一页是否只显示存放一张图片

第一步

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>4.1.2</version>
        </dependency>

第二步

package com.example.demo.file.word;

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.util.Units;
import org.apache.poi.xwpf.usermodel.BreakType;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;

public class ImageToWordWithPOI {
    public static void main(String[] args) {
        String folderPath = "C:\\Users\\EDY\\Desktop\\测试图片"; // 替换为你的图片文件夹路径
        String outputFilePath = "C:\\Users\\EDY\\Desktop\\output.docx"; // 输出Word文档的路径
        // 选择是否每页只插入一个图片
        boolean oneImagePerPage = true;
        Path folder = Paths.get(folderPath);
        try {
            // 获取所有图片文件的路径
            List<Path> imageFiles = Files.walk(folder)
                    .filter(Files::isRegularFile)
                    .filter(path -> isImageFile(path.toString()))
                    .collect(Collectors.toList());

            if (!imageFiles.isEmpty()) {
                XWPFDocument document = new XWPFDocument();
                try (FileOutputStream out = new FileOutputStream(outputFilePath)) {

                    
                    int imageCount = 0;
                    for (Path path : imageFiles) {
                        try {
                            // 如果选择每页只插入一个图片,并且已经插入过图片,则先添加一个分页符
                            if (oneImagePerPage && imageCount > 0) {
                                XWPFParagraph paragraph = document.createParagraph();
                                XWPFRun run = paragraph.createRun();
                                run.addBreak(BreakType.PAGE);
                            }
                            insertImageToWordDocument(document, path.toFile(), Units.pixelToEMU(400), Units.pixelToEMU(400));
                            imageCount++;
                        } catch (IOException | InvalidFormatException e) {
                            e.printStackTrace();
                            System.out.println("处理图片时发生错误。");
                        }
                    }

                    // 写入文档
                    document.write(out);
                    System.out.println("图片已成功插入到Word文档中。");
                } catch (IOException e) {
                    e.printStackTrace();
                    System.out.println("创建Word文档时发生错误。");
                }
            } else {
                System.out.println("指定的文件夹下没有找到图片。");
            }
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("读取文件夹时发生错误。");
        }
    }

    private static boolean isImageFile(String filename) {
        String[] imageExtensions = {"png", "jpg", "jpeg", "gif", "bmp", "tif", "tiff", "webp"};
        for (String ext : imageExtensions) {
            if (filename.toLowerCase().endsWith(ext)) {
                return true;
            }
        }
        return false;
    }

    private static void insertImageToWordDocument(XWPFDocument document, File imageFile, int width, int height) throws IOException, InvalidFormatException {
        // 创建一个新的段落用于插入图片
        XWPFParagraph paragraph = document.createParagraph();
        XWPFRun run = paragraph.createRun();
        run.addPicture(new FileInputStream(imageFile), XWPFDocument.PICTURE_TYPE_JPEG, imageFile.getName(), width, height);
    }
}


http://www.kler.cn/a/384801.html

相关文章:

  • MySQL 【流程控制】函数
  • 全星魅-物联网定位终端-北斗定位便携终端-北斗有源终端
  • 【C/C++】strncpy函数的模拟实现
  • 重构代码之参数化方法
  • [含文档+PPT+源码等]精品基于PHP实现的会员综合管理平台的设计与实现
  • Java中的设计模式——单例模式、代理模式、适配器模式
  • Elasticsearch-linux环境部署
  • 跨境电商独立站怎么建?如何收款?
  • CDGA|治理、技术、运营三管齐下构建高效数据管理体系
  • 【Linux】冯诺依曼体系、再谈操作系统
  • 内网部署web项目,外网访问不了?只有局域网能访问!怎样解决?
  • C语言心型代码解析
  • Qt开发技巧(二十二)设置QPA,打开记忆文件,清除表单页注意判断存在性,工程文件去重添加,按钮组的顺序设置,Qt的属性用来传值,查找问题的方法
  • 大数据工具 flume 的安装配置与使用 (详细版)
  • 入门网络安全工程师要学习哪些内容(详细教程)
  • 梧桐数据库与mysql及oracle关于交换服务器编号的SQL写法分析
  • ES + SkyWalking + Spring Boot:日志分析与服务监控(三)
  • [c++高阶]哈希的深度解析
  • Adaptive AUTOSAR ——Cryptography (在自适应AUTOSAR中的应用:概念、功能与实现)
  • 管理 Elasticsearch 变得更容易了,非常容易!
  • 第二十六章 Vue之在当前组件范围内获取dom元素和组件实例
  • vue3 css的样式如果background没有,如何覆盖有background的样式
  • 青少年编程与数学 02-003 Go语言网络编程 08课题、Session
  • SpringMVC课时2
  • PHP网络爬虫常见的反爬策略
  • App渠道来源追踪方案全面分析(iOS/Android/鸿蒙)