JAVA Word 转 图片,Word 转 PDF 复制即用

JAVA Word 转 图片,Word 转 PDF

1.使用 spire.doc 包生成

spire是 E-iceblue 公司的工具包,有付费版和年费版,免费版本的包使用上有限制,只能转换前3页,后面的页需要通过购买付费版才可以,价格是相当贵
sprie 的好处是专业,里面有word 的各种组件库和符号库等,转换后的清晰度很高
若是确保 Word 文档生成在3页及以内,可以选择sprie 包

(1) 获取资源,引入依赖

使用外部依赖包, 包资源下载地址
①将获取的jar 包拷贝到 resources 的lib ,目录下

②点击 File -> project Structure
在这里插入图片描述
③将jar 包添加到 依赖中
在这里插入图片描述
④pom.xml 引入本地包

         <!--引入本地jar包-->
        <dependency>
            <groupId>e-iceblue</groupId>
            <artifactId>spire.doc.free</artifactId>
            <version>5.2.0</version>
            <systemPath>${project.basedir}/src/main/resources/lib/spire.doc.free-5.2.0.jar</systemPath>
        </dependency>

(2).工具类


import com.spire.doc.Document;
import com.spire.doc.FileFormat;
import com.spire.doc.documents.ImageType;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;

public class WordUtils {


    public static void main(String[] args) throws Exception {
        String inputFileName = "D:\\download\\问卷.doc";
        String outFileName = "D:\\download\\问卷";
        wordToImgSpireAll(inputFileName, outFileName);//word 转为 多张图片 只能生成3张 但清晰度高 确保3页内 word 可使用
        wordToPDFSpire(inputFileName, outFileName);//将 word 转为 PDF     只能生成3页 但清晰度高 确保3页内 word 可使用

    }


    /**
     * 将 word 转为 多张图片
     * 限制: 只能生成3张 但清晰度高
     */
    public static void wordToImgSpireAll(String inputFileName, String outFilePath) throws Exception {
        //创建Document实例
        Document doc = new Document();
        //加载Word文档
        doc.loadFromFile(inputFileName);
        //转换到图片并设置图片的分辨率
        BufferedImage[] images = doc.saveToImages(0, doc.getPageCount(), ImageType.Bitmap, 500, 500);
        int i = 0;
        for (BufferedImage image : images) {
            //保存为.png文件格式
            File file = new File(outFilePath + i + ".png");
            ImageIO.write(image, "PNG", file);
            i++;
        }
    }


    /**
     * 将 word 转为 PDF
     * 限制: 只能生成3页 但清晰度高
     */
    public static void wordToPDFSpire(String inputFileName, String outFileName) {
        //创建Document实例
        Document doc = new Document();
        //加载Word文档
        doc.loadFromFile(inputFileName);
        doc.saveToFile(outFileName + ".pdf", FileFormat.PDF);
    }
}

2.使用 aspose.words 包生成

(1) 获取资源,引入依赖

使用外部依赖包, jar 包名:aspose-words-15.8.0-jdk16.jar 网上直接搜就有

①将获取的jar 包拷贝到 resources 的lib ,目录下

②点击 File -> project Structure
在这里插入图片描述
③将jar 包添加到 依赖中
在这里插入图片描述
④pom.xml 引入本地包

         <!--引入本地jar包-->
       <dependency>
            <groupId>com.aspose</groupId>
            <artifactId>aspose.words</artifactId>
            <version>15.8.0</version>
            <systemPath>${project.basedir}/src/main/resources/lib/aspose-words-15.8.0-jdk16.jar</systemPath>
        </dependency>

(2).工具类

import com.spire.doc.Document;
import com.spire.doc.FileFormat;
import com.spire.doc.documents.ImageType;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;

public class WordUtils {


    public static void main(String[] args) throws Exception {
        String inputFileName = "D:\\download\\问卷.doc";
        String outFileName = "D:\\download\\问卷";
        wordToImgAsposeAll(inputFileName, outFileName);// 将 word 转为 多张图片
        wordToImgAsposeOne(inputFileName, outFileName);// 将 word 转为 1张长图片
        wordToPDFAspose(inputFileName, outFileName);//将 word 转为 PDF
    }

