java实现富文本导出到PDF实现笔记

1、需求背景:

项目里导出会议记录时有一个富文本框内容也需要导出到PDF文件中,但是自己之前没有实现过这类功能,而且我们项目里面内网开发,也不能随便百度,找maven依赖也很麻烦
 

2、实现技术:

 <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext7-core</artifactId>
            <version>8.0.4</version>
            <type>pom</type>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.itextpdf/html2pdf -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>html2pdf</artifactId>
            <version>5.0.4</version>
            <exclusions>
                <exclusion>
                    <groupId>com.itextpdf</groupId>
                    <artifactId>layout</artifactId>
                </exclusion>
            </exclusions>
 </dependency>

3、代码解析:

实际上导出PDF的代码前人已经帮我们弄好了,我们找到对应版本的依赖引入直接用即可,不过用法有很多种,有导出本地文件的,导出流文件的等等;这里以导出到document对象为例,

难点1:

要求itext7-core依赖版本要html2pdf的依赖版本相一致

难点2:

代码是实现上要灵活运用,富文本转换的方法有很多,用自己需要的即可,不然可能会导致后续内容无法导出到PDF中,我就碰到了这个问题,中间弄了好久

4、代码实现

这里由于隐私问题直接去部分实现代码

 // HtmlToPdfManualParsing.handleHtmlContent(document, meetingAttendanceRecord,fileUrl);
        String richText = addPrefixToImageSrc(meetingAttendanceRecord, fileUrl);

        ConverterProperties converterProperties = new ConverterProperties();
        FontProvider fontProvider = new FontProvider();

        // 将字体添加到字体提供器中,"SimSun" 是字体名称,在HTML中可通过这个名称来引用该字体
        fontProvider.addFont(filePath);

        // 设置转换器属性的字体提供器
        converterProperties.setFontProvider(fontProvider);

        // Document convertToDocument = HtmlConverter.convertToDocument(richText, pdf, converterProperties);

        List<IElement> iElementList = HtmlConverter.convertToElements(richText, converterProperties);

        // 遍历元素列表,根据元素类型添加到Document中
        for (IElement element : iElementList) {
            if (element instanceof Paragraph) {
                Paragraph paragraph = (Paragraph) element;

                List<IElement> children = paragraph.getChildren();

                for (IElement iElement : children) {
                    if (iElement instanceof Image) {
                        Image image = (Image) iElement;

                        image.setWidth(260).setHeight(130).setTextAlignment(com.itextpdf.layout.properties.TextAlignment.CENTER);

                        document.add(image);
                    } else {
                        document.add(new Paragraph(((Text) iElement).getText()));
                    }
                }
                // document.add(paragraph);
            } else if (element instanceof Image) {
                Image image = (Image) element;

                image.setWidth(260).setHeight(130).setTextAlignment(com.itextpdf.layout.properties.TextAlignment.CENTER);

                document.add(image);
            } else if (element instanceof Table) {
                document.add((Table) element);
            } else if (element instanceof Text) {
                document.add(new Paragraph((Text) element));
            } else if (element instanceof com.itextpdf.layout.element.List) {
                // 如果是列表元素,直接添加到Document中
                document.add((com.itextpdf.layout.element.List) element);
            }else {
                // 对于其他未知类型元素,添加到默认Paragraph中(可根据实际完善处理)
                Paragraph defaultParagraph = new Paragraph();
                defaultParagraph.add((Text) element);
            }
        }

5、最后效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值