fix(api): address potential backend resource leaks and improve frontend accessibility (#5678)

This commit is contained in:
Balázs Szücs
2026-02-11 23:31:06 +00:00
committed by GitHub
parent f9d2f36ab7
commit e523190f39
4 changed files with 119 additions and 112 deletions
@@ -574,17 +574,21 @@ public class PdfUtils {
boolean everyPage) boolean everyPage)
throws IOException { throws IOException {
PDDocument document = pdfDocumentFactory.load(pdfBytes); try (PDDocument document = pdfDocumentFactory.load(pdfBytes)) {
// Get the first page of the PDF // Get the first page of the PDF
int pages = document.getNumberOfPages(); int pages = document.getNumberOfPages();
for (int i = 0; i < pages; i++) { for (int i = 0; i < pages; i++) {
PDPage page = document.getPage(i); PDPage page = document.getPage(i);
try (PDPageContentStream contentStream = try (PDPageContentStream contentStream =
new PDPageContentStream( new PDPageContentStream(
document, page, PDPageContentStream.AppendMode.APPEND, true, true)) { document,
page,
PDPageContentStream.AppendMode.APPEND,
true,
true)) {
// Create an image object from the image bytes // Create an image object from the image bytes
PDImageXObject image = PDImageXObject.createFromByteArray(document, imageBytes, ""); PDImageXObject image =
PDImageXObject.createFromByteArray(document, imageBytes, "");
// Draw the image onto the page at the specified x and y coordinates // Draw the image onto the page at the specified x and y coordinates
contentStream.drawImage(image, x, y); contentStream.drawImage(image, x, y);
log.info("Image successfully overlaid onto PDF"); log.info("Image successfully overlaid onto PDF");
@@ -603,6 +607,7 @@ public class PdfUtils {
log.info("PDF successfully saved to byte array"); log.info("PDF successfully saved to byte array");
return baos.toByteArray(); return baos.toByteArray();
} }
}
public boolean containsTextInFile(PDDocument pdfDocument, String text, String pagesToCheck) public boolean containsTextInFile(PDDocument pdfDocument, String text, String pagesToCheck)
throws IOException { throws IOException {
@@ -101,7 +101,7 @@ public class SplitPdfBySectionsController {
return WebResponseUtils.baosToWebResponse(baos, filename + ".pdf"); return WebResponseUtils.baosToWebResponse(baos, filename + ".pdf");
} }
} else { } else {
TempFile zipTempFile = new TempFile(tempFileManager, ".zip"); try (TempFile zipTempFile = new TempFile(tempFileManager, ".zip")) {
try (ZipOutputStream zipOut = try (ZipOutputStream zipOut =
new ZipOutputStream(Files.newOutputStream(zipTempFile.getPath()))) { new ZipOutputStream(Files.newOutputStream(zipTempFile.getPath()))) {
for (int pageIndex = 0; for (int pageIndex = 0;
@@ -145,7 +145,8 @@ public class SplitPdfBySectionsController {
} else { } else {
try (PDDocument subDoc = pdfDocumentFactory.createNewDocument()) { try (PDDocument subDoc = pdfDocumentFactory.createNewDocument()) {
LayerUtility subLayerUtility = new LayerUtility(subDoc); LayerUtility subLayerUtility = new LayerUtility(subDoc);
addPageToTarget(sourceDocument, pageIndex, subDoc, subLayerUtility); addPageToTarget(
sourceDocument, pageIndex, subDoc, subLayerUtility);
String entryName = filename + "_" + pageNum + "_1.pdf"; String entryName = filename + "_" + pageNum + "_1.pdf";
saveDocToZip(subDoc, zipOut, entryName); saveDocToZip(subDoc, zipOut, entryName);
} catch (IOException e) { } catch (IOException e) {
@@ -162,6 +163,7 @@ public class SplitPdfBySectionsController {
return WebResponseUtils.bytesToWebResponse( return WebResponseUtils.bytesToWebResponse(
zipBytes, filename + ".zip", MediaType.APPLICATION_OCTET_STREAM); zipBytes, filename + ".zip", MediaType.APPLICATION_OCTET_STREAM);
} }
}
} catch (Exception e) { } catch (Exception e) {
log.error("Error splitting PDF file: {}", file.getOriginalFilename(), e); log.error("Error splitting PDF file: {}", file.getOriginalFilename(), e);
throw e; throw e;
@@ -55,8 +55,7 @@ public class OverlayImageController {
boolean isSvg = SvgOverlayUtil.isSvgImage(imageBytes); boolean isSvg = SvgOverlayUtil.isSvgImage(imageBytes);
PDDocument document = pdfDocumentFactory.load(pdfBytes); try (PDDocument document = pdfDocumentFactory.load(pdfBytes)) {
int pages = document.getNumberOfPages(); int pages = document.getNumberOfPages();
for (int i = 0; i < pages; i++) { for (int i = 0; i < pages; i++) {
PDPage page = document.getPage(i); PDPage page = document.getPage(i);
@@ -85,14 +84,15 @@ public class OverlayImageController {
ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();
document.save(baos); document.save(baos);
document.close();
byte[] result = baos.toByteArray(); byte[] result = baos.toByteArray();
log.info("PDF with overlaid image successfully created"); log.info("PDF with overlaid image successfully created");
return WebResponseUtils.bytesToWebResponse( return WebResponseUtils.bytesToWebResponse(
result, result,
GeneralUtils.generateFilename(pdfFile.getOriginalFilename(), "_overlayed.pdf")); GeneralUtils.generateFilename(
pdfFile.getOriginalFilename(), "_overlayed.pdf"));
}
} catch (IOException e) { } catch (IOException e) {
log.error("Failed to add image to PDF", e); log.error("Failed to add image to PDF", e);
+1 -1
View File
@@ -192,7 +192,7 @@ export default function HomePage() {
<div className="mobile-toggle"> <div className="mobile-toggle">
<div className="mobile-header"> <div className="mobile-header">
<div className="mobile-brand"> <div className="mobile-brand">
<img src={brandIconSrc} alt="" className="mobile-brand-icon" /> <img src={brandIconSrc} alt="" aria-hidden="true" className="mobile-brand-icon" />
<img src={brandTextSrc} alt={brandAltText} className="mobile-brand-text" /> <img src={brandTextSrc} alt={brandAltText} className="mobile-brand-text" />
</div> </div>
</div> </div>