如何编辑 PdfTemplate 宽度(Java)

How to edit PdfTemplate width (in Java)

是否可以在关闭文档之前编辑 PdfTemplate 对象的宽度? 在我的 pdf 过程中,我创建了一个文档,并设置了一个用于写入总页码的模板。我设置了宽度,但它不起作用:

// onOpenDocument
PdfTemplate pageNumTemplate = writer.getDirectContent().createTemplate(10, 20);
globalDataMap.put("myTemplate", pageNumTemplate)

// onCloseDocument
Font font = (Font) globalDataMap.get("myFont");
String pagenum = String.valueOf(writer.getPageNumber());

float widthPoint = font.getBaseFont().getWidthPoint(pagenum, font.getSize());
PdfTemplate pdfTemplate = (PdfTemplate) globalDataMap.get("myTemplate");
pdfTemplate.setWidth(widthPoint);
ColumnText.showTextAligned(pdfTemplate, Element.ALIGN_LEFT, new Phrase(pagenum), 0, 1, 0);

OP 初始代码错误

您使用 String 作为第三个参数调用 ColumnText.showTextAligned

String pagenum = String.valueOf(writer.getPageNumber());
[...]
ColumnText.showTextAligned(pdfTemplate, Element.ALIGN_LEFT, pagenum, 0, 1, 0);

但是所有 ColumnText.showTextAligned 重载都期望 Phrase 那里:

public static void showTextAligned(final PdfContentByte canvas, final int alignment, final Phrase phrase, final float x, final float y, final float rotation)

public static void showTextAligned(final PdfContentByte canvas, int alignment, final Phrase phrase, final float x, final float y, final float rotation, final int runDirection, final int arabicOptions)

(至少达到当前的 5.5.9-SNAPSHOT 开发版本)。

因此,您可能想要使用

ColumnText.showTextAligned(pdfTemplate, Element.ALIGN_LEFT, new Phrase(pagenum), 0, 1, 0);

相反。

但现在可以了

基于 OP 的代码,我构建了这个 proof-of-concept:

try (   FileOutputStream stream = new FileOutputStream(new File(RESULT_FOLDER, "dynamicTemplateWidths.pdf"))    )
{
    Document document = new Document(PageSize.A6);
    PdfWriter writer = PdfWriter.getInstance(document, stream);
    writer.setPageEvent(new PdfPageEventHelper()
    {
        PdfTemplate dynamicTemplate = null;
        Font font = new Font(BaseFont.createFont(), 12);
        String postfix = "0123456789";

        @Override
        public void onOpenDocument(PdfWriter writer, Document document)
        {
            super.onOpenDocument(writer, document);
            dynamicTemplate = writer.getDirectContent().createTemplate(10, 20);
        }

        @Override
        public void onEndPage(PdfWriter writer, Document document)
        {
            writer.getDirectContent().addTemplate(dynamicTemplate, 100, 300);
        }

        @Override
        public void onCloseDocument(PdfWriter writer, Document document)
        {
            float widthPoint = font.getBaseFont().getWidthPoint(postfix, font.getSize());
            dynamicTemplate.setWidth(widthPoint / 2.0f);
            ColumnText.showTextAligned(dynamicTemplate, Element.ALIGN_LEFT, new Phrase(String.valueOf(writer.getPageNumber()) + "-" + postfix), 0, 1, 0);
        }

    });
    document.open();

    document.add(new Paragraph("PAGE 1"));
    document.newPage();
    document.add(new Paragraph("PAGE 2"));

    document.close();
}

输出:

考虑到我将模板宽度设置为 onCloseDocument 中后缀 0123456789 宽度的一半,这完全符合预期。