HTML、图片以及word转换成pdf

一、HTML转PDF

对于Html转换成PDF,首先需要页面前端处理好页面,如果Html不规范或存在 等特殊字符,可能到转换失败。

1.1 Maven引入依赖

        <!-- html转pdf  -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>html2pdf</artifactId>
            <version>3.0.2</version>
        </dependency>
        <!-- 中文字体支持 -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>font-asian</artifactId>
            <version>7.1.16</version>
        </dependency>

<!--        预处理html-->
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.14.3</version>
        </dependency>

1.2 编写工具类

import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.font.FontProvider;
import com.itextpdf.styledxmlparser.css.media.MediaDeviceDescription;
import com.itextpdf.styledxmlparser.css.media.MediaType;
import lombok.extern.slf4j.Slf4j;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;


import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Slf4j
public class HtmlConvertPdfUtil {

    public static void convertToPdf(String filePath, String pdfPath) throws IOException {
        log.info("{}:进行PDF转换",filePath);
        //对html页面进行预处理
        File input = new File(filePath);
        Document doc = Jsoup.parse(input, "UTF-8");

        // 选择所有的 <script>标签并删除
        Elements scripts = doc.select("script");
        if(!scripts.isEmpty()){
            scripts.remove();
        }

        String processedHtml = doc.outerHtml();
        InputStream inputStream = new ByteArrayInputStream(processedHtml.getBytes());

        //若存在输出的pdf文件先删除,再创建
        File file = new File(pdfPath);
        if(file.isFile() && file.exists()){
            file.delete();
        }

        //创建输出的pdf
        InputStream fileInputStream = new FileInputStream(filePath);
        PdfWriter pdfWriter = new PdfWriter(new FileOutputStream(pdfPath));
        PdfDocument pdfDocument = new PdfDocument(pdfWriter);

        //设置为A4大小
        pdfDocument.setDefaultPageSize(PageSize.A0);

        //添加中文字体支持
        ConverterProperties properties = new ConverterProperties();
        FontProvider fontProvider = new FontProvider();
        fontProvider.addFont("/static/fonts/SimHei.ttf");
        properties.setFontProvider(fontProvider);
        properties.setMediaDeviceDescription(new MediaDeviceDescription(MediaType.PRINT));

        //启用立即刷新和分页控制
        properties.setImmediateFlush(true);

        //读取Html文件流,查找出当中的&nbsp;或出现类似的符号空格字符
        inputStream = readInputStrem(inputStream);
        HtmlConverter.convertToPdf(inputStream, pdfDocument, properties);

        pdfWriter.close();
        pdfDocument.close();
        log.info("{}:PDF转换成功",filePath);
    }

    //从Html文件流查找出当中的&nbsp;或出现类似的符号空格字符并替换掉
    private static InputStream readInputStrem(InputStream inputStream) {
        // 定义一些特殊字符的正则表达式 如:
        String regEx_special = "\\&[a-zA-Z]{1,10};";
        try(ByteArrayOutputStream baos = new ByteArrayOutputStream();) {
            // 创建缓存大小
            byte[] buffer = new byte[108192];
            // 每次读取到内容的长度
            int len = -1;
            // 开始读取输入流中的内容
            while ((len = inputStream.read(buffer)) != -1) { //当等于-1说明没有数据可以读取了
                baos.write(buffer, 0, len);   //把读取到的内容写到输出流中
            }
            // 把字节数组转换为字符串 设置utf-8字符编码
            String content = baos.toString(String.valueOf(StandardCharsets.UTF_8));
            // 关闭输入流和输出流
            inputStream.close();
            // 判断HTML内容是否具有HTML的特殊字符标记
            Pattern compile = Pattern.compile(regEx_special, Pattern.CASE_INSENSITIVE);
            Matcher matcher = compile.matcher(content);
            String replaceAll = matcher.replaceAll("");
            // 将字符串转化为输入流返回
            return getStringStream(replaceAll);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("错误信息:pdf字符串格式化特殊字符失败{}", e.getMessage());
            return null;
        }
    }

    public static InputStream getStringStream(String sInputString) {
        if (sInputString != null && !sInputString.trim().equals("")) {
            try {
                return new ByteArrayInputStream(sInputString.getBytes(StandardCharsets.UTF_8)); // 设置utf-8字符编码
            } catch (Exception e) {
                e.printStackTrace();
                log.error("错误信息:pdf字符串转输入流失败,{}", e.getMessage());
            }
        }
        return null;
    }

}

二、图片转PDF

2.1 Maven引入依赖

<!--        图片转pdf-->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>kernel</artifactId>
            <version>7.1.16</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>layout</artifactId>
            <version>7.1.16</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>io</artifactId>
            <version>7.1.16</version>
        </dependency>

