itext pdf 基本使用实战

itext pdf 基本使用实战随时随地阅读更多技术实战干货 获取项目源码 学习资料 请关注源代码社区公众号 ydmsq666 博主微信 guyun 技术交流群 pdf 作为一种阅读体验性非常好的文件格式 那么在实际项目中也经常会涉及到 PDF 文件的操作 在接下来的系列中 将介绍 pdf 文件操作的一些实战干货 这里我们使用的是开源项目 itextpdf 相信很多人已经使用过 it

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)

itext pdf 基本使用实战

 pdf作为一种阅读体验性非常好的文件格式,那么在实际项目中也经常会涉及到PDF文件的操作,在接下来的系列中,将介绍pdf文件操作的一些实战干货,这里我们使用的是开源项目itextpdf,相信很多人已经使用过,itextpdf对非商业性质的使用是免费的,这是个非常强大的开源库。官方地址:https://itextpdf.com,这里使用的是iText-5.0.6版本。

  在第一篇文章中,先介绍下它的基本使用步骤和常见用法,一般分为5个步骤。

一、需要创建一个Document实例。

一共有三个构造方法

 public Document(); public Document(Rectangle pageSize); public Document(Rectangle pageSize,int marginLeft,int marginRight,int marginTop,int marginBottom);

第一个构造函数以A4页面作为参数调用第二个构造函数,第二个构造函数以每边36磅页边距为参数调用第三个构造函数。

我们可以自定义页面的大小,颜色,比如:

 // 设置大小 Rectangle pageSize = new Rectangle(300, 500); // 设置背景颜色 pageSize.setBackgroundColor(new BaseColor(0xFF, 0xFF, 0xDE)); // 设置边框颜色 pageSize.setBorderColor(new BaseColor(0xFF, 0xFF, 0xDE)); Document document = new Document(pageSize);

但是,通常不需要我们设置,系统有很多尺寸可以选择,在PageSize类下面

itext pdf 基本使用实战

我们最常用的就是A4,无参数构造的时候默认使用的A4尺寸配置,所以很多情况下,我们不需要构造页面的尺寸,大部分情况我们都是使用的纵向页面,如果特殊情况需要使用横向页面,只需要将其翻转就可以了

 Document document = new Document(PageSize.A4.rotate());

另外,如果有指定边距的需求时,我们还可以定义其边距

 Document document = new Document(PageSize.A5, 40, 70, 100, 200);

边距默认以磅为单位,默认边距是36磅,至于和厘米,英寸等其它单位的换算这里就不详细介绍了,注意一点就是,边距是针对整个文件生效的,故慎用,如果没有特别需求,使用默认的就可以了。

那么第一步创建Document实例,基本使用就这样了,接下来进入第二步

二、创建Writer实例

这里介绍的pdf,所以这里就直接使用的DocWriter的实现类PdfWriter,常见用法如下:

 // 创建PdfWriter对象 PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(outPath));

第二个参数可以是任何一种流,这里只是取一种常见的来使用。

我们还可以设置行间距

 // 设置每行的间距 writer.setInitialLeading(30);

三、打开Document

在写入实际内容前,我们通常需要设置文件的一些属性,比如作者、标题、摘要等,下面直接上代码:

 // 作者 document.addAuthor("feng"); // 创建日期 document.addCreationDate(); // 创建关键字 document.addKeywords("测试"); // 创建生产商,自动使用iText document.addProducer(); // 创建程序 document.addCreator("www.ydc51.com"); // 标题 document.addTitle("测试标题"); // 主题 document.addSubject("测试PDF创建的主题");

上面有详细的注释,就不做多的说明了

然后打开文档就一句代码

 // 打开文档 document.open();

四、添加内容

上面做好了充分准备后,下面就添加实际内容了,在添加内容之前,非常有必要了解一下字体,这是内容的基础,为了支持中文我们需要对字体做一些处理,有三种方式支持中文:

1、使用Windows系统字体(TrueType),引用Window系统自带的字体

 // 方式一:使用Windows系统字体(TrueType) BaseFont baseFont = BaseFont.createFont("C:/Windows/Fonts/SIMYOU.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

2、使用自己的资源字体

 // 方式二:使用资源字体(ClassPath) BaseFont baseFont = BaseFont.createFont("/SIMYOU.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

3、使用iTextAsian.jar中的字体

 // 方式三:使用iTextAsian.jar中的字体 BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);

