将iText替换为PDFbox和boxable时Chunk类的替代方案咨询
iText Chunk类的PDFbox+boxable生态替代方案
iText中的Chunk是支持独立样式配置的最小文本单元,在PDFbox+boxable技术栈下有两种可行的替代方案,可覆盖原Chunk的所有常用能力:
方案1:使用boxable原生提供的TextChunk类(优先推荐)
boxable本身已经内置了对标iText Chunk实现的TextChunk组件,开箱即用,可直接和boxable的段落、表格等上层组件集成,支持自定义字体、字号、文本颜色、背景色、上标、下标、下划线、删除线等所有Chunk常用特性,无需额外封装。
使用示例:
import com.github.dhorions.boxable.text.TextChunk; import org.apache.pdfbox.pdmodel.font.PDType1Font; import java.awt.Color; // 初始化文本块 TextChunk customChunk = new TextChunk("待渲染的文本内容"); // 配置加粗字体 customChunk.setFont(PDType1Font.HELVETICA_BOLD); // 配置字号 customChunk.setFontSize(14f); // 配置红色文本 customChunk.setColor(Color.RED); // 配置上标样式 customChunk.setSuperscript(true); // 配置下划线 customChunk.setUnderline(true);
配置完成的TextChunk可以直接添加到boxable的Paragraph、TableCell等组件中直接使用。
方案2:基于PDFbox原生能力自行封装轻量文本块
如果你的场景不需要用到boxable的上层组件,仅依赖原生PDFbox做自定义渲染,可以自行封装等价的文本块工具类,实现所有Chunk的样式能力:
import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.font.PDFont; import java.awt.Color; import java.io.IOException; public class CustomPDFChunk { private final String content; private final PDFont font; private final float fontSize; private final Color textColor; // 上下标偏移量,上标设正值、下标设负值 private final float yOffset; private final boolean isUnderline; private final Color bgColor; // 构造方法、属性getter自行实现 public void render(PDPageContentStream stream, float x, float y) throws IOException { // 先渲染背景色(如果配置了) if (bgColor != null) { float textWidth = font.getStringWidth(content) * fontSize / 1000; stream.setNonStrokingColor(bgColor); stream.addRect(x, y - 2, textWidth, fontSize + 2); stream.fill(); } // 渲染文本 stream.beginText(); stream.setNonStrokingColor(textColor); stream.setFont(font, fontSize); stream.newLineAtOffset(x, y + yOffset); stream.showText(content); stream.endText(); // 渲染下划线(如果配置了) if (isUnderline) { float textWidth = font.getStringWidth(content) * fontSize / 1000; stream.setStrokingColor(textColor); stream.setLineWidth(1f); stream.moveTo(x, y - 1); stream.lineTo(x + textWidth, y - 1); stream.stroke(); } } }
该方案自由度最高,可根据业务需求自定义扩展任意样式能力。
内容的提问来源于stack exchange,提问作者Rohith Sreekumar
相关产品推荐
相关产品推荐

