文档转PDF及图片(Java版本)

maven项目添加依赖包

<dependency>
            <groupId>com.luhuiguo</groupId>
            <artifactId>aspose-cells</artifactId>
            <version>22.10</version>
        </dependency>
        <dependency>
            <groupId>com.luhuiguo</groupId>
            <artifactId>aspose-words</artifactId>
            <version>23.1</version>
        </dependency>
        <dependency>
            <groupId>com.luhuiguo</groupId>
            <artifactId>aspose-pdf</artifactId>
            <version>23.1</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.4.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.docx4j</groupId>
            <artifactId>docx4j</artifactId>
            <version>3.2.2</version>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-reload4j</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>
       <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.17.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.11.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.xmlbeans</groupId>
            <artifactId>xmlbeans</artifactId>
            <version>5.0.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-compress</artifactId>
            <version>1.19</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
            <version>4.1</version>
        </dependency>
        <dependency>
            <groupId>com.zaxxer</groupId>
            <artifactId>SparseBitSet</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.6.0</version>
        </dependency>
        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.26.0-GA</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.5</version>
        </dependency>
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv-platform</artifactId>
            <version>1.5.7</version>
        </dependency>

转PDF及图片工具类:



import com.aspose.cells.PdfSaveOptions;
import com.aspose.cells.Workbook;
import com.aspose.pdf.PageCollection;
import com.aspose.pdf.devices.JpegDevice;
import com.aspose.words.License;
import com.aspose.words.SaveFormat;
import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
import org.apache.poi.hslf.usermodel.*;
import org.apache.poi.xslf.usermodel.*;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.List;

