Skip to content

Commit

Permalink
updates
Browse files Browse the repository at this point in the history
  • Loading branch information
Frooodle committed Sep 29, 2023
1 parent 09db661 commit e0f306d
Show file tree
Hide file tree
Showing 28 changed files with 224 additions and 96 deletions.
28 changes: 15 additions & 13 deletions Dockerfile-lite
Original file line number Diff line number Diff line change
Expand Up @@ -12,30 +12,31 @@ RUN apt-get update && \


# Set Environment Variables
ENV PUID=1000 \
PGID=1000 \
UMASK=022 \
DOCKER_ENABLE_SECURITY=false \
ENV DOCKER_ENABLE_SECURITY=false \
HOME=/home/stirlingpdfuser \
VERSION_TAG=$VERSION_TAG
VERSION_TAG=$VERSION_TAG
# PUID=1000 \
# PGID=1000 \
# UMASK=022 \

# Create user and group
RUN groupadd -g $PGID stirlingpdfgroup && \
useradd -u $PUID -g stirlingpdfgroup -s /bin/sh stirlingpdfuser && \
mkdir -p $HOME && chown stirlingpdfuser:stirlingpdfgroup $HOME
#RUN groupadd -g $PGID stirlingpdfgroup && \
# useradd -u $PUID -g stirlingpdfgroup -s /bin/sh stirlingpdfuser && \
# mkdir -p $HOME && chown stirlingpdfuser:stirlingpdfgroup $HOME

# Set up necessary directories and permissions
RUN mkdir -p /scripts /usr/share/fonts/opentype/noto /configs /customFiles && \
chown -R stirlingpdfuser:stirlingpdfgroup /usr/share/fonts/opentype/noto /configs /customFiles
RUN mkdir -p /scripts /usr/share/fonts/opentype/noto /configs /customFiles

# chown -R stirlingpdfuser:stirlingpdfgroup /usr/share/fonts/opentype/noto /configs /customFiles

