java html转pdf文档并且设置文档的边距

阿尔法哲 一定要看到最后 ory
引用了https://www.cnblogs.com/aerfazhe/p/16170095.html
在这里插入图片描述
其他两个可自行研究哈

1、基于IText(推荐)
iText 是业界使用最为广泛的创建 PDF 的框架,从 iText 5 升级到 iText 7 后,功能模块的划分更加清晰,两者在使用上,有较为明显的区别。

此处就不进行区别的赘述了,直接上代码,本次使用的是iText7

1.1、引入依赖
注意两个依赖的版本对应,进入html2pdf的pom文件就能看到itext的版本,font-asian的版本最低也要是html2pdf中itext7的版本。

<!-- itext7html转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.13</version>
</dependency>

1.2、水印和页码
导出pdf一般是需要水印和页码的,我们只要实现com.itextpdf.kernel.events.IEventHandler接口就可以了

水印

水印代码
/**
 * 水印
 */
public class WaterMarkEventHandler implements IEventHandler {

    /**
     * 水印内容
     */
    private String waterMarkContent;

    /**
     * 一页中有几列水印
     */
    private int waterMarkX;

    /**
     * 一页中每列有多少水印
     */
    private int waterMarkY;

    public WaterMarkEventHandler(String waterMarkContent) {
        this(waterMarkContent, 5, 5);
    }

    public WaterMarkEventHandler(String waterMarkContent, int waterMarkX, int waterMarkY) {
        this.waterMarkContent = waterMarkContent;
        this.waterMarkX = waterMarkX;
        this.waterMarkY = waterMarkY;
    }

    @Override
    public void handleEvent(Event event) {

        PdfDocumentEvent documentEvent = (PdfDocumentEvent) event;
        PdfDocument document = documentEvent.getDocument();
        PdfPage page = documentEvent.getPage();
        Rectangle pageSize = page.getPageSize();

        PdfFont pdfFont = null;
        try {
            pdfFont = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H", false);
        } catch (IOException e) {
            e.printStackTrace();
        }

        PdfCanvas pdfCanvas = new PdfCanvas(page.newContentStreamAfter(), page.getResources(), document);

        Paragraph waterMark = new Paragraph(waterMarkContent).setOpacity(0.5f);
        Canvas canvas = new Canvas(pdfCanvas, pageSize)
            .setFontColor(WebColors.getRGBColor("lightgray"))
            .setFontSize(16)
            .setFont(pdfFont);

        for (int i = 0; i < waterMarkX; i++) {
            for (int j = 0; j < waterMarkY; j++) {
                canvas.showTextAligned(waterMark, (150 + i * 300), (160 + j * 150), document.getNumberOfPages(), TextAlignment.CENTER, VerticalAlignment.BOTTOM, 120);
            }
        }
        canvas.close();
    }
}
 页码

页码代码
/**

  • 页码
    */
public class PageEventHandler implements IEventHandler {
    @Override
    public void handleEvent(Event event) {
        PdfDocumentEvent documentEvent = (PdfDocumentEvent) event;
        PdfDocument document = documentEvent.getDocument();
        PdfPage page = documentEvent.getPage();
        Rectangle pageSize = page.getPageSize();
        PdfFont pdfFont = null;
        try {
            pdfFont = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H", false);
        } catch (IOException e) {
            e.printStackTrace();
        }
        PdfCanvas pdfCanvas = new PdfCanvas(page.getLastContentStream(), page.getResources(), document);
        Canvas canvas = new Canvas(pdfCanvas, pageSize);
        float  x = (pageSize.getLeft() + pageSize.getRight()) / 2;
        float  y = pageSize.getBottom() + 15;
        Paragraph paragraph = new Paragraph("第" + document.getPageNumber(page) + "页/共" + document.getNumberOfPages() + "页")
            .setFontSize(10)
            .setFont(pdfFont);
        canvas.showTextAligned(paragraph, x, y, TextAlignment.CENTER);
        canvas.close();
    }
}

1.3、转换工具类
转换工具类

/**
 * Itext7转换工具类
 */
@Slf4j
public class HtmlToPdfUtils {