    /**
     * 将 word 转为 多张图片
     */
    public static void wordToImgAsposeAll(String inputfilePath, String outFilePath) throws Exception {
        //word转图片格式
        try {
            File file = new File(inputfilePath);
            InputStream inStream = new FileInputStream(file);
            List<BufferedImage> wordToImg = AsposeUtils.wordToImg(inStream);
            //可以保存图片(每页保存为一张)
            for (int i = 0; i < wordToImg.size(); i++) {
                ImageIO.write(wordToImg.get(i), "jpg", new File(outFilePath + i + ".png"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 将 word 转为 1张长图片
     */
    public static void wordToImgAsposeOne(String inputfilePath, String outFilePath) throws Exception {
        //word转图片格式
        try {
            File file = new File(inputfilePath);
            InputStream inStream = new FileInputStream(file);
            List<BufferedImage> wordToImg = AsposeUtils.wordToImg(inStream);

            //保存图片(长图)
            BufferedImage mergeImage = AsposeUtils.mergeImage(false, wordToImg);
            ImageIO.write(mergeImage, "jpg", new File(outFilePath + ".png"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 将 word 转为 PDF
     */
    private static void wordToPDFAspose(String inputFileName, String outFileName) {
        AsposeUtils.wordToPdf(inputFileName, outFileName + ".pdf");
    }

}

package com.begete.word.utils;

import com.aspose.words.Document;
import com.aspose.words.ImageSaveOptions;
import com.aspose.words.SaveFormat;

import javax.imageio.stream.ImageInputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


public class AsposeUtils {

    /**
     * 验证aspose.word组件是否授权:无授权的文件有水印标记
     * 需要使用(aspose-words-15.8.0-jdk16.jar),版本要对应。无水印
     *
     * @return
     */
    public static boolean isWordLicense() {
        boolean result = false;
        try {
            String s = "<License><Data><Products><Product>Aspose.Total for Java</Product><Product>Aspose.Words for Java</Product></Products><EditionType>Enterprise</EditionType><SubscriptionExpiry>20991231</SubscriptionExpiry><LicenseExpiry>20991231</LicenseExpiry><SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber></Data><Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature></License>";
            ByteArrayInputStream inputStream = new ByteArrayInputStream(s.getBytes());
            com.aspose.words.License license = new com.aspose.words.License();
            license.setLicense(inputStream);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    //outputStream转inputStream
    public static ByteArrayInputStream parse(OutputStream out) throws Exception {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        baos = (ByteArrayOutputStream) out;
        ByteArrayInputStream swapStream = new ByteArrayInputStream(baos.toByteArray());
        return swapStream;
    }

    /**
     * word和txt文件 转换 图片
     *
     * @param inputStream
     * @param
     * @return
     * @throws Exception
     */
    public static List<BufferedImage> wordToImg(InputStream inputStream) throws Exception {
        if (!isWordLicense()) {
            return null;
        }
        try {
            Date start = new Date();
            Document doc = new Document(inputStream);
            ImageSaveOptions options = new ImageSaveOptions(SaveFormat.PNG);
            options.setPrettyFormat(true);
            options.setUseAntiAliasing(true);
            options.setUseHighQualityRendering(true);
            int pageCount = doc.getPageCount();
            //生成前pageCount张,这可以限制输出长图时的页数(方法入参可以传值pageNum)
           /*if (pageCount > pageNum) {
               pageCount = pageNum;
           }*/
            List<BufferedImage> imageList = new ArrayList<BufferedImage>();
            for (int i = 0; i < pageCount; i++) {
                OutputStream output = new ByteArrayOutputStream();
                options.setPageIndex(i);
                doc.save(output, options);
                ImageInputStream imageInputStream = javax.imageio.ImageIO.createImageInputStream(parse(output));
                imageList.add(javax.imageio.ImageIO.read(imageInputStream));
            }
            List<BufferedImage> imageList2 = new ArrayList<BufferedImage>();
            //这个重新生成新的图片是因为直接输出的图片底色为红色
            for (int j = 0; j < imageList.size(); j++) {
                // 生成新图片
                BufferedImage destImage = imageList.get(j);
                int w1 = destImage.getWidth();
                int h1 = destImage.getHeight();
                destImage = new BufferedImage(w1, h1, BufferedImage.TYPE_INT_RGB);
                Graphics2D g2 = (Graphics2D) destImage.getGraphics();
                g2.setBackground(Color.LIGHT_GRAY);
                g2.clearRect(0, 0, w1, h1);
                g2.setPaint(Color.RED);
                // 从图片中读取RGB
                int[] ImageArrayOne = new int[w1 * h1];
                ImageArrayOne = imageList.get(j).getRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 逐行扫描图像中各个像素的RGB到数组中
                destImage.setRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGB
                imageList2.add(destImage);
            }
            Date end = new Date();
            long l = end.getTime() - start.getTime();
            long hour = l / (1000 * 60 * 60);
            long min = (l - hour * (1000 * 60 * 60)) / (1000 * 60);
            long s = (l - hour * (1000 * 60 * 60) - min * 1000 * 60) / (1000);
            long ss = (l - hour * (1000 * 60 * 60) - min * 1000 * 60 - s * 1000) / (1000 / 60);
            System.out.println("word转图片时间:" + min + "分" + s + "秒" + ss + "毫秒");//hour+"小时"+
            return imageList2;
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
    }

    /**
     * 合并任数量的图片成一张图片
     *
     * @param isHorizontal true代表水平合并,fasle代表垂直合并
     * @param imgs         待合并的图片数组
     * @return
     * @throws IOException
     */
    public static BufferedImage mergeImage(boolean isHorizontal, List<BufferedImage> imgs) throws IOException {
        // 生成新图片
        BufferedImage destImage = null;
        // 计算新图片的长和高
        int allw = 0, allh = 0, allwMax = 0, allhMax = 0;
        // 获取总长、总宽、最长、最宽
        for (int i = 0; i < imgs.size(); i++) {
            BufferedImage img = imgs.get(i);
            allw += img.getWidth();
            if (imgs.size() != i + 1) {
                allh += img.getHeight() + 5;
            } else {
                allh += img.getHeight();
            }
            if (img.getWidth() > allwMax) {
                allwMax = img.getWidth();
            }
            if (img.getHeight() > allhMax) {
                allhMax = img.getHeight();
            }
        }
        // 创建新图片
        if (isHorizontal) {
            destImage = new BufferedImage(allw, allhMax, BufferedImage.TYPE_INT_RGB);
        } else {
            destImage = new BufferedImage(allwMax, allh, BufferedImage.TYPE_INT_RGB);
        }
        Graphics2D g2 = (Graphics2D) destImage.getGraphics();
        g2.setBackground(Color.LIGHT_GRAY);
        g2.clearRect(0, 0, allw, allh);
        g2.setPaint(Color.RED);

        // 合并所有子图片到新图片
        int wx = 0, wy = 0;
        for (int i = 0; i < imgs.size(); i++) {
            BufferedImage img = imgs.get(i);
            int w1 = img.getWidth();
            int h1 = img.getHeight();
            // 从图片中读取RGB
            int[] ImageArrayOne = new int[w1 * h1];
            ImageArrayOne = img.getRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 逐行扫描图像中各个像素的RGB到数组中
            if (isHorizontal) { // 水平方向合并
                destImage.setRGB(wx, 0, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGB
            } else { // 垂直方向合并
                destImage.setRGB(0, wy, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGB
            }
            wx += w1;
            wy += h1 + 5;
        }
        return destImage;
    }

    /**
     * 当文档中含有中文字符时,该段代码的执行需要调用操作系统的本地字体库支持,否则所有中文字符都将乱码。
     * <p>
     * 该段代码如果想要在Linux服务器上完美运行,需要给Linux服务器安装中文字体库
     * <p>
     * 如何在Linux环境安装Windows字体库
     * Java使用Spire.Pdf或Aspose-Words实现Word转换Pdf在Linux服务器上的中文乱码问题
     * 解决: https://blog.csdn.net/neulily2005/article/details/106003527
     */
    public static boolean wordToPdf(String inPath, String outPath) {
        if (!isWordLicense()) {
            return false;
        }
        FileOutputStream os = null;
        try {
            long old = System.currentTimeMillis();
            File file = new File(outPath); // 新建一个空白pdf文档
            os = new FileOutputStream(file);
            Document doc = new Document(inPath); // Address是将要被转化的word文档
            doc.save(os, SaveFormat.PDF);// 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF,
            // EPUB, XPS, SWF 相互转换
            long now = System.currentTimeMillis();
            System.out.println("pdf转换成功,共耗时:" + ((now - old) / 1000.0) + "秒"); // 转化用时
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            if (os != null) {
                try {
                    os.flush();
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return true;
    }


}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,可以使用Apache POI和iText库来实现WordPDF的功能。 1. Apache POI是一个用于读写Microsoft Office格式文件的Java库。它提供了一组API,可以操作Word文档。要将Word文档换为PDF,可以使用Apache POI读取Word文档的内容,并将其写入PDF文件中。 2. iText是一个用于创建和操作PDF文件的Java库。它提供了一组API,可以创建、修改和PDF文件。要将Word文档换为PDF,可以使用iText库创建一个空白的PDF文件,然后使用Apache POI读取Word文档的内容,并将其写入PDF文件中。 下面是一个使用Apache POI和iText库将Word文档换为PDF的示例代码: ```java 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.Document; import com.itextpdf.text.Paragraph; import com.itextpdf.text.pdf.PdfWriter; import java.io.FileInputStream; import java.io.FileOutputStream; public class WordToPdfConverter { public static void main(String[] args) { String wordFilePath = "path/to/word/document.docx"; String pdfFilePath = "path/to/pdf/document.pdf"; try { // 读取Word文档 XWPFDocument document = new XWPFDocument(new FileInputStream(wordFilePath)); // 创建PDF文档 Document pdfDocument = new Document(); PdfWriter.getInstance(pdfDocument, new FileOutputStream(pdfFilePath)); pdfDocument.open(); // 逐段读取Word文档内容,并写入PDF文档 for (XWPFParagraph paragraph : document.getParagraphs()) { String text = paragraph.getText(); pdfDocument.add(new Paragraph(text)); } // 关闭PDF文档 pdfDocument.close(); System.out.println("WordPDF成功!"); } catch (Exception e) { e.printStackTrace(); } } } ``` 请注意,上述示例代码中的`wordFilePath`和`pdfFilePath`需要替换为实际的Word文件路径和要保存的PDF文件路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值