# Copy necessary files
COPY src/main/resources/static/fonts/*.ttf /usr/share/fonts/opentype/noto/
COPY src/main/resources/static/fonts/*.otf /usr/share/fonts/opentype/noto/
COPY build/libs/*.jar app.jar

# Set font cache and permissions
RUN fc-cache -f -v && \
chown stirlingpdfuser:stirlingpdfgroup /app.jar
RUN fc-cache -f -v
# chown stirlingpdfuser:stirlingpdfgroup /app.jar



Expand All @@ -48,5 +49,6 @@ ENV ENDPOINTS_GROUPS_TO_REMOVE=Python,OpenCV,OCRmyPDF
ENV DOCKER_ENABLE_SECURITY=false

# Run the application
USER stirlingpdfuser
#USER stirlingpdfuser

CMD ["java", "-jar", "/app.jar"]
8 changes: 6 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,8 @@ For those wanting to use Stirling-PDFs backend API to link with their own custom
### Prerequisites:
- User must have the folder ./configs volumed within docker so that it is retained during updates.
- Docker uses must download the security jar version by setting ``DOCKER_ENABLE_SECURITY`` to ``true`` in environment variables.
- Now the initial user will be generated with username ``admin`` and password ``stirling``. On login you will be forced to change the password to a new one.
- Then either enable login via the settings.yml file or via setting ``SECURITY_ENABLE_LOGIN`` to ``true``
- Now the initial user will be generated with username ``admin`` and password ``stirling``. On login you will be forced to change the password to a new one. You can also use the environment variables ``SECURITY_INITIALLOGIN_USERNAME`` and ``SECURITY_INITIALLOGIN_PASSWORD`` to set your own straight away (Recommended to remove them after user creation).

Once the above has been done, on restart, a new stirling-pdf-DB.mv.db will show if everything worked.

Expand All @@ -261,4 +262,7 @@ For API usage you must provide a header with 'X-API-Key' and the associated API
- Fill forms mannual and automatic

### Q2: Why is my application downloading .htm files?
This is a issue caused commonly by your NGINX congifuration. The default file upload size for NGINX is 1MB, you need to add the following in your Nginx sites-available file. client_max_body_size SIZE; Where "SIZE" is 50M for example for 50MB files.
This is a issue caused commonly by your NGINX congifuration. The default file upload size for NGINX is 1MB, you need to add the following in your Nginx sites-available file. ``client_max_body_size SIZE;`` Where "SIZE" is 50M for example for 50MB files.

### Q3: Why is my download timing out
NGINX has timeout values by default so if you are running Stirling-PDF behind NGINX you may need to set a timeout value such as adding the config ``proxy_read_timeout 3600;``
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ plugins {
}

group = 'stirling.software'
version = '0.14.3'
version = '0.14.4'
sourceCompatibility = '17'

repositories {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,18 @@ public class InitialSecuritySetup {
@PostConstruct
public void init() {
if (!userService.hasUsers()) {
String initialUsername = "admin";
String initialPassword = "stirling";
userService.saveUser(initialUsername, initialPassword, Role.ADMIN.getRoleId(), true);


String initialUsername = applicationProperties.getSecurity().getInitialLogin().getUsername();
String initialPassword = applicationProperties.getSecurity().getInitialLogin().getPassword();
if (initialUsername != null && initialPassword != null) {
userService.saveUser(initialUsername, initialPassword, Role.ADMIN.getRoleId());
} else {
initialUsername = "admin";
initialPassword = "stirling";
userService.saveUser(initialUsername, initialPassword, Role.ADMIN.getRoleId(), true);
}


}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package stirling.software.SPDF.controller.api;


import java.awt.Color;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

Expand Down Expand Up @@ -42,7 +43,8 @@ public ResponseEntity<byte[]> mergeMultiplePagesIntoOne(@ModelAttribute MergeMul

int pagesPerSheet = request.getPagesPerSheet();
MultipartFile file = request.getFileInput();

boolean addBorder = request.isAddBorder();

if (pagesPerSheet != 2 && pagesPerSheet != 3 && pagesPerSheet != (int) Math.sqrt(pagesPerSheet) * Math.sqrt(pagesPerSheet)) {
throw new IllegalArgumentException("pagesPerSheet must be 2, 3 or a perfect square");
}
Expand All @@ -62,6 +64,10 @@ public ResponseEntity<byte[]> mergeMultiplePagesIntoOne(@ModelAttribute MergeMul
PDPageContentStream contentStream = new PDPageContentStream(newDocument, newPage, PDPageContentStream.AppendMode.APPEND, true, true);
LayerUtility layerUtility = new LayerUtility(newDocument);

float borderThickness = 1.5f; // Specify border thickness as required
contentStream.setLineWidth(borderThickness);
contentStream.setStrokingColor(Color.BLACK);

for (int i = 0; i < totalPages; i++) {
if (i != 0 && i % pagesPerSheet == 0) {
// Close the current content stream and create a new page and content stream
Expand Down Expand Up @@ -92,6 +98,14 @@ public ResponseEntity<byte[]> mergeMultiplePagesIntoOne(@ModelAttribute MergeMul
contentStream.drawForm(formXObject);

contentStream.restoreGraphicsState();

if(addBorder) {
// Draw border around each page
float borderX = colIndex * cellWidth;
float borderY = newPage.getMediaBox().getHeight() - (rowIndex + 1) * cellHeight;
contentStream.addRect(borderX, borderY, cellWidth, cellHeight);
contentStream.stroke();
}
}


Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package stirling.software.SPDF.controller.api.misc;

import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
Expand Down Expand Up @@ -58,15 +61,21 @@ public ResponseEntity<byte[]> extractImages(@ModelAttribute PDFWithImageFormatRe

int imageIndex = 1;
String filename = file.getOriginalFilename().replaceFirst("[.][^.]+$", "");
int pageNum = 1;
int pageNum = 0;
Set<Integer> processedImages = new HashSet<>();
// Iterate over each page
for (PDPage page : document.getPages()) {
++pageNum;
// Extract images from page
for (COSName name : page.getResources().getXObjectNames()) {
if (page.getResources().isImageXObject(name)) {
PDImageXObject image = (PDImageXObject) page.getResources().getXObject(name);

int imageHash = image.hashCode();
if(processedImages.contains(imageHash)) {
continue; // Skip already processed images
}
processedImages.add(imageHash);

// Convert image to desired format
RenderedImage renderedImage = image.getImage();
BufferedImage bufferedImage = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -386,12 +386,16 @@ public ResponseEntity<byte[]> getPdfInfo(@ModelAttribute PDFFile request)
float width = mediaBox.getWidth();
float height = mediaBox.getHeight();

pageInfo.put("Width", width);
pageInfo.put("Height", height);
ObjectNode sizeInfo = objectMapper.createObjectNode();

getDimensionInfo(sizeInfo, width, height);

sizeInfo.put("Standard Page", getPageSize(width, height));
pageInfo.set("Size", sizeInfo);

pageInfo.put("Rotation", page.getRotation());

pageInfo.put("Page Orientation", getPageOrientation(width, height));
pageInfo.put("Standard Size", getPageSize(width, height));


// Boxes
pageInfo.put("MediaBox", mediaBox.toString());
Expand Down Expand Up @@ -620,7 +624,7 @@ public ResponseEntity<byte[]> getPdfInfo(@ModelAttribute PDFFile request)



pageInfoParent.set("Page " + pageNum, pageInfo);
pageInfoParent.set("Page " + (pageNum+1), pageInfo);
}


Expand Down Expand Up @@ -670,28 +674,52 @@ public String getPageOrientation(double width, double height) {
return "Square";
}
}
public String getPageSize(double width, double height) {
// Common aspect ratios used for standard paper sizes
double[] aspectRatios = {4.0 / 3.0, 3.0 / 2.0, Math.sqrt(2.0), 16.0 / 9.0};

// Check if the page matches any common aspect ratio
for (double aspectRatio : aspectRatios) {
if (isCloseToAspectRatio(width, height, aspectRatio)) {
return "Standard";
public String getPageSize(float width, float height) {
// Define standard page sizes
Map<String, PDRectangle> standardSizes = new HashMap<>();
standardSizes.put("Letter", PDRectangle.LETTER);
standardSizes.put("LEGAL", PDRectangle.LEGAL);
standardSizes.put("A0", PDRectangle.A0);
standardSizes.put("A1", PDRectangle.A1);
standardSizes.put("A2", PDRectangle.A2);
standardSizes.put("A3", PDRectangle.A3);
standardSizes.put("A4", PDRectangle.A4);
standardSizes.put("A5", PDRectangle.A5);
standardSizes.put("A6", PDRectangle.A6);

for (Map.Entry<String, PDRectangle> entry : standardSizes.entrySet()) {
PDRectangle size = entry.getValue();
if (isCloseToSize(width, height, size.getWidth(), size.getHeight())) {
return entry.getKey();
}
}

// If not a standard aspect ratio, consider it as a custom size
return "Custom";
}
private boolean isCloseToAspectRatio(double width, double height, double aspectRatio) {
// Calculate the aspect ratio of the page
double pageAspectRatio = width / height;

// Compare the page aspect ratio with the common aspect ratio within a threshold
return Math.abs(pageAspectRatio - aspectRatio) <= 0.05;
private boolean isCloseToSize(float width, float height, float standardWidth, float standardHeight) {
float tolerance = 1.0f; // You can adjust the tolerance as needed
return Math.abs(width - standardWidth) <= tolerance && Math.abs(height - standardHeight) <= tolerance;
}



public ObjectNode getDimensionInfo(ObjectNode dimensionInfo, float width, float height) {
float ppi = 72; // Points Per Inch

float widthInInches = width / ppi;
float heightInInches = height / ppi;

float widthInCm = widthInInches * 2.54f;
float heightInCm = heightInInches * 2.54f;

dimensionInfo.put("Width (px)", String.format("%.2f", width));
dimensionInfo.put("Height (px)", String.format("%.2f", height));
dimensionInfo.put("Width (in)", String.format("%.2f", widthInInches));
dimensionInfo.put("Height (in)", String.format("%.2f", heightInInches));
dimensionInfo.put("Width (cm)", String.format("%.2f", widthInCm));
dimensionInfo.put("Height (cm)", String.format("%.2f", heightInCm));
return dimensionInfo;
}



public static boolean checkForStandard(PDDocument document, String standardKeyword) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,16 @@ public String toString() {
public static class Security {
private Boolean enableLogin;
private Boolean csrfDisabled;
private InitialLogin initialLogin;

public InitialLogin getInitialLogin() {
return initialLogin != null ? initialLogin : new InitialLogin();
}

public void setInitialLogin(InitialLogin initialLogin) {
this.initialLogin = initialLogin;
}

public Boolean getEnableLogin() {
return enableLogin;
}
Expand All @@ -125,9 +134,39 @@ public void setCsrfDisabled(Boolean csrfDisabled) {

@Override
public String toString() {
return "Security [enableLogin=" + enableLogin + ", csrfDisabled="
return "Security [enableLogin=" + enableLogin + ", initialLogin=" + initialLogin + ", csrfDisabled="
+ csrfDisabled + "]";
}

public static class InitialLogin {

private String username;
private String password;

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

@Override
public String toString() {
return "InitialLogin [username=" + username + ", password=" + (password != null && !password.isEmpty() ? "MASKED" : "NULL") + "]";
}



}
}

public static class System {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,7 @@ public class MergeMultiplePagesRequest extends PDFFile {
@Schema(description = "The number of pages to fit onto a single sheet in the output PDF.",
type = "integer", allowableValues = {"2", "3", "4", "9", "16"})
private int pagesPerSheet;

@Schema(description = "Boolean for if you wish to add border around the pages")
private boolean addBorder;
}
7 changes: 4 additions & 3 deletions src/main/resources/messages_ar_AR.properties
Original file line number Diff line number Diff line change
Expand Up @@ -478,6 +478,10 @@ pipeline.title=Pipeline
pageLayout.title=Multi Page Layout
pageLayout.header=Multi Page Layout
pageLayout.pagesPerSheet=Pages per sheet:
##########################
### TODO: Translate ###
##########################
pageLayout.addBorder=Add Borders
pageLayout.submit=Submit


Expand Down Expand Up @@ -665,9 +669,6 @@ split.submit=Split
imageToPDF.title=صورة إلى PDF
imageToPDF.header=صورة إلى PDF
imageToPDF.submit=تحول
##########################
### TODO: Translate ###
##########################
imageToPDF.selectLabel=Image Fit Options
imageToPDF.fillPage=Fill Page
imageToPDF.fitDocumentToImage=Fit Page to Image
Expand Down
7 changes: 4 additions & 3 deletions src/main/resources/messages_ca_CA.properties
Original file line number Diff line number Diff line change
Expand Up @@ -478,6 +478,10 @@ pipeline.title=Pipeline
pageLayout.title=Multi Page Layout
pageLayout.header=Multi Page Layout
pageLayout.pagesPerSheet=Pages per sheet:
##########################
### TODO: Translate ###
##########################
pageLayout.addBorder=Add Borders
pageLayout.submit=Submit


Expand Down Expand Up @@ -665,9 +669,6 @@ split.submit=Divideix
imageToPDF.title=Imatge a PDF
imageToPDF.header=Imatge a PDF
imageToPDF.submit=Converteix
##########################
### TODO: Translate ###
##########################
imageToPDF.selectLabel=Image Fit Options
imageToPDF.fillPage=Fill Page
imageToPDF.fitDocumentToImage=Fit Page to Image
Expand Down
Loading

0 comments on commit e0f306d

Please sign in to comment.