【XEasyPDF】pdfbox替换itext,简易demo

因工作上需要决定将itext替换为pdfbox组件,所以在百度后选择使用XEasyPDF重写之前生成pdf的代码。
简易demo如下,希望可以帮助更多人。

public class test {

    // 根据自身情况选择对应保存路径
    private static final String OUTPUT_PATH = "C:\\Users\\xxx\\Desktop\\x-easypdf.pdf";

    private static final String FONT_BOLD = "/font/SimSunBold.ttf";
    private static final String FONT = "/font/Songti.ttf";

   
    public static void createPDF() throws IOException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        // 创建文档
        XEasyPdfDocument document = XEasyPdfHandler.Document.build();
        // 创建页面
        XEasyPdfPage page = XEasyPdfHandler.Page.build();
        // 创建页面插入图片
        XEasyPdfImage image = XEasyPdfHandler.Image.build(new File(MotionBenefitServiceImpl.class.getResource("/img/xxx.png").getFile()));
        image.setMarginLeft(30).setMarginTop(20).setHeight(22).setWidth(90);
        XEasyPdfHeader header = XEasyPdfHandler.Header.build(image);
        header.addComponent(image);
        // pdf内容
        String titleStr = "xxxxxxxxxxxxxxxxxx";
      
        // 创建文本组件
        XEasyPdfText text = XEasyPdfHandler.Text.build(titleStr).setHorizontalStyle(XEasyPdfPositionStyle.CENTER).setFontSize(14).setMarginTop(40).setMarginBottom(10).setFontPath(FONT_BOLD).setNewLine(true);
        XEasyPdfText text4 = XEasyPdfHandler.Text.build(p3Str).setFontSize(12).setMarginLeft(60).setMarginRight(60).setMarginTop(10).setMarginBottom(10).setFontPath(FONT);
        XEasyPdfText text4_1 = XEasyPdfHandler.Text.build(airVO.getPolicyNo()).setFontSize(12).setMarginLeft(5).setMarginRight(50).setMarginTop(10).setMarginBottom(10).setFontPath(FONT_BOLD).enableTextAppend();

       
        XEasyPdfText text19 = XEasyPdfHandler.Text.build("表头1");
        XEasyPdfText text20 = XEasyPdfHandler.Text.build("表头2");
        XEasyPdfText text21 = XEasyPdfHandler.Text.build("表头3");

