Как редактировать ширину PdfTemplate (в 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);
1 ответ
Решение
Ошибка в исходном коде ОП
Ты звонишь ColumnText.showTextAligned
с String
в качестве третьего параметра:
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, я построил это доказательство концепции:
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();
}
Выход:
Учитывая, что я установил ширину шаблона равной половине ширины постфикса 0123456789
в onCloseDocument
, это именно так, как и ожидалось.