我正在努力从 iText 5 迁移到 iText 7。我的 iText 5 代码如下。我不确定应该使用 iText 7 中的哪种替代方案(可能是 Canvas)来实现 PdfContentByte
和 PdfTemplate
。
produce(com.itextpdf.text.pdf.PdfWriter writer, width, height, ...) {
com.itextpdf.text.pdf.PdfContentByte cb = writer.getDirectContent();
com.itextpdf.text.pdf.PdfTemplate template = cb.createTemplate(width, height);
try
{
template.beginText();
template.setFontAndSize(font, fontSize);
template.setTextMatrix(0, 0);
template.showTextAligned(com.itextpdf.text.pdf.PdfContentByte.ALIGN_CENTER, value, width/2, linePos, 0);
template.endText();
}
catch(Exception e)
{
}
cb.addTemplate(template, left, areaTop - top - height);
}
任何人都可以建议实现此目的的正确替代方案吗?
谢谢!
最佳答案
iText 5 PdfWriter.getDirectContent()
返回的 PdfContentByte
实例本质上是当前页面的内容加上许多添加更多内容的方法。
iText 5 PdfTemplate
本质上是一个 PDF 表单 XObject 及其内容以及许多添加更多内容的方法。
在 iText 7 中,有专门的类 PdfPage
和 PdfFormXObject
分别用于页面和 PDF 表单 XObjects,还有类 PdfCanvas
和 >Canvas
分别提供低级和高级方法来向页面添加更多内容或形成 XObjects。
因此,以下内容大致对应于您的 iText 5 代码:
PdfDocument pdfDoc = ...
PdfPage page = ... // e.g. pdfDoc.addNewPage();
PdfFormXObject pdfFormXObject = new PdfFormXObject(new Rectangle(width, height));
try (Canvas canvas = new Canvas(pdfFormXObject, pdfDoc)) {
canvas.showTextAligned(value, width/2, linePos, TextAlignment.CENTER);
}
PdfCanvas pdfCanvas = new PdfCanvas(page);
pdfCanvas.addXObject(pdfFormXObject, left, bottom);
(来自 AddCanvasToDocument 测试 testAddCanvasForManjushaDC
)
我说“大约”是因为 iText 5 和 iText 7 的架构不同,因此不一定有精确的对应关系,特别是 iText 5 中的最佳实践不会直接转化为 iText 7 中的最佳实践。
关于java - 在 iText 7 中实现 PdfContentByte 和 PdfTemplate 的替代方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63055889/