From 8192b1a44f9705b41d96972c90213e7bcd7bda5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Sz=C3=BCcs?= <127139797+balazs-szucs@users.noreply.github.com> Date: Sat, 6 Sep 2025 21:27:11 +0200 Subject: [PATCH] performance: Use StringBuilder instead of string concatenation for building strings (#4193) --- .../software/common/util/PdfUtils.java | 10 ++-- .../api/misc/AutoRenameController.java | 6 +-- .../controller/api/misc/ShowJavascript.java | 50 +++++++++---------- 3 files changed, 32 insertions(+), 34 deletions(-) diff --git a/app/common/src/main/java/stirling/software/common/util/PdfUtils.java b/app/common/src/main/java/stirling/software/common/util/PdfUtils.java index 62cec1d32..7d8753cce 100644 --- a/app/common/src/main/java/stirling/software/common/util/PdfUtils.java +++ b/app/common/src/main/java/stirling/software/common/util/PdfUtils.java @@ -552,10 +552,10 @@ public class PdfUtils { public boolean containsTextInFile(PDDocument pdfDocument, String text, String pagesToCheck) throws IOException { PDFTextStripper textStripper = new PDFTextStripper(); - String pdfText = ""; + StringBuilder pdfText = new StringBuilder(); if (pagesToCheck == null || "all".equals(pagesToCheck)) { - pdfText = textStripper.getText(pdfDocument); + pdfText = new StringBuilder(textStripper.getText(pdfDocument)); } else { // remove whitespaces pagesToCheck = pagesToCheck.replaceAll("\\s+", ""); @@ -571,21 +571,21 @@ public class PdfUtils { for (int i = startPage; i <= endPage; i++) { textStripper.setStartPage(i); textStripper.setEndPage(i); - pdfText += textStripper.getText(pdfDocument); + pdfText.append(textStripper.getText(pdfDocument)); } } else { // Handle individual page int page = Integer.parseInt(splitPoint); textStripper.setStartPage(page); textStripper.setEndPage(page); - pdfText += textStripper.getText(pdfDocument); + pdfText.append(textStripper.getText(pdfDocument)); } } } pdfDocument.close(); - return pdfText.contains(text); + return pdfText.toString().contains(text); } public boolean pageCount(PDDocument pdfDocument, int pageCount, String comparator) diff --git a/app/core/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java b/app/core/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java index 8de1738ec..514acf46a 100644 --- a/app/core/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java +++ b/app/core/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java @@ -94,14 +94,14 @@ public class AutoRenameController { // Merge lines with same font size List mergedLineInfos = new ArrayList<>(); for (int i = 0; i < lineInfos.size(); i++) { - String mergedText = lineInfos.get(i).text; + StringBuilder mergedText = new StringBuilder(lineInfos.get(i).text); float fontSize = lineInfos.get(i).fontSize; while (i + 1 < lineInfos.size() && lineInfos.get(i + 1).fontSize == fontSize) { - mergedText += " " + lineInfos.get(i + 1).text; + mergedText.append(" ").append(lineInfos.get(i + 1).text); i++; } - mergedLineInfos.add(new LineInfo(mergedText, fontSize)); + mergedLineInfos.add(new LineInfo(mergedText.toString(), fontSize)); } // Sort lines by font size in descending order and get the first one diff --git a/app/core/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java b/app/core/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java index 924ba84fa..6c413cd36 100644 --- a/app/core/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java +++ b/app/core/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java @@ -1,8 +1,9 @@ package stirling.software.SPDF.controller.api.misc; -import java.nio.charset.StandardCharsets; -import java.util.Map; - +import io.github.pixee.security.Filenames; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.common.PDNameTreeNode; import org.apache.pdfbox.pdmodel.interactive.action.PDActionJavaScript; @@ -13,17 +14,13 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; - -import io.github.pixee.security.Filenames; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; - -import lombok.RequiredArgsConstructor; - import stirling.software.common.model.api.PDFFile; import stirling.software.common.service.CustomPDFDocumentFactory; import stirling.software.common.util.WebResponseUtils; +import java.nio.charset.StandardCharsets; +import java.util.Map; + @RestController @RequestMapping("/api/v1/misc") @Tag(name = "Misc", description = "Miscellaneous APIs") @@ -38,7 +35,8 @@ public class ShowJavascript { description = "desc. Input:PDF Output:JS Type:SISO") public ResponseEntity extractHeader(@ModelAttribute PDFFile file) throws Exception { MultipartFile inputFile = file.getFileInput(); - String script = ""; + StringBuilder script = new StringBuilder(); + boolean foundScript = false; try (PDDocument document = pdfDocumentFactory.load(inputFile)) { @@ -55,28 +53,28 @@ public class ShowJavascript { PDActionJavaScript jsAction = entry.getValue(); String jsCodeStr = jsAction.getAction(); - script += - "// File: " - + Filenames.toSimpleFileName( - inputFile.getOriginalFilename()) - + ", Script: " - + name - + "\n" - + jsCodeStr - + "\n"; + if (jsCodeStr != null && !jsCodeStr.trim().isEmpty()) { + script.append("// File: ") + .append(Filenames.toSimpleFileName(inputFile.getOriginalFilename())) + .append(", Script: ") + .append(name) + .append("\n") + .append(jsCodeStr) + .append("\n"); + foundScript = true; + } } } } - if (script.isEmpty()) { - script = - "PDF '" - + Filenames.toSimpleFileName(inputFile.getOriginalFilename()) - + "' does not contain Javascript"; + if (!foundScript) { + script = new StringBuilder("PDF '") + .append(Filenames.toSimpleFileName(inputFile.getOriginalFilename())) + .append("' does not contain Javascript"); } return WebResponseUtils.bytesToWebResponse( - script.getBytes(StandardCharsets.UTF_8), + script.toString().getBytes(StandardCharsets.UTF_8), Filenames.toSimpleFileName(inputFile.getOriginalFilename()) + ".js", MediaType.TEXT_PLAIN); }