        // 将组件添加到页面
        XEasyPdfSolidSplitLine solid = XEasyPdfHandler.SplitLine.SolidLine.build();
        solid.setMarginTop(20).setMarginBottom(80).setMarginLeft(60).setMarginRight(60).setDefaultFontStyle(XEasyPdfDefaultFontStyle.BOLD);
        page.addComponent(image);
        //加入实线
        page.addComponent(solid);
        //加入文本组件
        page.addComponent(text).addComponent(text4).addComponent(text4_1);
        //表格
        XEasyPdfTable table = XEasyPdfHandler.Table.build();
        //分母 + 1 为了避免数据条数为基数的情况 分子加一因为有表头多以多一行
        int center = (mcdVOs.size() + 1) / 2 + 1;
        List<XEasyPdfRow> rowList = new ArrayList<>(center) ;
        for(int i = 0; i < center ; i++) {
            MonComDataVO firstGroup = null;
            MonComDataVO secondGroup = null;
            //做数组越界的标识和右列表格数据的下标
            int flag = i + center - 2;
            if (i != 0){
                //左侧表格数据的下标
                firstGroup = mcdVOs.get(i - 1);
                if (flag < 0 ||flag > mcdVOs.size() - 1){
                    //基数数据右侧表格为空 放行 对象给空 保证pdf可以展示表格
                }else{
                    secondGroup = mcdVOs.get(flag);
                }
            }
            //创建行
            XEasyPdfRow row = XEasyPdfHandler.Table.Row.build();
            List<XEasyPdfCell> cellList = new ArrayList<>(center);
            //固定7列
            for (int j = 0; j  < 7 ; j++) {
                //创建列
                XEasyPdfCell cell = XEasyPdfHandler.Table.Row.Cell.build(80, 20);
                if (i == 0){
                    //第一行设置表头 默认标题
                    if (j == 0 || j == 4) {
                        cell.addContent(text19);
                    } else if (j == 1 || j == 5) {
                        cell.addContent(text20);
                    } else if (j == 2 || j == 6) {
                        cell.addContent(text21);
                    } else if (j == 3){
                        cell.setHeight(20 * center).setWidth(50).addContent(null);
                    }
                }else {
                    //加入数据 分为左右两列 012 左列 、456右列
                    if (j == 0) {
                        cell.addContent(
                                XEasyPdfHandler.Text.build(firstGroup.getStandardMonth())
                        );
                    } else if (j == 1) {
                        cell.addContent(
                                XEasyPdfHandler.Text.build(firstGroup.getStandardDays())
                        );
                    } else if (j == 2) {
                        cell.addContent(
                                XEasyPdfHandler.Text.build(firstGroup.isStandardFlag() ? "是" : "否")
                        );
                    } else if (j == 3){
                        cell.addContent(
                                XEasyPdfHandler.Text.build("")
                        );
                    }else if (j == 4){
                        //避免基数情况出现异常 增加越界判断
                        if (flag < 0 ||flag >mcdVOs.size()-1){
                            cell.addContent(
                                    XEasyPdfHandler.Text.build("")
                            );
                        }else{
                            cell.addContent(
                                    XEasyPdfHandler.Text.build(secondGroup.getStandardMonth())
                            );
                        }

                    }else if (j == 5){
                        if (flag < 0 ||flag >mcdVOs.size()-1){
                            cell.addContent(
                                    XEasyPdfHandler.Text.build("")
                            );
                        }else{
                            cell.addContent(
                                    XEasyPdfHandler.Text.build(secondGroup.getStandardDays())
                            );
                        }
                    }else if (j == 6){
                        if (flag < 0 ||flag >mcdVOs.size()-1){
                            cell.addContent(
                                    XEasyPdfHandler.Text.build("")
                            );
                        }else{
                            cell.addContent(
                                    XEasyPdfHandler.Text.build(secondGroup.isStandardFlag() ? "是" : "否")
                            );
                        }
                    }
                }
                //第三列合并 除第一行都需要加此属性
                if (j == 3) {
                    cell.setWidth(35);
                    if (i != 0) {
                        cell.enableVerticalMerge();
                    }
                }else if(j == 1 || j == 5){
                    cell.setWidth(60);
                }
                //给每个表格加居中样式
                cell.setFontSize(12).setVerticalStyle(XEasyPdfPositionStyle.CENTER).setHorizontalStyle(XEasyPdfPositionStyle.CENTER);
                cellList.add(cell);
            }
            if (i == 0){
                //表格第一行表头加粗
                row.addCell(cellList).setHeight(20).setFontPath(FONT_BOLD);
            }else{
                row.addCell(cellList).setHeight(20).setFontPath(FONT);
            }
            rowList.add(row);
        }

        table.addRow(rowList);
        table.setMarginLeft(60).setBorderColor(Color.BLACK);

        page.addComponent(table);
        page.addComponent(text18);
        // 将页面添加到文档
        document.addPage(page);
        // 保存文档并关闭
        document.save(OUTPUT_PATH).close();
//        ByteArrayOutputStream bos = new ByteArrayOutputStream();
//        document.save(bos);
//        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
    }

}