    /**
     * html转pdf
     *
     * @param inputStream  输入流
     * @param waterMark    水印
     * @param fontPath     字体路径,ttc后缀的字体需要添加<b>,0<b/>
     * @param outputStream 输出流
     * @date : 2021/1/15 14:07
     */
    public static void convertToPdf(InputStream inputStream, String waterMark, String fontPath, OutputStream outputStream) throws IOException {

        PdfWriter pdfWriter = new PdfWriter(outputStream);
        PdfDocument pdfDocument = new PdfDocument(pdfWriter);
        //设置为A4大小
        pdfDocument.setDefaultPageSize(PageSize.A4);
        //添加水印
        pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE, new WaterMarkEventHandler(waterMark));

        //添加中文字体支持
        ConverterProperties properties = new ConverterProperties();
        FontProvider fontProvider = new FontProvider();

        //        设置字体
        /*PdfFont sysFont = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H", false);
        fontProvider.addFont(sysFont.getFontProgram(), "UniGB-UCS2-H");*/

        //添加自定义字体,例如微软雅黑
        if (StringUtils.isNotBlank(fontPath)) {
            PdfFont microsoft = PdfFontFactory.createFont(fontPath, PdfEncodings.IDENTITY_H, false);
            fontProvider.addFont(microsoft.getFontProgram(), PdfEncodings.IDENTITY_H);
        }

