iText 5中PdfGraphics2D类在iText 7中的等效类及迁移方案咨询
迁移iText 2.1.5到iText 7:替代PdfGraphics2D的方案
嘿,我刚好帮团队做过iText 2到7的迁移,碰到过和你一样的问题——找不到对应iText 5里PdfGraphics2D的东西。其实iText7里是有替代方案的,只是位置和用法有点调整,结合你的场景(PDF由其他库生成,仅用iText渲染图形),给你梳理下具体步骤:
1. 先搞定依赖
iText7把AWT相关的功能拆分到了单独的模块里,所以你需要额外引入itext7-awt依赖(以Maven为例):
<dependency> <groupId>com.itextpdf</groupId> <artifactId>itext7-core</artifactId> <version>7.2.5</version> <!-- 建议用最新稳定版 --> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext7-awt</artifactId> <version>7.2.5</version> </dependency>
2. 核心代码示例:在现有PDF上绘制图形
你的场景是PDF由其他库生成,所以第一步是用iText7加载这个现有文档,然后获取目标页面的画布,再创建PdfGraphics2D对象来绘制:
import com.itextpdf.awt.PdfGraphics2D; import com.itextpdf.kernel.geom.Rectangle; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfPage; import com.itextpdf.kernel.pdf.PdfReader; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.kernel.pdf.canvas.PdfCanvas; import java.awt.Color; import java.awt.Graphics2D; public class GraphicsMigrationDemo { public static void main(String[] args) throws Exception { // 1. 读取现有PDF,准备写入修改后的文档 PdfReader reader = new PdfReader("your-existing-document.pdf"); PdfWriter writer = new PdfWriter("modified-document-with-graphics.pdf"); PdfDocument pdfDoc = new PdfDocument(reader, writer); // 2. 获取要绘制图形的页面(iText7页面索引从1开始) PdfPage targetPage = pdfDoc.getPage(1); PdfCanvas canvas = new PdfCanvas(targetPage); // 3. 创建PdfGraphics2D对象,绑定画布和页面尺寸 Rectangle pageSize = targetPage.getPageSize(); Graphics2D g2d = new PdfGraphics2D(canvas, pageSize.getWidth(), pageSize.getHeight()); // 🔔 可选:调整坐标系统(iText默认原点在左下角,AWT默认在左上角) // 如果你的原有代码习惯AWT坐标,加上这两行翻转坐标系 g2d.translate(0, pageSize.getHeight()); g2d.scale(1, -1); // 4. 用标准Graphics2D API绘制图形(和你原来的代码逻辑一致) g2d.setColor(Color.BLUE); g2d.fillRect(100, 100, 300, 200); g2d.setColor(Color.WHITE); g2d.drawString("Rendered with iText 7 PdfGraphics2D", 120, 200); // 5. 释放资源,完成修改 g2d.dispose(); pdfDoc.close(); reader.close(); writer.close(); } }
3. 关键注意事项
- 包名变化:iText5的
com.itextpdf.text.pdf.PdfGraphics2D在iText7里移到了com.itextpdf.awt.PdfGraphics2D,这也是很多人找不到它的原因,别忘了引入itext7-awt模块。 - 坐标系统差异:iText的PDF坐标原点在左下角,而AWT的Graphics2D默认在左上角,如果你原有代码依赖AWT的坐标逻辑,一定要加上坐标翻转的代码,避免图形位置错乱。
- 逐步验证:如果你的原有代码有大量复杂的图形渲染逻辑(比如自定义字体、复杂变换),建议先做小范围的POC验证,因为iText7的
PdfGraphics2D在一些细节上和旧版本有差异,比如字体处理的方式。
内容的提问来源于stack exchange,提问作者Baiju Varugese




