iText 7替换PrintDocument实现指定位置矩形/图像内填文本导出PDF
iText 7 坐标系兼容及指定区域文本填充实现方案
核心解决思路
iText 默认Y轴从页面底部向上计算,你不需要修改原有测量的偏移值,只需要加一层坐标转换逻辑,即可直接复用PrintDocument时期的所有坐标参数,同时支持以任意矩形/图像的左上角为坐标基准。
步骤1:封装坐标系转换工具(VB代码示例)
你可以直接复用这个通用转换方法,自动把顶部为基准的Y坐标转换成iText兼容的格式:
' 页面级Y坐标转换:将基于页面左上角的Y值转为iText兼容的基于左下角的Y值 ' 参数:pageHeight 为当前页面的总高度,originalTopY 为你原来PrintDocument里用的Y坐标 Public Function ConvertToITextPageY(pageHeight As Single, originalTopY As Single) As Single Return pageHeight - originalTopY End Function ' 矩形内部Y坐标转换:将基于矩形左上角的Y偏移值转为iText兼容的格式 ' 参数:rectHeight 为当前矩形/图像的高度,innerTopOffsetY 为你原有代码里相对于矩形左上角的Y偏移 Public Function ConvertToITextRectY(rectHeight As Single, innerTopOffsetY As Single) As Single Return rectHeight - innerTopOffsetY End Function
步骤2:以矩形左上角为基准填充文本的实现代码
你可以先绘制矩形/图像,再基于该矩形的区域填充文本,原有偏移值(比如你原来的x+254、y+34)可以完全复用,不需要重新测量:
' 1. 先获取当前页面的尺寸,支持自定义页面尺寸 Dim pageSize As iText.Kernel.Geom.PageSize = page.GetPageSize() Dim pageHeight As Single = pageSize.GetHeight() ' 2. 定义你要放置的矩形/图像的位置和尺寸,这里的x、y是你原来PrintDocument里基于页面左上角的坐标 Dim rectWidth As Single = 150 ' 矩形宽度,按需设置 Dim rectHeight As Single = 100 ' 矩形高度,按需设置 Dim rectLeftX As Single = x + 254 ' 复用你原有X偏移 Dim rectTopY As Single = y + 34 ' 复用你原有Y偏移(基于页面左上角) ' 转换为iText兼容的矩形左下角Y坐标 Dim rectBottomY As Single = ConvertToITextPageY(pageHeight, rectTopY) - rectHeight ' 3. 创建矩形区域 Dim retangulo As New iText.Kernel.Geom.Rectangle(rectLeftX, rectBottomY, rectWidth, rectHeight) Dim pdfCanvas As New iText.Kernel.Pdf.Canvas.PdfCanvas(page) ' 如果需要先绘制矩形/图像,在这里执行绘制逻辑即可 ' 示例:绘制矩形边框(不需要可删除) pdfCanvas.Rectangle(retangulo).Stroke() ' 4. 在矩形内部填充文本,坐标基于矩形左上角,直接复用原有偏移 Dim canvas As New iText.Layout.Canvas(pdfCanvas, pdf, retangulo) ' 这里的innerOffsetX、innerOffsetY是相对于矩形左上角的偏移,完全复用原有PrintDocument的内部测量值 Dim innerOffsetX As Single = 0 ' 矩形内部左偏移,按需调整 Dim innerOffsetY As Single = 0 ' 矩形内部上偏移,按需调整 Dim texto As New iText.Layout.Element.Text(ParcelaAtual + 1 & " / " & tabParcelas.Rows.Count).SetFontSize(12).SetBold() Dim paragrafo As New iText.Layout.Element.Paragraph(texto) ' 设置段落相对于矩形区域的位置,自动适配坐标系 paragrafo.SetFixedPosition(innerOffsetX, ConvertToITextRectY(rectHeight, innerOffsetY), rectWidth) canvas.Add(paragrafo) canvas.Close()
多图像场景适配
如果需要生成1张或3张带填充值的图像,只需要对每张图像单独执行上述逻辑:
- 先确定每张图像在页面上的左上角坐标
- 按上述方法转换得到图像对应的iText矩形区域
- 图像内部的所有填充文本坐标,全部基于该图像自身的左上角做转换即可,原有测量的内部偏移值可以100%复用
内容的提问来源于stack exchange,提问作者Heitor Badotti
相关产品推荐
相关产品推荐