在这个库中有很多字体可以使用,需要注意的是这里有一个坑,在itext5.x版本对font和encoding文件都是从 RESOURCE_PATH = “com/itextpdf/text/pdf/fonts/”加载的,而itextasian1.5.x.jar的包名是com.lowagie.text.pdf.fonts, 包名不一致,导致路径错误

itext pdf 基本使用实战

这里可以将itextasian1.5.x.jar解压,找到里面itextasian1.5.x/com里的lowagie文件,将lowagie该名为:itextpdf

然后重新打包,网上有很多解决办法,这里随便贴一个地址:解决”STSong-Light’ with ‘UniGB-UCS2-H’ is not recognized”问题_sanqima的专栏-CSDN博客_stsong-light-unigb-ucs2-h

好,使用上面其中任意一种作为基本字体就可以解决中文问题,然后我们可以对自己使用的字体进行一些设置颜色,字体大小、类型等等

 Font font = new Font(baseFont); // 设置字体大小 font.setSize(13); // 设置字体颜色 font.setColor(new BaseColor(255, 0, 0)); // 设置类型,为正常 font.setStyle(Font.NORMAL); // 设置类型,加粗 font.setStyle(Font.BOLD); // 设置类型,倾斜 font.setStyle(Font.ITALIC); // 设置类型,下划线 font.setStyle(Font.UNDERLINE); // 设置类型,可组合,倾斜+删除线 font.setStyle(Font.ITALIC | Font.STRIKETHRU);

上面有非常详细的注释,到目前字体设置基本够用了

添加内容

 Paragraph paragraph = new Paragraph(content, font);

Paragraph是段落,段落是一系列块和(或)短句。同短句一样,段落有确定的间距。用户还可以指定缩排;在边和(或)右边保留一定空白,段落可以左对齐、右对齐和居中对齐。添加到文档中的每一个段落将自动另起一行。

上面有提到一种块Chunk,(Chunk)是能被添加到文档的文本的最小单位,块可以用于构建其他基础元素如短句、段落、锚点等,块是一个有确定字体的字符串,要添加块到文档中时,其他所有布局变量均要被定义。使用方法如下:

 // 块 Chunk chunk = new Chunk("语句块"); // 设置字体,字体定宽 chunk.setFont(font); // 设置背景颜色 chunk.setBackground(new BaseColor(0xFF, 0xFF, 0x00)); //使用块来构造段落 Paragraph paragraph = new Paragraph(chunk);

Chunk还有一些常用作用,使用块来换行,设置上标下标

 // 设置上标下标 chunk.setTextRise(6f); // 使用Chunk换行 document.add(Chunk.NEWLINE);

还有一种叫短句Phrase,短句(Phrases)是一系列以特定间距(两行之间的距离)作为参数的块,一个短句有一个主字体,但短句中的一些块具有不同于主字体的字体,你有更多的选择去创建短句,使用方式如下:

 // 短句 Phrase phrase = new Phrase(content); // 设置字体 phrase.setFont(font); // 设置间距 phrase.setLeading(30f); // 使用短句来构造段落 Paragraph paragraph2 = new Paragraph(phrase);

段落还有个设置方法,作用是尽可能将一个段落放在同一页中,该方法并不是始终有效

 // 试图将一个段落放在同一页中,该方法并不是始终有效 paragraph.setKeepTogether(true);

那么,段落的构造就差不多了,然后就是将段落加载到Document中:

 document.add(paragraph);

五、第五步就是关闭文档了,关闭 document 非常重要, 因为它将关闭正在运行的Writer并将内容写入文件,该方法在最后被调用,你应该总是要关闭文档。

 // 关闭文档 document.close();

到目前为止,itextpdf的最基本的使用讲解完了。

