From a3e05bdbe963f43cbc66163d148ff3b08e3f306c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Sexenian?= <99925035+tomas-sexenian@users.noreply.github.com> Date: Wed, 5 Feb 2025 13:32:15 -0300 Subject: [PATCH 1/4] Replace {{pages}} placeholder with document page count Issue:201569 --- .../com/genexus/reports/PDFReportPDFBox.java | 76 ++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git a/java/src/main/java/com/genexus/reports/PDFReportPDFBox.java b/java/src/main/java/com/genexus/reports/PDFReportPDFBox.java index 690fe1781..f5f02e005 100644 --- a/java/src/main/java/com/genexus/reports/PDFReportPDFBox.java +++ b/java/src/main/java/com/genexus/reports/PDFReportPDFBox.java @@ -861,7 +861,7 @@ else if (barcodeType != null) { templateY = this.pageSize.getUpperRightY() - bottomAux - topMargin - bottomMargin; templateCreated = true; } - sTxt = String.valueOf(this.page); + sTxt = "{{pages}}"; } float textBlockWidth = rightAux - leftAux; @@ -1265,12 +1265,86 @@ else if (length == 15840 && width == 12240) return new PDRectangle((int)(width / PAGE_SCALE_X) + leftMargin, (int)(length / PAGE_SCALE_Y) + topMargin); } + private void replaceTemplatePages() throws IOException { + int totalPages = document.getNumberOfPages(); + for (int i = 0; i < totalPages; i++) { + final org.apache.pdfbox.pdmodel.PDPage page = document.getPage(i); + final java.util.List replacements = new java.util.ArrayList<>(); + org.apache.pdfbox.text.PDFTextStripper stripper = new org.apache.pdfbox.text.PDFTextStripper() { + @Override + protected void writeString(String text, java.util.List textPositions) throws IOException { + String placeholder = "{{pages}}"; + int index = text.indexOf(placeholder); + while (index != -1 && index + placeholder.length() <= textPositions.size()) { + float minX = Float.MAX_VALUE; + float maxX = 0; + float minY = Float.MAX_VALUE; + float maxY = 0; + for (int j = index; j < index + placeholder.length(); j++) { + org.apache.pdfbox.text.TextPosition tp = textPositions.get(j); + float tpX = tp.getXDirAdj(); + float tpY = tp.getYDirAdj(); + float tpWidth = tp.getWidthDirAdj(); + float tpHeight = tp.getHeightDir(); + if (tpX < minX) { + minX = tpX; + } + if (tpX + tpWidth > maxX) { + maxX = tpX + tpWidth; + } + if (tpY < minY) { + minY = tpY; + } + if (tpY + tpHeight > maxY) { + maxY = tpY + tpHeight; + } + } + float bboxWidth = maxX - minX; + float bboxHeight = maxY - minY; + float origBoxBottom = pageSize.getHeight() - maxY; + float originalCenterX = minX + bboxWidth / 2; + float originalCenterY = origBoxBottom + bboxHeight / 2; + float newCenterY = originalCenterY + (bboxHeight * 0.5f); + float enlargedWidth = bboxWidth * 2.5f; + float enlargedHeight = bboxHeight * 2.5f; + float rectX = originalCenterX - (enlargedWidth / 2); + float rectY = newCenterY - (enlargedHeight / 2); + float baselineY = newCenterY; + replacements.add(new float[] { rectX, rectY, enlargedWidth, enlargedHeight, baselineY }); + index = text.indexOf(placeholder, index + placeholder.length()); + } + super.writeString(text, textPositions); + } + }; + stripper.setStartPage(i + 1); + stripper.setEndPage(i + 1); + stripper.getText(document); + if (!replacements.isEmpty()) { + try (org.apache.pdfbox.pdmodel.PDPageContentStream cs = new org.apache.pdfbox.pdmodel.PDPageContentStream( + document, page, org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode.APPEND, true, true)) { + for (float[] rep : replacements) { + cs.addRect(rep[0], rep[1], rep[2], rep[3]); + cs.setNonStrokingColor(java.awt.Color.WHITE); + cs.fill(); + cs.beginText(); + cs.setFont(templateFont, templateFontSize); + cs.setNonStrokingColor(templateColorFill); + cs.newLineAtOffset(rep[0], rep[4]); + cs.showText(String.valueOf(totalPages)); + cs.endText(); + } + } + } + } + } + public void GxEndDocument() { try { if(document.getNumberOfPages() == 0) { document.addPage(new PDPage(this.pageSize)); pages++; } + replaceTemplatePages(); int copies = 1; try { copies = Integer.parseInt(printerSettings.getProperty(form, Const.COPIES)); From dd00f87019dad0f90b6bdad059f2f7847ba144c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Sexenian?= <99925035+tomas-sexenian@users.noreply.github.com> Date: Wed, 5 Feb 2025 14:09:40 -0300 Subject: [PATCH 2/4] Change inline imports for top of file imports --- .../com/genexus/reports/PDFReportPDFBox.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/java/src/main/java/com/genexus/reports/PDFReportPDFBox.java b/java/src/main/java/com/genexus/reports/PDFReportPDFBox.java index f5f02e005..b9d0433d6 100644 --- a/java/src/main/java/com/genexus/reports/PDFReportPDFBox.java +++ b/java/src/main/java/com/genexus/reports/PDFReportPDFBox.java @@ -29,6 +29,8 @@ import org.apache.pdfbox.pdmodel.graphics.state.RenderingMode; import org.apache.pdfbox.pdmodel.interactive.action.PDActionJavaScript; import org.apache.pdfbox.pdmodel.interactive.viewerpreferences.PDViewerPreferences; +import org.apache.pdfbox.text.PDFTextStripper; +import org.apache.pdfbox.text.TextPosition; import org.apache.pdfbox.util.Matrix; import org.jsoup.Jsoup; @@ -1268,11 +1270,11 @@ else if (length == 15840 && width == 12240) private void replaceTemplatePages() throws IOException { int totalPages = document.getNumberOfPages(); for (int i = 0; i < totalPages; i++) { - final org.apache.pdfbox.pdmodel.PDPage page = document.getPage(i); - final java.util.List replacements = new java.util.ArrayList<>(); - org.apache.pdfbox.text.PDFTextStripper stripper = new org.apache.pdfbox.text.PDFTextStripper() { + final PDPage page = document.getPage(i); + final List replacements = new java.util.ArrayList<>(); + PDFTextStripper stripper = new PDFTextStripper() { @Override - protected void writeString(String text, java.util.List textPositions) throws IOException { + protected void writeString(String text, List textPositions) throws IOException { String placeholder = "{{pages}}"; int index = text.indexOf(placeholder); while (index != -1 && index + placeholder.length() <= textPositions.size()) { @@ -1281,7 +1283,7 @@ protected void writeString(String text, java.util.List Date: Wed, 5 Feb 2025 14:15:37 -0300 Subject: [PATCH 3/4] Turn {{pages}} placeholder into a constant --- .../main/java/com/genexus/reports/PDFReportPDFBox.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/java/src/main/java/com/genexus/reports/PDFReportPDFBox.java b/java/src/main/java/com/genexus/reports/PDFReportPDFBox.java index b9d0433d6..3ebb9971b 100644 --- a/java/src/main/java/com/genexus/reports/PDFReportPDFBox.java +++ b/java/src/main/java/com/genexus/reports/PDFReportPDFBox.java @@ -61,6 +61,7 @@ public class PDFReportPDFBox extends GXReportPDFCommons{ private final float DEFAULT_PDFBOX_LEADING = 1.2f; private Set supportedHTMLTags = new HashSet<>(); private PDPageContentStream currentPageContentStream; + private final String pagesPlaceHolder = "{{pages}}"; static { log = org.apache.logging.log4j.LogManager.getLogger(PDFReportPDFBox.class); @@ -854,7 +855,7 @@ else if (barcodeType != null) { } // Handle {{Pages}} - if (sTxt.trim().equalsIgnoreCase("{{Pages}}")) { + if (sTxt.trim().equalsIgnoreCase(pagesPlaceHolder)) { if (!templateCreated) { templateFont = baseFont; templateFontSize = fontSize; @@ -863,7 +864,7 @@ else if (barcodeType != null) { templateY = this.pageSize.getUpperRightY() - bottomAux - topMargin - bottomMargin; templateCreated = true; } - sTxt = "{{pages}}"; + sTxt = pagesPlaceHolder; } float textBlockWidth = rightAux - leftAux; @@ -1274,8 +1275,8 @@ private void replaceTemplatePages() throws IOException { final List replacements = new java.util.ArrayList<>(); PDFTextStripper stripper = new PDFTextStripper() { @Override - protected void writeString(String text, List textPositions) throws IOException { - String placeholder = "{{pages}}"; + protected void writeString(String text, List textPositions) throws IOException { + String placeholder = pagesPlaceHolder; int index = text.indexOf(placeholder); while (index != -1 && index + placeholder.length() <= textPositions.size()) { float minX = Float.MAX_VALUE; From 777015523c5f25c0fb9548dc5dc815ccccb3502d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Sexenian?= <99925035+tomas-sexenian@users.noreply.github.com> Date: Wed, 5 Feb 2025 14:41:57 -0300 Subject: [PATCH 4/4] Adhere to constants naming and declaration conventions --- .../main/java/com/genexus/reports/PDFReportPDFBox.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/java/src/main/java/com/genexus/reports/PDFReportPDFBox.java b/java/src/main/java/com/genexus/reports/PDFReportPDFBox.java index 3ebb9971b..3572aa740 100644 --- a/java/src/main/java/com/genexus/reports/PDFReportPDFBox.java +++ b/java/src/main/java/com/genexus/reports/PDFReportPDFBox.java @@ -61,7 +61,7 @@ public class PDFReportPDFBox extends GXReportPDFCommons{ private final float DEFAULT_PDFBOX_LEADING = 1.2f; private Set supportedHTMLTags = new HashSet<>(); private PDPageContentStream currentPageContentStream; - private final String pagesPlaceHolder = "{{pages}}"; + private final static String PAGES_PLACEHOLDER = "{{pages}}"; static { log = org.apache.logging.log4j.LogManager.getLogger(PDFReportPDFBox.class); @@ -855,7 +855,7 @@ else if (barcodeType != null) { } // Handle {{Pages}} - if (sTxt.trim().equalsIgnoreCase(pagesPlaceHolder)) { + if (sTxt.trim().equalsIgnoreCase(PAGES_PLACEHOLDER)) { if (!templateCreated) { templateFont = baseFont; templateFontSize = fontSize; @@ -864,7 +864,7 @@ else if (barcodeType != null) { templateY = this.pageSize.getUpperRightY() - bottomAux - topMargin - bottomMargin; templateCreated = true; } - sTxt = pagesPlaceHolder; + sTxt = PAGES_PLACEHOLDER; } float textBlockWidth = rightAux - leftAux; @@ -1276,7 +1276,7 @@ private void replaceTemplatePages() throws IOException { PDFTextStripper stripper = new PDFTextStripper() { @Override protected void writeString(String text, List textPositions) throws IOException { - String placeholder = pagesPlaceHolder; + String placeholder = PAGES_PLACEHOLDER; int index = text.indexOf(placeholder); while (index != -1 && index + placeholder.length() <= textPositions.size()) { float minX = Float.MAX_VALUE; @@ -1484,4 +1484,4 @@ public void GxEndPage() { } } -} \ No newline at end of file +}