        properties.setFontProvider(fontProvider);
        //        读取Html文件流,查找出当中的&nbsp;或出现类似的符号空格字符
        inputStream = readInputStrem(inputStream);
        if (inputStream != null) {
            //        生成pdf文档
            HtmlConverter.convertToPdf(inputStream, pdfDocument, properties);
            pdfWriter.close();
            pdfDocument.close();
            return;
        } else {
            log.error("转换失败!");
        }
    }
 /**
     * 读取HTML 流文件,并查询当中的&nbsp;或类似符号直接替换为空格
     *
     * @param inputStream
     * @return
     */
    private static InputStream readInputStrem(InputStream inputStream) {
        // 定义一些特殊字符的正则表达式 如:
        String regEx_special = "\\&[a-zA-Z]{1,10};";
        try {
            //<1>创建字节数组输出流,用来输出读取到的内容
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            //<2>创建缓存大小
            byte[] buffer = new byte[1024]; // 1KB
            //每次读取到内容的长度
            int len = -1;
            //<3>开始读取输入流中的内容
            while ((len = inputStream.read(buffer)) != -1) { //当等于-1说明没有数据可以读取了
                baos.write(buffer, 0, len);   //把读取到的内容写到输出流中
            }
            //<4> 把字节数组转换为字符串
            String content = baos.toString();
            //<5>关闭输入流和输出流
            //            inputStream.close();
            baos.close();
            //            log.info("读取的内容:{}", content);
            //            判断HTML内容是否具有HTML的特殊字符标记
            Pattern compile = Pattern.compile(regEx_special, Pattern.CASE_INSENSITIVE);
            Matcher matcher = compile.matcher(content);
            String replaceAll = matcher.replaceAll("");
            //            log.info("替换后的内容:{}", replaceAll);
            //            将字符串转化为输入流返回
            InputStream stringStream = getStringStream(replaceAll);
            //<6>返回结果
            return stringStream;
        } catch (Exception e) {
            e.printStackTrace();
            log.error("错误信息:{}", e.getMessage());
            return null;
        }
    }

    /**
     * 将一个字符串转化为输入流
     * @param sInputString 字符串
     * @return
     */
    public static InputStream getStringStream(String sInputString) {
        if (sInputString != null && !sInputString.trim().equals("")) {
            try {
                ByteArrayInputStream tInputStringStream = new ByteArrayInputStream(sInputString.getBytes());
                return tInputStringStream;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }

}

1.4、测试类
测试代码

@Slf4j
public class Test {

    public static void main(String[] args) throws IOException {
        long startTime = System.currentTimeMillis();
        //       html文件所在相对路径
        String htmlFile = "src/main/resources/html/index2.html";
        //       pdf文件存储相对路径
        String pdfFile = "src/main/resources/x6.pdf";
        //        自定义水印
        String waterMarkText =  "";
        InputStream inputStream = new FileInputStream(htmlFile);
        OutputStream outputStream = new FileOutputStream(pdfFile);
        //微软雅黑在windows系统里的位置如下,linux系统直接拷贝该文件放在linux目录下即可
        //        String fontPath = "src/main/resources/font/STHeiti Light.ttc,0";
        String fontPath = "src/main/resources/font/simsun.ttc,0";
        HtmlToPdfUtils.convertToPdf(inputStream, waterMarkText, fontPath, outputStream);
        log.info("转换结束,耗时:{}ms",System.currentTimeMillis()-startTime);
    }
}

1.5、注意事项
页面中不能出现html的特殊字符标记,如 等(代码中已经处理,所有都替换为空)可忽略
页面中的图片路径,必须是在项目根路径后面的所有地址(相对路径)例如:
页面中的标签要符合规范,必须都具有结束标签等
以下是边距设置

public static void main(String[] args) throws Exception {
    long startTime = System.currentTimeMillis();
    //       html文件所在相对路径
    String htmlFile = "D:/aaa/a.html";
    //       pdf文件存储相对路径
    String pdfFile = "D:/aaa/ax6.pdf";
    //        自定义水印
    String waterMarkText =  "";
    InputStream inputStream = new FileInputStream(htmlFile);
    OutputStream outputStream = new FileOutputStream(pdfFile);
    String fontPath = "C:/Windows/Fonts/simsun.ttc,0";
    convertToPdfo(inputStream, waterMarkText, fontPath, outputStream);
    System.out.println("转换结束,耗时:{}ms"+(System.currentTimeMillis()-startTime));
}
/**
 * html转pdf
 *
 * @param inputStream  输入流
 * @param waterMark    水印
 * @param fontPath     字体路径,ttc后缀的字体需要添加<b>,0<b/>
 * @param outputStream 输出流
 * @date : 2021/1/15 14:07
 */
public static void convertToPdfo(InputStream inputStream, String waterMark, String fontPath, OutputStream outputStream) throws Exception {
    PdfWriter pdfWriter = new PdfWriter(outputStream);
    PdfDocument pdfDocument = new PdfDocument(pdfWriter);
    //添加中文字体支持
    ConverterProperties properties = new ConverterProperties();
    FontProvider fontProvider = new FontProvider();
    //添加自定义字体,例如微软雅黑
    if (StringUtils.isNotBlank(fontPath)) {
        PdfFont microsoft = PdfFontFactory.createFont(fontPath, PdfEncodings.IDENTITY_H);
        fontProvider.addFont(microsoft.getFontProgram(), PdfEncodings.IDENTITY_H);
    }

    properties.setFontProvider(fontProvider);
    //        读取Html文件流,查找出当中的&nbsp;或出现类似的符号空格字符
    inputStream = readInputStrem(inputStream);
    List<IElement> elements = HtmlConverter.convertToElements(inputStream, properties);
    // 1-创建文本对象 Document
    Document document = new Document(pdfDocument);
    document.setMargins(0l,0l,0l,0l);
    // 4-往 Document 添加内容
    for(IElement e:elements){
        document.add((IBlockElement)e);
    }
    // 5-关闭 Document
    document.close();
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用JavaiText库将PDF换为HTML时,可以通过以下步骤保留样式: 1. 导入iText库:首先,确保您已正确导入iText库到Java项目中。您可以从iText的官方网站下载并在项目构建路径中添加。 2. 创建PDF文档对象:使用iText库打开PDF文档,并创建一个文档对象以处理PDF内容。 3. 创建HTML输出器:使用iTextHTML输出器类创建一个HTML文件,以便换后的文本可以写入其中。 4. 设置文档样式:设置HTML输出器的样式设置,以确保换后的HTML保留原始PDF的样式。这包括字体、颜色、边距等设置。 5. 提取PDF内容:使用iText库提取PDF文档的内容。您可以使用iText的文本提取工具,将文本块(段落、标题等)逐步提取到变量中。 6. 写入HTML:将提取的文本内容逐个写入HTML输出器中,这将在HTML文件中保留样式。您可以使用HTML输出器的方法设置所需的标记(段落、标题、列表等)。 7. 保存HTML文件:保存并关闭HTML文件,以便您可以在需要的地方使用。 8. 完成:换完成后,您将获得一个HTML文件,其中保留了PDF的样式设置。可以加载此HTML文件以查看结果。 需要注意的是,换后的HTML可能不会完全保留PDF的样式,这可能取决于PDF的复杂性、字体可用性等因素。因此,在将PDF换为HTML时,可能需要针对具体的PDF进行一些自定义设置和调整,以确保样式尽可能保持一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值