下面贴一个完整的简单例子

 public static void createTextPDF(String outPath, String content) { // 创建文件及相关目录 File file = FileUtil.createNewFile(outPath, true); if (!file.exists()) { logger.error("创建文件失败"); return; } Document document = new Document(); try { // 创建PdfWriter对象 PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(outPath)); // 设置每行的间距 writer.setInitialLeading(30); // 设置文档属性 // 作者 document.addAuthor("feng"); // 创建日期 document.addCreationDate(); // 创建关键字 document.addKeywords("测试"); // 创建生产商,自动使用iText document.addProducer(); // 创建程序 document.addCreator("www.ydc51.com"); // 标题 document.addTitle("测试标题"); // 主题 document.addSubject("测试PDF创建的主题"); // 打开文档 document.open(); // 方式三:使用iTextAsian.jar中的字体 BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); Font font = new Font(baseFont); // 设置字体大小 font.setSize(13); // 设置字体颜色 font.setColor(new BaseColor(255, 0, 0)); // 设置类型,加粗 font.setStyle(Font.BOLD); // 设置类型,倾斜 font.setStyle(Font.ITALIC); // 设置类型,下划线 font.setStyle(Font.UNDERLINE); // 设置类型,可组合,倾斜+删除线 font.setStyle(Font.ITALIC | Font.STRIKETHRU); // 设置类型,为正常 font.setStyle(Font.NORMAL); // 块 Chunk chunk = new Chunk("下标"); // 设置字体,字体定宽 chunk.setFont(new Font(baseFont, 4)); // 设置背景颜色 chunk.setBackground(new BaseColor(0xFF, 0xFF, 0x00)); // 设置上表下标 chunk.setTextRise(-3f); Paragraph paragraph = new Paragraph(content, font); // 试图将一个段落放在同一页中,该方法并不是始终有效 paragraph.setKeepTogether(true); paragraph.add(chunk); document.add(paragraph); // low level PdfContentByte cb = writer.getDirectContent(); cb.fill(); cb.sanityCheck(); } catch (Exception e) { logger.error("", e); } finally { // 关闭文档 document.close(); } }

效果图:

itext pdf 基本使用实战

itextpdf还有很多高级功能的使用,后面将会给出,本文也会同步发表在源代码社区公众号上,想随时随地了解更多实战干货,请关注顶部的源代码社区公众号

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/200385.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午10:56
下一篇 2026年3月20日 上午10:56


相关推荐

  • 浅谈CICD持续集成、持续部署的流程

    浅谈CICD持续集成、持续部署的流程Jenkins是一个比较流行的持续集成工具GitLab是存储镜像的镜像仓库由客户端将代码push推送到git仓库,gitlab上配置了一个webHook的东西可以触发Jenkins的构建。进入到Jenkins虚线范围内,它所做的事情非常多,从mvn构建代码,对代码进行静态分析,做单元测试,测试通过之后就可以build镜像,镜像构建成功后就把镜像push推送到Harbor镜像仓库中,镜像push…

    2022年6月11日
    32
  • html怎么隐藏播放器_css遮罩

    html怎么隐藏播放器_css遮罩<!DOCTYPEhtml><htmllang=”en”><head><metacharset=”UTF-8″><metaname=”viewport”content=”width=device-width,initial-scale=1.0″><metahttp-equiv=”X-UA-Compatible”content=”ie=edge”><title>视.

    2025年5月26日
    12
  • run-node.mjs 文件详细解析

    run-node.mjs 文件详细解析

    2026年3月17日
    2
  • vue页面强制刷新缓存不清除_vuex刷新页面数据

    vue页面强制刷新缓存不清除_vuex刷新页面数据mounted(){this.enterPage()},destroyed(){this.leavePage()},methods:{/*打开:load关闭:beforeload+unload刷新:beforeload+unload+load*///离开清除监听leavePage(){window.removeEventListener(‘beforeload’,e=>this.beforeunloadH…

    2022年10月9日
    3
  • 设备树 dtb结构

    设备树 dtb结构dtb 结构由一个小的报头和三个大小可变的部分组成 内存预留块 结构块和字符串块 这些应该按这个顺序出现在扁平的设备树中 因此 设备树结构作为一个整体 当以地址载入内存时 将类似于下图的图 较低的地址位于图的顶部 注 内存预留块可能不存在 尽管在某些情况下可能需要它们来满足单个块的对齐约束 自格式的原始定义以来 已经定义了几种扁平设备树结构的版本 报头中的字段给出了版本 以便客户端程序可以确定设备树是否以兼容的格式编码 本文档仅描述 17 版的格式 兼容 DTSpec 的引导程

    2025年6月22日
    4
  • 究竟什么是Java虚拟机(JVM)?

    究竟什么是Java虚拟机(JVM)?我们都知道,在Windows上,软件包后缀有exe,而苹果的MacOSX系统上没有安装exe。类似地,MacOSX系统上的软件安装包是dmg后缀,不能安装在Windows系统上。为什么不能安装不同系统上的软件,因为操作系统的底层实现是不同的。对于Windows系统,exe后缀的软件代码被编译成能被Windows系统识别的机器代码。对于MacOSX系统,最后将DMG后缀的软件代码编译为M…

    2022年7月8日
    20

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号