2.2 编写工具类

import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Image;
import com.itextpdf.layout.property.HorizontalAlignment;
import lombok.extern.slf4j.Slf4j;


import java.io.File;
import java.io.FileOutputStream;

@Slf4j
public class ImageConvertPdfUtil {

    // 将图片列表转换为 PDF
    public static void convertToPdf(String filePath, String pdfPath) {
        log.info("{}:进行PDF转换",filePath);
        try {
            //若存在该文件先删除,再创建
            File file = new File(pdfPath);
            if(file.isFile() && file.exists()){
                file.delete();
            }

            // 创建 PDF 文档
            PdfWriter writer = new PdfWriter(new FileOutputStream(pdfPath));
            PdfDocument pdfDocument = new PdfDocument(writer);
            Document document = new Document(pdfDocument);

            // 获取pdf页面尺寸
            PageSize pageSize = pdfDocument.getDefaultPageSize();
            float pageWidth = pageSize.getWidth();
            float pageHeight = pageSize.getHeight();

            // 将图片添加到 PDF 文档
            addImageToPdf(document, filePath, pageWidth, pageHeight);

            // 关闭文档
            document.close();
        } catch (Exception e) {
            log.error("convertToPdf-Error:{}",e.getMessage());
        }
        log.info("{}:PDF转换成功",filePath);
    }

    // 将图片添加到 PDF 文档
    private static void addImageToPdf(Document document, String imagePath, float pageWidth, float pageHeight) {
        try {
            // 创建图片对象并设置等比例缩放和水平居中
            Image image = new Image(ImageDataFactory.create(imagePath));
            image.setAutoScale(true);
            image.setHorizontalAlignment(HorizontalAlignment.CENTER);


            // 获取图片的原始尺寸
            float width = image.getImageWidth();
            float height = image.getImageHeight();

            // 计算缩放比例
            float scale = Math.min(pageWidth / width, pageHeight / height);

            // 设置图片的缩放比例
            image.scaleToFit(width * scale, height * scale);

            // 添加图片到 PDF 文档
            document.add(image);

        } catch (Exception e) {
            log.error("addImageToPdf-Error:{}",e.getMessage());
        }
    }
}

三、图片转PDF

3.1 Maven引入依赖

如果下载不成功,去网上搜索下载现有jar包,然后替换版本号

<!--        word转pdf-->
        <dependency>
            <groupId>com.aspose</groupId>
            <artifactId>aspose-words</artifactId>
            <version>15.8.0</version>
        </dependency>

3.2 编写工具类

import com.aspose.words.License;
import lombok.extern.slf4j.Slf4j;


import java.io.*;

@Slf4j
public class WordConvertPdfUtil {
    public static void convertDocxToPdf(String filePath, String pdfPath){
        log.info("{}:进行PDF转换",filePath);
		if (!isWordLicense()) {
			return null;
		}
        try {
            //若存在输出的pdf文件先删除,再创建
            File file = new File(pdfPath);
            if(file.isFile() && file.exists()){
                file.delete();
            }
            com.aspose.words.Document document = new com.aspose.words.Document(filePath);
            document.save(pdfPath);
        } catch (Exception e) {
            log.error("convertDocxToPdf-Error:{}",e.getMessage());
        }
        log.info("{}:PDF转换成功",filePath);
    }
	
	/**
	 * @Description: 验证aspose.word组件是否授权:无授权的文件有水印和试用标记
	 */
	public static boolean isWordLicense() {
		boolean result = false;
		try {
		//导入许可
			String licensexml = "<License>\n" + "<Data>\n" + "<Products>\n"
					+ "<Product>Aspose.Total for Java</Product>\n" + "<Product>Aspose.Words for Java</Product>\n"
					+ "</Products>\n" + "<EditionType>Enterprise</EditionType>\n"
					+ "<SubscriptionExpiry>20991231</SubscriptionExpiry>\n"
					+ "<LicenseExpiry>20991231</LicenseExpiry>\n"
					+ "<SerialNumber>23dcc79f-44ec-4a23-be3a-03c1632404e9</SerialNumber>\n" + "</Data>\n"
					+ "<Signature>\n"
					+ "sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=\n"
					+ "</Signature>\n" + "</License>";
			InputStream inputStream = new ByteArrayInputStream(licensexml.getBytes());
			com.aspose.words.License license = new com.aspose.words.License();
			license.setLicense(inputStream);
			result = true;
		} catch (Exception e) {
			log.error("error:{}",e.getMessage());
		}
		return result;
	}

}

参考资料:https://blog.csdn.net/WayneLee0809/article/details/112788783
https://cloud.tencent.com/developer/article/1639923

posted @ 2024-03-27 10:32  熬夜大能手  阅读(90)  评论(0编辑  收藏  举报