public class PdfConverUtil {
    /**
     *
     * @param inputStream 源文件输入流
     * @param outputStream PDF文件输入流
     * @return
     */
    public static boolean imgToPdf(InputStream inputStream, OutputStream outputStream){
        Document document = null;
        try{
            //创建文档,三个字pdf页面的大小 A2-A9,个人觉得A3最合适
            document = new Document(PageSize.A3,20,20,20,20);
            //新建PDF文档,具体逻辑看.getInstance方法
            PdfWriter.getInstance(document,outputStream);

            document.open();
            document.newPage();

            //将文件流转换为字节流,便于格式转换
            BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            byte[] bytes = new byte[1024];
            int length = 0;
            while (-1!=(length = bufferedInputStream.read(bytes))){
                byteArrayOutputStream.write(bytes,0,length);
            }
            //处理img图片
            Image image = Image.getInstance(byteArrayOutputStream.toByteArray());
            float height = image.getHeight();
            float width = image.getWidth();
            float percent = 0.0f;
            //设置像素或者长宽高将会影响图片的清晰度,因为只是对图片放大或缩小
            if (height > width){
                //A4-A9
                percent = PageSize.A6.getHeight() / height * 100;
            }else{
                percent = PageSize.A6.getWidth()/width*100;
            }
            image.setAlignment(Image.MIDDLE);
            image.scalePercent(percent);

            //将图片放入文档中,完成PDF转换
            document.add(image);
            System.out.println("image转换完毕");
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }finally {
            try{
                if (document != null){
                    document.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        return true;
    }
    public static boolean wordTopdfByAspose(InputStream inputStream,OutputStream outputStream){
        //验证License 若不验证则转化除的PDF文档会有水印产生
        if (!getLicense()){
            return false;
        }
        try{
            com.aspose.words.Document doc = new com.aspose.words.Document(inputStream);
            //全面支持DOC DOCX OOXML RTF HTML OPENDOCUMENT PDF EPUB XPS SWF 相互转换
            doc.save(outputStream, SaveFormat.PDF);
            System.out.println("word转换完毕");
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }finally {
            if (outputStream != null){
                try{
                    outputStream.flush();
                    outputStream.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
            if (inputStream != null){
                try{
                    inputStream.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
        }
        return true;
    }
    // 官方文档的要求 无需理会
    public static boolean getLicense() {
        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 is = new ByteArrayInputStream(s.getBytes());
            License aposeLic = new License();
            aposeLic.setLicense(is);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
    public static boolean excelToPdf(InputStream inputStream,OutputStream outputStream){
        if (!getExeclLicense()){
            return false;
        }
        try{
            Workbook workbook = new Workbook(inputStream);
            PdfSaveOptions pdfSaveOptions = new PdfSaveOptions();
            pdfSaveOptions.setOnePagePerSheet(false);
            int[] autoDrawSheets={3};
            autoDraw(workbook,autoDrawSheets);
            int[] showSheets={0};
            //隐藏workbook中不需要的sheet页
            printSheetPage(workbook,showSheets);
            workbook.save(outputStream,pdfSaveOptions);
            outputStream.flush();
            outputStream.close();
            System.out.println("excel转换完毕");
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if (outputStream != null){
                try{
                    outputStream.flush();
                    outputStream.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
            if (inputStream != null){
                try{
                    inputStream.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
        }
        return true;
    }
    public static boolean getExeclLicense() {
        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 is = new ByteArrayInputStream(s.getBytes());
            com.aspose.cells.License aposeLic = new com.aspose.cells.License();
            aposeLic.setLicense(is);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
    //隐藏workbook中不需要的sheet页
    public static void printSheetPage(Workbook workbook, int[] page) {
        for (int i = 1;i < workbook.getWorksheets().getCount();i++){
            workbook.getWorksheets().get(i).setVisible(false);
        }
        if (null == page || page.length == 0){
            workbook.getWorksheets().get(0).setVisible(true);
        }else{
            for (int i = 0; i < page.length;i++){
                workbook.getWorksheets().get(i).setVisible(true);
            }
        }
    }

    //设置打印的sheet,自动拉伸比例
    public static void autoDraw(Workbook workbook, int[] page) {
        if (null != page && page.length > 0){
            for (int i = 0;i < page.length;i++){
                workbook.getWorksheets().get(i).getHorizontalPageBreaks().clear();
                workbook.getWorksheets().get(i).getVerticalPageBreaks().clear();
            }
        }
    }

    /**
     * pptToPdf
     * @param inputStream
     * @param outputStream
     * @return
     */
    public static boolean pptToPdf(InputStream inputStream, OutputStream outputStream) {

        Document document = null;
        HSLFSlideShow hslfSlideShow = null;
        PdfWriter pdfWriter = null;

        try {
            hslfSlideShow = new HSLFSlideShow(inputStream);

            // 获取ppt文件页面
            Dimension dimension = hslfSlideShow.getPageSize();

            document = new Document();

            // pdfWriter实例
            pdfWriter = PdfWriter.getInstance(document, outputStream);

            document.open();

            PdfPTable pdfPTable = new PdfPTable(1);

            List<HSLFSlide> hslfSlideList = hslfSlideShow.getSlides();

            for (int i=0; i < hslfSlideList.size(); i++) {
                HSLFSlide hslfSlide = hslfSlideList.get(i);
                // 设置字体, 解决中文乱码
                for (HSLFShape shape : hslfSlide.getShapes()) {
                    if (shape instanceof HSLFTextShape) {
                        HSLFTextShape textShape = (HSLFTextShape) shape;
                        for (HSLFTextParagraph textParagraph : textShape.getTextParagraphs()) {
                            for (HSLFTextRun textRun : textParagraph.getTextRuns()) {
                                textRun.setFontFamily("宋体");
                            }
                        }
                    }
                }
                BufferedImage bufferedImage = new BufferedImage((int)dimension.getWidth(), (int)dimension.getHeight(), BufferedImage.TYPE_INT_RGB);

                Graphics2D graphics2d = bufferedImage.createGraphics();

                graphics2d.setPaint(Color.white);
                graphics2d.setFont(new java.awt.Font("宋体", java.awt.Font.PLAIN, 12));

                hslfSlide.draw(graphics2d);

                graphics2d.dispose();

                Image image = Image.getInstance(bufferedImage, null);
                image.scalePercent(50f);

                // 写入单元格
                pdfPTable.addCell(new PdfPCell(image, true));
                document.add(image);

            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            if (document != null) {
                document.close();
            }
            if (pdfWriter != null) {
                pdfWriter.close();
            }
            if (outputStream != null){
                try{
                    outputStream.flush();
                    outputStream.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
            if (inputStream != null){
                try{
                    inputStream.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
        }
        System.out.println("ppt转换完毕");
        return true;
    }

    /**
     *  pptxToPdf
     * @param inputStream
     * @param outputStream
     * @return
     */
    public static boolean pptxToPdf(InputStream inputStream, OutputStream outputStream) {

        Document document = null;

        XMLSlideShow slideShow = null;

        PdfWriter pdfWriter = null;

        try {

            slideShow = new XMLSlideShow(inputStream);

            Dimension dimension = slideShow.getPageSize();

            document = new Document();

            pdfWriter = PdfWriter.getInstance(document, outputStream);

            document.open();

            PdfPTable pdfPTable = new PdfPTable(1);

            List<XSLFSlide> slideList = slideShow.getSlides();

            for (int i = 0, row = slideList.size(); i < row; i++) {

                XSLFSlide slide = slideList.get(i);

                // 设置字体, 解决中文乱码
                for (XSLFShape shape : slide.getShapes()) {
                    if (shape instanceof XSLFTextShape) {
                        XSLFTextShape textShape = (XSLFTextShape) shape;

                        for (XSLFTextParagraph textParagraph : textShape.getTextParagraphs()) {
                            for (XSLFTextRun textRun : textParagraph.getTextRuns()) {
                                textRun.setFontFamily("宋体");
                            }
                        }
                    }
                }

                BufferedImage bufferedImage = new BufferedImage((int)dimension.getWidth(), (int)dimension.getHeight(), BufferedImage.TYPE_INT_RGB);

                Graphics2D graphics2d = bufferedImage.createGraphics();

                graphics2d.setPaint(Color.white);
                graphics2d.setFont(new java.awt.Font("宋体", java.awt.Font.PLAIN, 12));

                slide.draw(graphics2d);

                graphics2d.dispose();

                Image image = Image.getInstance(bufferedImage, null);
                image.scalePercent(50f);

                // 写入单元格
                pdfPTable.addCell(new PdfPCell(image, true));
                document.add(image);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            if (document != null) {
                document.close();
            }
            if (pdfWriter != null) {
                pdfWriter.close();
            }
            if (outputStream != null){
                try{
                    outputStream.flush();
                    outputStream.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
            if (inputStream != null){
                try{
                    inputStream.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
        }
        System.out.println("pptx转换完毕");
        return true;
    }

    /**
     * pdf生成图片(第一页下标从1开始)
     *
     * @param pdfPath
     * @param imgFullPathName
     */
    public static boolean pdfToImg1(String pdfPath, String imgFullPathName) {

        com.aspose.pdf.Document pdf = new com.aspose.pdf.Document(pdfPath);
        PageCollection pages = pdf.getPages();
        // pdf总页数
        int size = pages.size();
        boolean isOne = false;
        /**
         * 图片宽度:800 图片高度:100 分辨率 960 Quality [0-100] 最大100 new JpegDevice(800, 1000,
         * resolution, 90);
         */
        JpegDevice jpegDevice = new JpegDevice(100);
        //只取一张图片
        if (size > 0){
            if (size == 1){
                //是否只有一张图片
                isOne = true;
            }
            // 输出路径
            FileOutputStream fileOs = null;
            try {

//				File file = new File(imgFullPathName);
                File file = new File(imgFullPathName+".png");
                if (!file.exists()) {
                    file.createNewFile();
                }
                fileOs = new FileOutputStream(file);
                jpegDevice.process(pages.get_Item(1), fileOs);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (fileOs != null) {
                        fileOs.flush();
                        fileOs.close();
                    }
                    pdf.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return isOne;
    }

    public static void main(String[] args) {
        // imgae to pdf
       /* try {
            FileInputStream inputStream = new FileInputStream("C:\\Users\\zmd\\Downloads\\40239a44de0cd28ab095674e313419c6.png");
            FileOutputStream byteArrayOutputStream = new FileOutputStream("C:\\Users\\zmd\\Downloads\\40239a44de0cd28ab095674e313419c6.pdf");
            PdfConverUtil.imgToPdf(inputStream, byteArrayOutputStream);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        // doc/docx to pdf
        try {
            FileInputStream inputStream = new FileInputStream("C:\\Users\\zmd\\Downloads\\45c686e8-c4ba-4f55-ac9a-f9269f3a0685-20230710050128776.docx");
            FileOutputStream byteArrayOutputStream = new FileOutputStream("C:\\Users\\zmd\\Downloads\\45c686e8-c4ba-4f55-ac9a-f9269f3a0685-20230710050128776.pdf");
            PdfConverUtil.wordTopdfByAspose(inputStream, byteArrayOutputStream);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        // execl to pdf
        try {
            FileInputStream inputStream = new FileInputStream("C:\\Users\\zmd\\Downloads\\0b75f563d174464299ff964522e98569.xlsx");
            FileOutputStream byteArrayOutputStream = new FileOutputStream("C:\\Users\\zmd\\Downloads\\0b75f563d174464299ff964522e98569.pdf");
            PdfConverUtil.excelToPdf(inputStream, byteArrayOutputStream);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
*/
        // ppt tp pdf
        /*try {
            FileInputStream inputStream = new FileInputStream("C:\\Users\\zmd\\Downloads\\jjj.ppt");
            FileOutputStream byteArrayOutputStream = new FileOutputStream("C:\\Users\\zmd\\Downloads\\jjj.pdf");
            PdfConverUtil.pptToPdf(inputStream, byteArrayOutputStream);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        // pptx to pdf
        try {
            FileInputStream inputStream = new FileInputStream("C:\\Users\\zmd\\Downloads\\2.pptx");
            FileOutputStream byteArrayOutputStream = new FileOutputStream("C:\\Users\\zmd\\Downloads\\2.pdf");
            PdfConverUtil.pptxToPdf(inputStream, byteArrayOutputStream);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }*/

        pdfToImg1("C:\\Users\\zmd\\Downloads\\45c686e8-c4ba-4f55-ac9a-f9269f3a0685-20230710050128776.pdf",
                "C:\\Users\\zmd\\Downloads\\45c686e8-c4ba-4f55-ac9a-f9269f3a0685-20230710050128776");
    }
}

图片裁剪:

/**
     * 进行裁剪操作
     *
     * @param originalImage the original image
     * @param width         the width
     * @param height        the height
     * @return the buffered image
     * @throws IOException the io exception
     */
    public static BufferedImage cutJPG(BufferedImage originalImage, int width, int height) throws IOException {
        Iterator<ImageReader> iterator = ImageIO.getImageReadersByFormatName("jpg");
        ImageReader reader = iterator.next();
        // 转换成字节流
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        // writeToJPEG(1080,originalImage,0.5f,outputStream);
        ImageIO.write(originalImage, "jpg", outputStream);
        InputStream is = new ByteArrayInputStream(outputStream.toByteArray());
        ImageInputStream iis = ImageIO.createImageInputStream(is);
        reader.setInput(iis, true);
        ImageReadParam param = reader.getDefaultReadParam();
        Rectangle rect = new Rectangle(0, 0, width, height);
        param.setSourceRegion(rect);
        return reader.read(0, param);
    }


//裁剪方法:裁剪高度的三分之一
File imgFile = new File(imgPath);
BufferedImage bufferedImage = ImageIO.read(imgFile);
bufferedImage = cutJPG(bufferedImage, bufferedImage.getWidth(), bufferedImage.getHeight()/3);
ImageIO.write(bufferedImage,"jpeg",imgFile);

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要将MultipartFile文档PDF,你可以按照以下步骤进行操作: 1. 首先,确保你的Java代码的Key与图中框内的Key一致,这是为了保持一致性。 2. 将项目所需的jar包下载并放置在项目的resources目录下的lib文件夹中。如果这些jar包无法通过maven中央仓库直接下载,你可以通过百度网盘等方式获取下载链接。 3. 准备一个模板,该模板是一个Word文档。在修改好所需的格式后,将其保存为PDF格式。 4. 为了编辑PDF文档,你需要使用Adobe Acrobat 9 Pro或类似的软件。该软件能够进行PDF文件的编辑,包括添加文字和图片等功能。 通过以上步骤,你可以将MultipartFile文档换为PDF格式,并根据需要进行编辑和修改。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Java实现PDF生成(Word文档Pdf)](https://blog.csdn.net/zxy855/article/details/122495989)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [JAVA实现word to pdf换](https://blog.csdn.net/weixin_45637762/article/details/125365873)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞流银河

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值