大致效果图
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
x-easypdf基于pdfbox构建而来,极大降低使用门槛,以组件化的形式进行pdf的构建。简单易用,仅需一行代码,便可完成pdf的操作。 x-easypdf特性: 1、轻量级 仅添加pdfbox相关依赖,无其他任何依赖 2、简单易用 仅需一行代码,便可完成pdf的操作 3、自动换行分页 文本超出单行显示时,即可自动换行;内容超出单页显示时,即可自动分页 4、模板填充 提供内置方法,可轻松实现模板填充 5、组件化 页面所有内容均采用组件化形式进行构建,使用不同的组件组合方式,即可构造出理想的文档 6、扩展灵活 只需实现系统提供的接口,即可完成自定义的组件扩展 x-easypdf软件架构: 1、document(文档):PDF文档 2、page(页面):若干个页面组成PDF文档 3、watermark(水印):每个页面可设置页面级别的独立水印,也可设置文档级别的全局水印,优先级为:页面级别>文档级别 4、header(页眉):每个页面可设置页面级别的独立页眉,也可设置文档级别的全局页眉,优先级为:页面级别>文档级别 5、footer(页脚):每个页面可设置页面级别的独立页脚,也可设置文档级别的全局页脚,优先级为:页面级别>文档级别 6、component(组件):核心,每个页面由若干个组件构成 text(文本组件):已提供,文本写入组件 line(线条组件):已提供,线条写入组件 image(图片组件):已提供,图片写入组件 table(表格组件):已提供,表格写入组件,cell(单元格)->row(行)->table(表格) rect(方形组件):已提供,方形写入组件 后续将添加更多其他方便实用的组件。。。 x-easypdf安装教程: mvn clean install   x-easypdf 更新日志: v2.2.0 新特性: 1、新增文档改变页面尺寸方法 2、新增文档提取器简单表格的文本内容提取(单行单列) 3、表格组件功能增强,已支持添加图片与文本,更灵活的表格定义 原有变更: 1、移除XEasyPdfUtil工具类 2、文档XEasyPdfDocument#image方法变更为imager,返回值变为XEasyPdfDocumentImager(文档图像器) 3、文档操作完毕,需手动关闭文档(调用close方法关闭) 问题修复: 1、修复字体错误问题(issue#I2BGJ1,issue#I2BGM3)
### 回答1: PDFBoxiText都是用于处理PDF文档的开源Java库,但它们是由不同的组织开发和维护的,并且具有不同的许可证。 PDFBoxiText有不同的版本和版本历史,因此可能存在某些版本之间的兼容性问题。一般来说,如果您要同时使用这两个库,建议使用它们的最新版本,并检查它们之间的兼容性。 在当前(2023年2月)的版本中,PDFBox的最新版本为2.0.25,而iText的最新版本为7.2.2。这两个库的最新版本之间可能存在一些差异,因此在使用它们时,您需要仔细阅读它们的文档以了解它们的功能和限制,并进行必要的测试和调试。 ### 回答2: PDFBoxiText都是用于处理PDF文件的开源库。 首先,PDFBox是一个由Apache软件基金会维护的开源Java库。它提供了创建、修改和提取PDF文档的功能。PDFBox根据Apache许可证分发,可以免费使用和修改。它支持几乎所有的PDF特性,并且可以处理复杂的操作,如创建表单、添加文本、图像和链接。 相比之下,iText也是一个用于处理PDF文件的开源库,但由于它是根据GNU Affero General Public License(AGPL)许可证分发,可能需要满足一些额外的条款。iText同样提供了创建、修改和提取PDF文档的功能,并支持一系列高级特性,如数字签名和加密。 虽然PDFBoxiText都是功能强大的PDF处理库,但它们在一些方面存在一些差异。例如,PDFBox提供了更多的文档操作功能,支持更多的PDF版本,并且具有更好的性能。而iText则在处理特定任务和功能方面更加强大,如数字签名和加密功能。 无论选择哪个库,都需要根据项目的具体需求来决定。如果需要更多的文档操作功能,或者项目使用Apache许可证进行分发,那么可以选择PDFBox。如果需要更多的高级功能,并且能够满足AGPL许可证的要求,那么可以选择iText。 总的来说,PDFBoxiText都是业界广泛使用的PDF处理库,它们都有自己的优势和适用场景。在选择时,可以根据项目需求和许可证要求来做出决策。 ### 回答3: PDFBoxiText都是流行的用于处理PDF文档的Java库。 首先,PDFbox是一个开源的Java库,用于创建、编辑和提取PDF文档的内容。它提供了许多功能,如创建新的PDF文档、添加文本、图片和图形、合并和拆分现有的PDF文档,以及提取文本和图像等。PDFbox支持PDF的所有主要版本,并具有处理大型文档的能力。 相比之下,iText也是一个功能强大的PDF库,可以用于创建和处理PDF文档。类似于PDFboxiText也支持多种PDF版本,并提供了丰富的功能,如添加文本、图片、图表和表单元素、设置文档样式和布局等。iText还提供了对数字签名和加密的支持,使得文档的安全性更高。此外,iText还可以将HTML和XML转换为PDF格式。 虽然两者都可以处理PDF文档,但它们之间也有一些区别。PDFbox更加注重底层的操作和灵活性,允许用户直接访问PDF文档的对象和属性。而iText则更注重于简化PDF文档的创建和编辑过程,提供了更高级的API和更方便的操作方法。 总的来说,PDFboxiText都是很好的Java库,可以满足不同需求的PDF处理任务。选择哪个库取决于具体的需求和个人喜好。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值