• java中word转pdf/word转图片/word转html/html转word等操作


    word格式文件与pdf、html、图片等之间的相互转换

    先附上demo代码地址:

    Github - document-demoinit. Contribute to git-wuxianglong/document-demo development by creating an account on GitHub.https://github.com/git-wuxianglong/document-demo

    简介

    Aspose.Words 是提供了专门针对文档处理的 API 工具,用于以 Word、OpenDocument、Markdown、HTML、PDF 等流行的文件格式的创建、读取、编辑、打印和保存。

    Aspose.Words 除了可以转换这些流行的文档格式外,Aspose.Words 还支持使用文档对象模型 (DOM) 对任何文档元素进行渲染、打印、报告、邮件合并选项和高级格式化。

    支持的文件格式

    • DOC, DOCX, DOT, DOTX, DOCM, DOTM, Word 6.0 or Word 95

    • XML, WordML, XAML, Flat OPC, Flat OPC Macro-Enabled, Flat OPC Template, Flat OPC Macro-Enabled Template

    • HTML, MHTML, MD

    • PDF

    • EPUB, MOBI, CHM, AZW3

    • SVG, TIFF, PNG, BMP, JPEG, GIF, EMF

    • XPS, OpenXPS

    • TXT

    • RTF

    • ODT, OTT

    • PS

    • PCL

    使用

    1. jar 包引入

        • 下载 jar 包,在 src 同级目录下新建 lib 文件夹,将下载的 jar 包拷贝进去

        • pom 文件中引入刚下载的 jar

        
            com.aspose
            aspose-words
            19.1
            system
            ${project.basedir}/lib/aspose-words-19.1.jar
        

         

    2. 使用代码

      • 转换操作工具类代码

      1. import com.aspose.words.*;
      2. import com.google.common.collect.ImmutableMap;
      3. import lombok.extern.slf4j.Slf4j;
      4. import javax.imageio.ImageIO;
      5. import javax.imageio.stream.ImageInputStream;
      6. import java.awt.image.BufferedImage;
      7. import java.io.*;
      8. import java.nio.file.Files;
      9. import java.nio.file.Paths;
      10. import java.util.ArrayList;
      11. import java.util.List;
      12. import java.util.Map;
      13. /**
      14. * aspose words 操作工具类
      15. *
      16. * @author wuxianglong
      17. */
      18. @Slf4j
      19. public class WordUtils {
      20.    private static final String OS_NAME_STR = "os.name";
      21.    private static final String WINDOWS_STR = "windows";
      22.    private static final String FORM_TEXT = "FORMTEXT";
      23.    /**
      24.     * linux系统下pdf操作需要指定字体库
      25.     * Centos8 字体库文件目录
      26.     */
      27.    private static final String LINUX_FONTS_PATH = "/usr/share/fonts";
      28.    public static void main(String[] args) throws Exception {
      29.        checkLicense();
      30.        String inPath = "C:\\Users\\username\\Desktop\\test.docx";
      31.        String outPath = "C:\\Users\\username\\Desktop\\test.html";
      32.        docToPdf(inPath, outPath);
      33.   }
      34.    /**
      35.     * word转html
      36.     *
      37.     * @param inPath 输入文件路径
      38.     * @param outPath 输出文件路径
      39.     * @throws Exception 操作异常
      40.     */
      41.    public static void docToHtml(String inPath, String outPath) throws Exception {
      42.        long start = System.currentTimeMillis();
      43.        Document doc = new Document(inPath);
      44.        HtmlSaveOptions opts = new HtmlSaveOptions(SaveFormat.HTML);
      45.        opts.setHtmlVersion(HtmlVersion.XHTML);
      46.        opts.setExportImagesAsBase64(true);
      47.        opts.setExportPageMargins(true);
      48.        opts.setExportXhtmlTransitional(true);
      49.        opts.setExportDocumentProperties(true);
      50.        doc.save(outPath, opts);
      51.        log.info("WORD转HTML成功,耗时:{}", System.currentTimeMillis() - start);
      52.   }
      53.    /**
      54.     * word转pdf
      55.     *
      56.     * @param inPath 输入文件路径
      57.     * @param outPath 输出文件路径
      58.     * @throws Exception 操作异常
      59.     */
      60.    public static void docToPdf(String inPath, String outPath) throws Exception {
      61.        long start = System.currentTimeMillis();
      62.        log.info("WORD转PDF保存路径:{}", outPath);
      63.        FileOutputStream os = getFileOutputStream(outPath);
      64.        Document doc = new Document(inPath);
      65.        doc.save(os, SaveFormat.PDF);
      66.        os.close();
      67.        log.info("WORD转PDF成功,耗时:{}", System.currentTimeMillis() - start);
      68.   }
      69.    /**
      70.     * word转pdf
      71.     *
      72.     * @param inputStream 文件输入流
      73.     * @param outPath     输出文件路径
      74.     * @throws Exception 操作异常
      75.     */
      76.    public static void docToPdf(InputStream inputStream, String outPath) throws Exception {
      77.        long start = System.currentTimeMillis();
      78.        FileOutputStream os = getFileOutputStream(outPath);
      79.        Document doc = new Document(inputStream);
      80.        doc.save(os, SaveFormat.PDF);
      81.        os.close();
      82.        log.info("WORD转PDF成功,耗时:{}", System.currentTimeMillis() - start);
      83.   }
      84.    /**
      85.     * word转换为图片,每页一张图片
      86.     *
      87.     * @param inPath word文件路径
      88.     * @throws Exception 操作异常
      89.     */
      90.    public static void docToImage(String inPath) throws Exception {
      91.        long start = System.currentTimeMillis();
      92.        log.info("根据WORD页数转换多张图片");
      93.        InputStream inputStream = Files.newInputStream(Paths.get(inPath));
      94.        File file = new File(inPath);
      95.        String name = file.getName();
      96.        String fileName = name.substring(0, name.lastIndexOf("."));
      97.        // 文件父级路径
      98.        String parent = file.getParent();
      99.        log.info("parent:{}", parent);
      100.        // 创建目录
      101.        boolean mkdir = new File(parent + "/" + fileName).mkdir();
      102.        log.info("mkdir:{}", mkdir);
      103.        List bufferedImages = wordToImg(inputStream);
      104.        for (int i = 0; i < bufferedImages.size(); i++) {
      105.            // 写入文件
      106.            ImageIO.write(bufferedImages.get(i), "png", new File(parent + "/" + fileName + "/" + "第" + i + "页" + fileName + ".png"));
      107.       }
      108.        inputStream.close();
      109.        log.info("WORD转图片成功,耗时:{}", System.currentTimeMillis() - start);
      110.   }
      111.    /**
      112.     * word转换为图片,合并为一张图片
      113.     *
      114.     * @param inPath word文件路径
      115.     * @throws Exception 操作异常
      116.     */
      117.    public static void docToOneImage(String inPath) throws Exception {
      118.        long start = System.currentTimeMillis();
      119.        log.info("WORD转换为一张图片");
      120.        InputStream inputStream = Files.newInputStream(Paths.get(inPath));
      121.        File file = new File(inPath);
      122.        String name = file.getName();
      123.        String fileName = name.substring(0, name.lastIndexOf("."));
      124.        String parent = file.getParent();
      125.        List bufferedImages = wordToImg(inputStream);
      126.        // 合并为一张图片
      127.        BufferedImage image = MergeImage.mergeImage(false, bufferedImages);
      128.        ImageIO.write(image, "png", new File(parent + "/" + fileName + ".png"));
      129.        inputStream.close();
      130.        log.info("WORD转图片成功,耗时:{}", System.currentTimeMillis() - start);
      131.   }
      132.    /**
      133.     * html转word
      134.     *
      135.     * @param inPath 输入文件路径
      136.     * @param outPath 输出文件路径
      137.     * @throws Exception 操作异常
      138.     */
      139.    public static void htmlToWord(String inPath, String outPath) throws Exception {
      140.        Document wordDoc = new Document(inPath);
      141.        DocumentBuilder builder = new DocumentBuilder(wordDoc);
      142.        for (Field field : wordDoc.getRange().getFields()) {
      143.            if (field.getFieldCode().contains(FORM_TEXT)) {
      144.                // 去除掉文字型窗体域
      145.                builder.moveToField(field, true);
      146.                builder.write(field.getResult());
      147.                field.remove();
      148.           }
      149.       }
      150.        wordDoc.save(outPath, SaveFormat.DOCX);
      151.   }
      152.    /**
      153.     * html转word,并替换指定字段内容
      154.     *
      155.     * @param inPath 输入文件路径
      156.     * @param outPath 输出文件路径
      157.     * @throws Exception 操作异常
      158.     */
      159.    public static void htmlToWordAndReplaceField(String inPath, String outPath) throws Exception {
      160.        Document wordDoc = new Document(inPath);
      161.        Range range = wordDoc.getRange();
      162.        // 把张三替换成李四,把20替换成40
      163.        ImmutableMap map = ImmutableMap.of("张三", "李四", "20", "40");
      164.        for (Map.Entry str : map.entrySet()) {
      165.            range.replace(str.getKey(), str.getValue(), new FindReplaceOptions());
      166.       }
      167.        wordDoc.save(outPath, SaveFormat.DOCX);
      168.   }
      169.    /**
      170.     * word转pdf,linux下设置字体库文件路径,并返回FileOutputStream
      171.     *
      172.     * @param outPath pdf输出路径
      173.     * @return pdf输出路径 -> FileOutputStream
      174.     * @throws FileNotFoundException FileNotFoundException
      175.     */
      176.    private static FileOutputStream getFileOutputStream(String outPath) throws FileNotFoundException {
      177.        if (!System.getProperty(OS_NAME_STR).toLowerCase().startsWith(WINDOWS_STR)) {
      178.            // linux 需要配置字体库
      179.            log.info("【WordUtils -> docToPdf】linux字体库文件路径:{}", LINUX_FONTS_PATH);
      180.            FontSettings.getDefaultInstance().setFontsFolder(LINUX_FONTS_PATH, false);
      181.       }
      182.        return new FileOutputStream(outPath);
      183.   }
      184.    /**
      185.     * word转图片
      186.     *
      187.     * @param inputStream word input stream
      188.     * @return BufferedImage list
      189.     * @throws Exception exception
      190.     */
      191.    private static List wordToImg(InputStream inputStream) throws Exception {
      192.        Document doc = new Document(inputStream);
      193.        ImageSaveOptions options = new ImageSaveOptions(SaveFormat.PNG);
      194.        options.setPrettyFormat(true);
      195.        options.setUseAntiAliasing(true);
      196.        options.setUseHighQualityRendering(true);
      197.        int pageCount = doc.getPageCount();
      198.        List imageList = new ArrayList<>();
      199.        for (int i = 0; i < pageCount; i++) {
      200.            OutputStream output = new ByteArrayOutputStream();
      201.            options.setPageIndex(i);
      202.            doc.save(output, options);
      203.            ImageInputStream imageInputStream = ImageIO.createImageInputStream(parse(output));
      204.            imageList.add(ImageIO.read(imageInputStream));
      205.       }
      206.        return imageList;
      207.   }
      208.    /**
      209.     * outputStream转inputStream
      210.     *
      211.     * @param out OutputStream
      212.     * @return inputStream
      213.     */
      214.    private static ByteArrayInputStream parse(OutputStream out) {
      215.        return new ByteArrayInputStream(((ByteArrayOutputStream) out).toByteArray());
      216.   }
      217.    /**
      218.     * 校验许可文件
      219.     */
      220.    private static void checkLicense() {
      221.        try {
      222.            InputStream is = com.aspose.words.Document.class.getResourceAsStream("/com.aspose.words.lic_2999.xml");
      223.            if (is == null) {
      224.                return;
      225.           }
      226.            License asposeLicense = new License();
      227.            asposeLicense.setLicense(is);
      228.            is.close();
      229.       } catch (Exception e) {
      230.            e.printStackTrace();
      231.       }
      232.   }
      233. }
      • 图片合并工具类

      1. import java.awt.image.BufferedImage;
      2. import java.util.List;
      3. /**
      4. * 图片合并工具
      5. *
      6. * @author wuxianglong
      7. */
      8. public class MergeImage {
      9.    /**
      10.     * 合并任数量的图片成一张图片
      11.     *
      12.     * @param isHorizontal true代表水平合并,false代表垂直合并
      13.     * @param images       待合并的图片数组
      14.     * @return BufferedImage
      15.     */
      16.    public static BufferedImage mergeImage(boolean isHorizontal, List images) {
      17.        // 生成新图片
      18.        BufferedImage destImage;
      19.        // 计算新图片的长和高
      20.        int allWidth = 0, allHeight = 0, allWidthMax = 0, allHeightMax = 0;
      21.        // 获取总长、总宽、最长、最宽
      22.        for (int i = 0; i < images.size(); i++) {
      23.            BufferedImage img = images.get(i);
      24.            allWidth += img.getWidth();
      25.            if (images.size() != i + 1) {
      26.                allHeight += img.getHeight() + 2;
      27.           } else {
      28.                allHeight += img.getHeight();
      29.           }
      30.            if (img.getWidth() > allWidthMax) {
      31.                allWidthMax = img.getWidth();
      32.           }
      33.            if (img.getHeight() > allHeightMax) {
      34.                allHeightMax = img.getHeight();
      35.           }
      36.       }
      37.        // 创建新图片
      38.        if (isHorizontal) {
      39.            destImage = new BufferedImage(allWidth, allHeightMax, BufferedImage.TYPE_INT_RGB);
      40.       } else {
      41.            destImage = new BufferedImage(allWidthMax, allHeight, BufferedImage.TYPE_INT_RGB);
      42.       }
      43.        // 合并所有子图片到新图片
      44.        int wx = 0, wy = 0;
      45.        for (BufferedImage img : images) {
      46.            int w1 = img.getWidth();
      47.            int h1 = img.getHeight();
      48.            // 从图片中读取RGB
      49.            int[] imageArrayOne = new int[w1 * h1];
      50.            // 逐行扫描图像中各个像素的RGB到数组中
      51.            imageArrayOne = img.getRGB(0, 0, w1, h1, imageArrayOne, 0, w1);
      52.            if (isHorizontal) {
      53.                // 水平方向合并
      54.                // 设置上半部分或左半部分的RGB
      55.                destImage.setRGB(wx, 0, w1, h1, imageArrayOne, 0, w1);
      56.           } else {
      57.                // 垂直方向合并
      58.                // 设置上半部分或左半部分的RGB
      59.                destImage.setRGB(0, wy, w1, h1, imageArrayOne, 0, w1);
      60.           }
      61.            wx += w1;
      62.            wy += h1 + 2;
      63.       }
      64.        return destImage;
      65.   }
      66. }

    官方文档

  • 相关阅读:
    数据结构学习笔记——归并排序
    单词猎手游戏
    响应式网站建站源码系统+完整的搭建教程
    挂载新的空间磁盘(解锁)
    CJO 系列丨创造价值:CJO 如何解决核心业务挑战
    用深度强化学习玩FlappyBird
    canvas绘制基本图形——矩形
    【SetpNumber计数器StepNumber详解,购物车制作(呆),五星好评制作Starjs详解】
    常用排序算法时间与空间复杂度
    Vue进阶之Vue无代码可视化项目(三)
  • 原文地址:https://blog.csdn.net/u012835548/article/details/126054066