mirror of
https://github.com/arsvendg/Stirling-PDF.git
synced 2026-07-16 19:33:11 +02:00
fix(api): address potential backend resource leaks and improve frontend accessibility (#5678)
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
+4
-2
@@ -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;
|
||||||
|
|||||||
+4
-4
@@ -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);
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user