diff --git a/hutool-poi/src/main/java/org/dromara/hutool/poi/word/PicType.java b/hutool-poi/src/main/java/org/dromara/hutool/poi/word/PicType.java deleted file mode 100644 index a5fc2ad56..000000000 --- a/hutool-poi/src/main/java/org/dromara/hutool/poi/word/PicType.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2023 looly(loolly@aliyun.com) - * Hutool is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * https://license.coscl.org.cn/MulanPSL2 - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, - * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, - * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ - -package org.dromara.hutool.poi.word; - -import org.apache.poi.xwpf.usermodel.Document; - -/** - * Word中的图片类型 - * - * @author looly - * @since 5.1.6 - */ -public enum PicType { - EMF(Document.PICTURE_TYPE_EMF), - WMF(Document.PICTURE_TYPE_WMF), - PICT(Document.PICTURE_TYPE_PICT), - JPEG(Document.PICTURE_TYPE_JPEG), - PNG(Document.PICTURE_TYPE_PNG), - DIB(Document.PICTURE_TYPE_DIB), - GIF(Document.PICTURE_TYPE_GIF), - TIFF(Document.PICTURE_TYPE_TIFF), - EPS(Document.PICTURE_TYPE_EPS), - WPG(Document.PICTURE_TYPE_WPG); - - /** - * 构造 - * - * @param value 图片类型值 - */ - PicType(final int value) { - this.value = value; - } - - private final int value; - - /** - * 获取图片类型对应值 - * - * @return 图片值 - */ - public int getValue() { - return this.value; - } -} diff --git a/hutool-poi/src/main/java/org/dromara/hutool/poi/word/PictureTypeUtil.java b/hutool-poi/src/main/java/org/dromara/hutool/poi/word/PictureTypeUtil.java new file mode 100755 index 000000000..71bbb6f76 --- /dev/null +++ b/hutool-poi/src/main/java/org/dromara/hutool/poi/word/PictureTypeUtil.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * https://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.poi.word; + +import org.apache.poi.common.usermodel.PictureType; +import org.dromara.hutool.core.io.file.FileNameUtil; + +/** + * 图片类型工具类 + * + * @author looly + * @since 6.0.0 + */ +public class PictureTypeUtil { + + /** + * 获取图片类型枚举 + * + * @param fileName 文件名称 + * @return 图片类型枚举 + */ + public static PictureType getType(final String fileName) { + String extName = FileNameUtil.extName(fileName).toUpperCase(); + if ("JPG".equals(extName)) { + extName = "JPEG"; + } + + PictureType picType; + try { + picType = PictureType.valueOf(extName); + } catch (final IllegalArgumentException e) { + // 默认值 + picType = PictureType.JPEG; + } + return picType; + } +} diff --git a/hutool-poi/src/main/java/org/dromara/hutool/poi/word/Word07Writer.java b/hutool-poi/src/main/java/org/dromara/hutool/poi/word/Word07Writer.java index fe0ca8302..04abb032b 100644 --- a/hutool-poi/src/main/java/org/dromara/hutool/poi/word/Word07Writer.java +++ b/hutool-poi/src/main/java/org/dromara/hutool/poi/word/Word07Writer.java @@ -12,10 +12,10 @@ package org.dromara.hutool.poi.word; +import org.apache.poi.common.usermodel.PictureType; import org.dromara.hutool.core.io.file.FileUtil; import org.dromara.hutool.core.io.IORuntimeException; import org.dromara.hutool.core.io.IoUtil; -import org.dromara.hutool.core.io.file.FileNameUtil; import org.dromara.hutool.core.lang.Assert; import org.dromara.hutool.core.array.ArrayUtil; import org.dromara.hutool.poi.exceptions.POIException; @@ -27,11 +27,7 @@ import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; import java.awt.Font; -import java.io.Closeable; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; +import java.io.*; /** * Word docx生成器 @@ -51,7 +47,11 @@ public class Word07Writer implements Closeable { */ protected boolean isClosed; - // -------------------------------------------------------------------------- Constructor start + // region ----- Constructor start + + /** + * 构造 + */ public Word07Writer() { this(new XWPFDocument()); } @@ -85,7 +85,7 @@ public class Word07Writer implements Closeable { this.destFile = destFile; } - // -------------------------------------------------------------------------- Constructor end + // endregion /** * 获取{@link XWPFDocument} @@ -152,8 +152,8 @@ public class Word07Writer implements Closeable { * * @param data 表格数据,多行数据。元素表示一行数据,当为集合或者数组时,为一行;当为Map或者Bean时key表示标题,values为数据 * @return this - * @since 4.5.16 * @see TableUtil#createTable(XWPFDocument, Iterable) + * @since 4.5.16 */ public Word07Writer addTable(final Iterable data) { TableUtil.createTable(this.doc, data); @@ -171,15 +171,7 @@ public class Word07Writer implements Closeable { */ public Word07Writer addPicture(final File picFile, final int width, final int height) { final String fileName = picFile.getName(); - final String extName = FileNameUtil.extName(fileName).toUpperCase(); - PicType picType; - try { - picType = PicType.valueOf(extName); - } catch (final IllegalArgumentException e) { - // 默认值 - picType = PicType.JPEG; - } - return addPicture(FileUtil.getInputStream(picFile), picType, fileName, width, height); + return addPicture(FileUtil.getInputStream(picFile), PictureTypeUtil.getType(fileName), fileName, width, height); } /** @@ -193,7 +185,7 @@ public class Word07Writer implements Closeable { * @return this * @since 5.1.6 */ - public Word07Writer addPicture(final InputStream in, final PicType picType, final String fileName, final int width, final int height) { + public Word07Writer addPicture(final InputStream in, final PictureType picType, final String fileName, final int width, final int height) { return addPicture(in, picType, fileName, width, height, ParagraphAlignment.CENTER); } @@ -209,12 +201,12 @@ public class Word07Writer implements Closeable { * @return this * @since 5.2.4 */ - public Word07Writer addPicture(final InputStream in, final PicType picType, final String fileName, final int width, final int height, final ParagraphAlignment align) { + public Word07Writer addPicture(final InputStream in, final PictureType picType, final String fileName, final int width, final int height, final ParagraphAlignment align) { final XWPFParagraph paragraph = doc.createParagraph(); paragraph.setAlignment(align); final XWPFRun run = paragraph.createRun(); try { - run.addPicture(in, picType.getValue(), fileName, Units.toEMU(width), Units.toEMU(height)); + run.addPicture(in, picType, fileName, Units.toEMU(width), Units.toEMU(height)); } catch (final InvalidFormatException e) { throw new POIException(e); } catch (final IOException e) { @@ -226,6 +218,34 @@ public class Word07Writer implements Closeable { return this; } + /** + * 增加多张图片,单独成段落,增加后图片流关闭 + * + * @param width 图片统一宽度 + * @param height 图片统一高度 + * @param picFiles 图片列表 + * @return this + * @since 6.0.0 + */ + public Word07Writer addPictures(final int width, final int height, final File... picFiles) { + final XWPFParagraph paragraph = doc.createParagraph(); + XWPFRun run; + try { + for (final File picFile : picFiles) { + run = paragraph.createRun(); + final String name = picFile.getName(); + try(final BufferedInputStream in = FileUtil.getInputStream(picFile)){ + run.addPicture(in, PictureTypeUtil.getType(name), name, Units.toEMU(width), Units.toEMU(height)); + } + } + } catch (final InvalidFormatException e) { + throw new POIException(e); + } catch (final IOException e) { + throw new IORuntimeException(e); + } + return this; + } + /** * 将Excel Workbook刷出到预定义的文件
* 如果用户未自定义输出的文件,将抛出{@link NullPointerException}
@@ -289,6 +309,7 @@ public class Word07Writer implements Closeable { * 关闭Word文档
* 如果用户设定了目标文件,先写出目标文件后给关闭工作簿 */ + @SuppressWarnings("resource") @Override public void close() { if (null != this.destFile) {