当前位置:网站首页 > Java教程 > 正文

java itext 教程



最近有个需求需要我用Java手动写一份PDF报告,经过考察几种pdf开源代码,最终选取了itext7,此版本为,由于发现网上关于该工具的博文比较少,特别是实战博文几乎没有,在我踩完各种坑,最终把PDF成型后,打算把经验分享出来,本文通过摘录解释来说明,内容来自本人GitHub itext-pdf

项目采用了所以配置在git上,仅仅研究itext7不需要用到数据库等功能,请直接运行类的方法,即可生成模拟的PDF报告

itext7相关pom

 

itext7语义本身和前端css很像,所以有点前端基础还是比较容易掌握的

  1. 读取项目中图片文件
  2. 设置边距
  3. 设置宽高扩大缩小
 
  1. 添加第2页为空白页,立即刷新后再继续添加
 
 
  1. 整块的内容用Div包裹,这里整块包裹的好处是什么?一方面排版分明成体系,另一方面若需求是整块的内容必须在同一个版面,你可以对Div设置,尽量保证若整块的内容超出了一页,那这块内容会自动整块出现在下一页,上一页剩下的就留白了
  2. 可以看到,可以设置很多属性,实际上我们常用的组件除了这两种,还有,,,他们大部分的属性都是一样的,只是部分属性只在部分组件起效果,所以当你设置某个属性没起效果也不用奇怪
  3. 需要特别注意的一点,想要段落文字居中,不要用这是组件的居中对段落无效,甚至对段落里你放也无效,需要改用
  4. 段落的行距也是个高频问题,这里给出官方我看到的解释,参考,搜关键字,我的理解该方法设值行高绝对值,官方解释是两行文字中间基线之间的距离
  5. 如果想了解详细的什么属性哪里能起作用哪里不行,请访问该地址

UTOOLS1590980957507.png

  1. 表示页面有多宽,我就有多宽
  2. 表示新起一行,table每画一行都要新起一行
  3. 同样table内容需要居中,和段落一样,请设置
  4. 每个table中cell都有默认高度,会比实际输入字体高些,此时设置,若更大没有问题,若高度小于或接近字体大小文字可能就消失了,若想让Cell高度更接近文字高度,请设置的,即,设置负值即可
  1. itext7中如果要表示段落前的空格,不能使用,但换行可以使用
  2. 若要实现效果可以有多个方法
    1. 符号,大概7、8个该符号可表示tab,可能不是很准确
     
      
    1. ,表示段落前留多少空,需要知道一个字多大,设置成两倍就行
    2. 也是集成的组件,通过以下方式也可实现相同的效果
     

我常用的换页方法为如下,该方法可保证立即换页

 

当然有其实也可以用,但有时候你没把握好刷新时间可能导致某些混乱

能画出多么复杂的图形看是谁画了,在我的PDF中,我画的最复杂的图形如下

UTOOLS1590982696170.png

该图形由多个弧形区域加线段加文字组成,包括数字上的小箭头也是画出来的,画这个的代码过多,想要了解详细的可以自行下载研究,这里介绍API功能

  1. 画线段
  2. 可用来画角是弧形的方形,也可以用来画圆
  3. 用来画文字

以上几种结合填充即可把三角形,多边形画出来了

 

我们可能遇到把一段Html文本转换成itext7的段落放进来,此时需要用到它的htmlToPdf模块,该模块对应

 

至于使用,设置好配置属性,使用也很简单,通常我们需要支持中文,所有配置如下,字体可以自己换

 

转换的内容是集合,而是什么呢?给张图就了解了

UTOOLS1590990939918.png

也就是说只要你的html内容是包裹的,你直接把元素转成itext7的然后到就可以实现html内容的添加了,当然你也可以用判断不同内容不同处理

如下是我的处理例子供参考,我把输入html内容样式进行了一定修改后转成itext7组件,这里特别提心,html转过来的itext7组件可能会不支持部分样式的修改,所以需要在html中进行css样式的添加,这里我就把字体和高度统一用css设值了

 
  • getFixContent
 
  • addParagraphStyleCircle
 

在编写pdf的时候,比如一篇整体的文章,我们需要在页眉位置添加关于这篇文章的固定文本或者图形,类似于打个标签,表示你翻了这么多页一直在看这篇文章,当第二篇文章的时候就换一个,举个例子

  • 第一页

UTOOLS1590992499119.png

  • 第二页

UTOOLS1590992555997.png

这种需求我们如何实现呢?思路分析发现,我们需要知道什么时候文章内容一页写不起了,换了一页的时候我们需要添加一个同样的页眉。这样我们就需要知道页是何时添加的,监听事件就是处理这种问题的

  • pdf是,可添加的事件有,,,共四个,如上需求我们需要监听事件,在事件处理中做相应的处理,我在事件中使用画了头部内容
 
  • HeaderTextEvent类,仅仅是封装了
 

在添加内容前添加相应事件,同时需要记得在不需要的时候移除

 

我没有找到itext7原生是否有目录添加,根据我自己的需求,我用组件来实现了自定义目录,由于我的PDF是用来打印的,所以我并没有给目录添加,也就是页面跳转,不过当你彻底理解了我的项目,我想这个需求实现也不难

  • 实现效果如下,随着内容的增长,目录自动增长

UTOOLS1590993651033.png

先说下遇到的困难,目录顾明思意,必须要有内容才会有目录,所以实际上目录是最后添加的,但如果我们添加内容到最后再跳转到前面的页面来添加目录,有三个问题:

  1. 目录有几页如何知道?
  2. 目录有几页不知道,如何知道内容在第几页?
  3. 由于目录不确定,所以后续内容的页码其实也是不确定的,也就是说页码也不是一页页可以添加过去的

而经过实践你会发现,我们不能够回到前几页去修改已存在的页面,因为会提示你已经flush了,不能修改。

这时我看到了movePage这个方法,也就是可以通过移动页面,把目录在内容之后生成,后再移动到前几页,但是页码还是不能修改,发现脑袋不够想了只能用上屁股,灵光一闪,不能一遍生成为什么不能二次渲染呢?于是研究读取原pdf在原pdf上修改,二次渲染的时候填上页码及移动页面,主要代码如下,包括了读取中间文件,移动目录,添加每页页码

 

经过上述总结,我基本上把项目中的大多基本点和难点都概括进去了,初次用itext7写PDF的同学基本会遇到的问题基本都在上述这些,不理解的就把项目下下来运行Main方法慢慢调试,理解透我这个项目,还有其它问题那基本只能翻官网了

  • 上一篇: 变量java教程
  • 下一篇: java概念教程
  • 版权声明


    相关文章:

  • 变量java教程2025-01-25 13:18:05
  • java直播技术教程2025-01-25 13:18:05
  • java模拟教程2025-01-25 13:18:05
  • java project教程2025-01-25 13:18:05
  • java applet视频教程2025-01-25 13:18:05
  • java概念教程2025-01-25 13:18:05
  • java好教程2025-01-25 13:18:05
  • java调用ffmpeg 教程2025-01-25 13:18:05
  • java远程跟踪教程2025-01-25 13:18:05
  • java程序设计实用教程第三版课后答案2025-01-25 13:18:05