Stirling PDF Installation

From the looks of it, everything should be running. Did you see any error message at all? Any indication of what went wrong?

Your last error message shows that the container is already running. It may have been left in a bad state (could be for any number of reasons) you can remove that and try again.

Or just use a different name, for now, just to test things out. Try with this command:

docker run -d \
  --name pdftest \
  -p 8081:8080 \
  -v "./StirlingPDF/trainingData:/usr/share/tessdata" \
  -v "./StirlingPDF/extraConfigs:/configs" \
  -v "./StirlingPDF/customFiles:/customFiles/" \
  -v "./StirlingPDF/logs:/logs/" \
  -v "./StirlingPDF/pipeline:/pipeline/" \
  -e DOCKER_ENABLE_SECURITY=false \
  -e LANGS=en_GB \
  stirlingtools/stirling-pdf:latest

And go to localhost:8081. That's 8081, not 8080.

If it doesn't work, try running this to see the logs of that container:

docker container logs pdftest

I just looked at their pricing, $12 a month equals $144 per year:

With Apryse (formerly Qoppa) pdf Studio Pro 2025 is a one off payment of $149:

What it does:

Master PDF Editor for Linux is even cheaper:

https://store.payproglobal.com/checkout?products[1][id]=23113

I don't think I got any kind of error message, only what is shown in that terminal history.

I tried with that other command and this is what I got back:

admin@user10-ThinkPad-P15-Gen-1:~$ docker run -d
--name pdftest
-p 8081:8080
-v "./StirlingPDF/trainingData:/usr/share/tessdata"
-v "./StirlingPDF/extraConfigs:/configs"
-v "./StirlingPDF/customFiles:/customFiles/"
-v "./StirlingPDF/logs:/logs/"
-v "./StirlingPDF/pipeline:/pipeline/"
-e DOCKER_ENABLE_SECURITY=false
-e LANGS=en_GB
stirlingtools/stirling-pdf:latest
"docker run" requires at least 1 argument.
See 'docker run --help'.

Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

Create and run a new container from an image
-p: command not found
admin@user10-ThinkPad-P15-Gen-1:~$

Went to localhost:8080 and also localhost:8081 and still nothing.

checked the logs and got this:

admin@user10-ThinkPad-P15-Gen-1:~$ docker container logs pdftest
Error response from daemon: No such container: pdftest
admin@user10-ThinkPad-P15-Gen-1:~$

I understand that Stirling PDF is free. They charge for a pro / business version but the only difference is with the paid version you get:

  • Access to support team

  • Advanced SSO

  • Custom metadata handling

  • External Database and load distributing support

Otherwise, you get all the PDF tools in the free version just additional services that are focused on medium to big business.

I don't think any other PDF service has as much as Stirling. Just wish it was easier to install!

My mistake, I edited slightly the code snippet and accidentally deleted one of those \ at the end of each line, which is required when writing multiple lines in the shell.

Try again:

docker run -d \
  --name pdftest \
  -p 8081:8080 \
  -v "./StirlingPDF/trainingData:/usr/share/tessdata" \
  -v "./StirlingPDF/extraConfigs:/configs" \
  -v "./StirlingPDF/customFiles:/customFiles/" \
  -v "./StirlingPDF/logs:/logs/" \
  -v "./StirlingPDF/pipeline:/pipeline/" \
  -e DOCKER_ENABLE_SECURITY=false \
  -e LANGS=en_GB \
  stirlingtools/stirling-pdf:latest
1 Like

Still no good on either 8080 or 8081

admin@user10-ThinkPad-P15-Gen-1:~$ docker run -d \
  --name pdftest \
  -p 8081:8080 \
  -v "./StirlingPDF/trainingData:/usr/share/tessdata" \
  -v "./StirlingPDF/extraConfigs:/configs" \
  -v "./StirlingPDF/customFiles:/customFiles/" \
  -v "./StirlingPDF/logs:/logs/" \
  -v "./StirlingPDF/pipeline:/pipeline/" \
  -e DOCKER_ENABLE_SECURITY=false \
  -e LANGS=en_GB \
  stirlingtools/stirling-pdf:latest
787854d27bededf07b020f73958cf9f4e5566ec82610461848613c9cbde4a48d
admin@user10-ThinkPad-P15-Gen-1:~$ docker container logs pdftest
Copying original files without overwriting existing files
Running Stirling PDF with DOCKER_ENABLE_SECURITY=false and VERSION_TAG=0.41.0
Installing font package: font-noto
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/community/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/edge/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/edge/community/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/edge/testing/x86_64/APKINDEX.tar.gz
(1/4) Installing font-noto-common (24.7.1-r0)
(2/4) Installing font-noto-math (24.7.1-r0)
(3/4) Installing font-noto-symbols (24.7.1-r0)
(4/4) Installing font-noto (24.7.1-r0)
Executing fontconfig-2.15.0-r1.trigger
OK: 1404 MiB in 380 packages
Setting permissions and ownership for necessary directories...
Picked up JAVA_TOOL_OPTIONS: -XX:+UnlockExperimentalVMOptions     -XX:MaxRAMPercentage=75     -XX:InitiatingHeapOccupancyPercent=20     -XX:+G1PeriodicGCInvokesConcurrent     -XX:G1PeriodicGCInterval=10000     -XX:+UseStringDeduplication     -XX:G1PeriodicGCSystemLoadThreshold=70
Standard Commons Logging discovery in action with spring-jcl: please remove commons-logging.jar from classpath in order to avoid potential conflicts
16:10:53.356 [main] INFO  s.s.SPDF.config.ConfigInitializer - No changes detected; settings file left as-is.
16:10:53.365 [main] INFO  s.software.SPDF.SPDFApplication - Settings file: ./configs/settings.yml
 ____ _____ ___ ____  _     ___ _   _  ____       ____  ____  _____
/ ___|_   _|_ _|  _ \| |   |_ _| \ | |/ ___|     |  _ \|  _ \|  ___|
\___ \ | |  | || |_) | |    | ||  \| | |  _ _____| |_) | | | | |_
 ___) || |  | ||  _ <| |___ | || |\  | |_| |_____|  __/| |_| |  _|
|____/ |_| |___|_| \_\_____|___|_| \_|\____|     |_|   |____/|_|
Powered by Spring Boot 3.4.1
16:10:53.813 [main] INFO  s.software.SPDF.SPDFApplication - Starting SPDFApplication v0.41.0 using Java 21.0.6 with PID 10 (/app.jar started by stirlingpdfuser in /)
16:10:53.814 [main] INFO  s.software.SPDF.SPDFApplication - The following 1 profile is active: "default"
Standard Commons Logging discovery in action with spring-jcl: please remove commons-logging.jar from classpath in order to avoid potential conflicts
16:10:56.192 [main] INFO  s.software.SPDF.SPDFApplication - Running configs ApplicationProperties(legal=ApplicationProperties.Legal(termsAndConditions=https://www.stirlingpdf.com/terms-and-conditions, privacyPolicy=https://www.stirlingpdf.com/privacy-policy, accessibilityStatement=, cookiePolicy=, impressum=), security=ApplicationProperties.Security(enableLogin=false, csrfDisabled=false, initialLogin=ApplicationProperties.Security.InitialLogin(username=), oauth2=ApplicationProperties.Security.OAUTH2(enabled=false, issuer=, clientId=, autoCreateUser=true, blockRegistration=false, useAsUsername=email, scopes=[openid, profile, email], provider=google, client=ApplicationProperties.Security.OAUTH2.Client(google=Google [clientId=, clientSecret=NULL, scopes=[https://www.googleapis.com/auth/userinfo.email, https://www.googleapis.com/auth/userinfo.profile], useAsUsername=email], github=GitHub [clientId=, clientSecret=NULL, scopes=[read:user], useAsUsername=login], keycloak=Keycloak [issuer=, clientId=, clientSecret=NULL, scopes=[openid, profile, email], useAsUsername=preferred_username])), saml2=ApplicationProperties.Security.SAML2(enabled=false, autoCreateUser=true, blockRegistration=false, registrationId=stirling, idpSingleLogoutUrl=https://dev-XXXXXXXX.okta.com/app/dev-XXXXXXXX_stirlingpdf_1/externalKey/slo/saml, idpSingleLoginUrl=https://dev-XXXXXXXX.okta.com/app/dev-XXXXXXXX_stirlingpdf_1/externalKey/sso/saml, idpIssuer=http://www.okta.com/externalKey, idpCert=class path resource [okta.crt]), loginAttemptCount=5, loginResetTimeMinutes=120, loginMethod=all, customGlobalAPIKey=null), system=ApplicationProperties.System(defaultLocale=en-US, googlevisibility=false, showUpdate=false, showUpdateOnlyAdmin=false, customHTMLFiles=false, tessdataDir=/usr/share/tessdata, enableAlphaFunctionality=false, enableAnalytics=true, datasource=ApplicationProperties.Datasource(enableCustomDatabase=false, customDatabaseUrl=, type=postgresql, hostName=localhost, port=5432, name=postgres, username=postgres), disableSanitize=false), ui=ApplicationProperties.Ui(appName=null, homeDescription=null, appNameNavbar=null, languages=[]), endpoints=ApplicationProperties.Endpoints(toRemove=[], groupsToRemove=[]), metrics=ApplicationProperties.Metrics(enabled=true), automaticallyGenerated=ApplicationProperties.AutomaticallyGenerated(UUID=d76378ea-15c2-4069-91e0-70081a35280f, appVersion=0.41.0), enterpriseEdition=ApplicationProperties.EnterpriseEdition(enabled=false, maxUsers=0, ssoAutoLogin=false, customMetadata=ApplicationProperties.EnterpriseEdition.CustomMetadata(autoUpdateMetadata=false, author=username, creator=Stirling-PDF, producer=Stirling-PDF)), autoPipeline=ApplicationProperties.AutoPipeline(outputFolder=null), processExecutor=ApplicationProperties.ProcessExecutor(sessionLimit=ApplicationProperties.ProcessExecutor.SessionLimit(libreOfficeSessionLimit=1, pdfToHtmlSessionLimit=1, pythonOpenCvSessionLimit=8, weasyPrintSessionLimit=16, installAppSessionLimit=1, calibreSessionLimit=1, qpdfSessionLimit=4, tesseractSessionLimit=1), timeoutMinutes=ApplicationProperties.ProcessExecutor.TimeoutMinutes(libreOfficeTimeoutMinutes=30, pdfToHtmlTimeoutMinutes=20, pythonOpenCvTimeoutMinutes=30, weasyPrintTimeoutMinutes=30, installAppTimeoutMinutes=60, calibreTimeoutMinutes=30, tesseractTimeoutMinutes=30, qpdfTimeoutMinutes=30)))
16:10:56.896 [main] INFO  s.s.S.config.EndpointConfiguration - Total disabled endpoints: 2. Disabled endpoints: book-to-pdf, pdf-to-book
16:10:56.901 [main] INFO  s.software.SPDF.utils.GeneralUtils - No changes for 'AutomaticallyGenerated.appVersion' (already set to '0.41.0').
16:10:58.796 [main] INFO  s.software.SPDF.SPDFApplication - Started SPDFApplication in 5.428 seconds (process running for 6.274)
16:10:58.800 [scheduling-1] WARN  s.software.SPDF.utils.FileMonitor - not monitoring any directory, even the root directory itself: ./pipeline/watchedFolders
16:10:58.801 [scheduling-1] INFO  s.software.SPDF.utils.FileMonitor - Registered directory: ./pipeline/watchedFolders
16:10:58.806 [main] INFO  s.software.SPDF.SPDFApplication - Stirling-PDF Started.
16:10:58.806 [main] INFO  s.software.SPDF.SPDFApplication - Navigate to http://localhost:8080
admin@user10-ThinkPad-P15-Gen-1:~$

Please run:

docker container ls -a

to show all the created containers and some additional information. I'm particularly interested in the status column, to see if the container failed for some reason, and also the ports.

admin@user10-ThinkPad-P15-Gen-1:~$ docker container ls -a
CONTAINER ID   IMAGE                               COMMAND                  CREATED       STATUS                    PORTS                                         NAMES
787854d27bed   stirlingtools/stirling-pdf:latest   "tini -- /scripts/in…"   3 hours ago   Up 3 hours                0.0.0.0:8081->8080/tcp, [::]:8081->8080/tcp   pdftest
2f2338eb2fa9   stirlingtools/stirling-pdf:latest   "tini -- /scripts/in…"   2 days ago    Exited (143) 2 days ago                                                 stirling-pdf
39f3dd84a683   hello-world                         "/hello"                 6 days ago    Exited (0) 6 days ago                                                   amazing_raman
2eb158ee19e9   louislam/dockge:1                   "/usr/bin/dumb-init …"   10 days ago   Up 6 hours (healthy)      0.0.0.0:5001->5001/tcp, :::5001->5001/tcp     dockge-dockge-1
6daf7c0119d3   hello-world                         "/hello"                 10 days ago   Exited (0) 10 days ago                                                  magical_ganguly
12c58a0e66eb   hello-world                         "/hello"                 10 days ago   Exited (0) 10 days ago                                                  elastic_kepler
admin@user10-ThinkPad-P15-Gen-1:~$

might be easier to read:

1 Like

Ok, so that definitely shows that the container is up and running. Can you by any chance use another browser? I've had some troubles with Brave myself when accessing localhost... I'll try in a bit to install this myself on my end and see if I can make it run.

It is, thanks :smiley: you can wrap text within triple backticks as well, that's how I've been editing your posts. See:

1 Like

ok! I'll try give that a go next time!

Just tried:

localhost:8080 and 8081 in firefox and also mullvad browser and still no good

Im assuming my using a VPN wouldn't have anything to do with this?

No, the VPN doesn't matter in this case since it's a local connection. Make sure however that you're not using https with localhost. Most browsers use that by default, but in this case it's a local connection to your own computer so there's no risk. So, try typing it out entirely: http://localhost:8081.

pdf studio free and pro comparison page:

https://www.qoppa.com/files/pdfstudio/buy/compare_studios.html

Master PDF free and paid for comparison page:

nope. still no good.

yeah, i've used both. the free versions are very limited. Master PDF puts a watermark across most of the free tools it offers. I also don't think they offer quite as much as Stirling even in the paid for versions.

Let's try with: http://127.0.0.1:8081 that's the designated IP address for localhost.

If this works, then maybe the VPN is interfering after all. Otherwise, let's see if there's anything new in the logs right after you try to connect:

docker container logs pdftest

And if not, well, let me give it a try I just have a slow connection and I'm downloading something else at the moment.

So, everything seems to work fine for me right now...

The only thing that I can think of that may be causing issues is with the location of the folders that are required for things to run properly. That would be the ones created with this command:

mkdir -p StirlingPDF/{trainingData,extraConfigs,customFiles,logs,pipeline}

Did you use a specific location other than your main home folder? If yes, you would need to specify the proper location accordingly when running the container. So, let's retrace our steps a bit:

  1. To start fresh, stop the container and remove unused containers:

    docker container stop pdftest
    docker container prune
    
  2. Verify the location of the necessary folders as mentioned above. This one is probably done easier by just browsing using the file manager, but for completeness this is how you'd do it using a command on the terminal:

    find $HOME -type d -iname "stirling*"
    

    This should return something like /home/zenzen/StirlingPDF. This is what I suspect may be different in your case, so make sure to make a note of it.

  3. In fact, to be completely on the safe side, delete all those folders and re-create them again. Sometimes, Docker containers leave files behind that may be responsible for a bad state that prevents them from starting up correctly.

  4. Run the container again using the full path to this folder (whatever it came back with in the previous step):

    docker run -d \
     --name stirling-pdf \
     -p 8080:8080 \
     -v "/home/zenzen/StirlingPDF/trainingData:/usr/share/tessdata" \
     -v "/home/zenzen/StirlingPDF/extraConfigs:/configs" \
     -v "/home/zenzen/StirlingPDF/customFiles:/customFiles/" \
     -v "/home/zenzen/StirlingPDF/logs:/logs/" \
     -v "/home/zenzen/StirlingPDF/pipeline:/pipeline/" \
     -e DOCKER_ENABLE_SECURITY=false \
     -e LANGS=en_GB \
     stirlingtools/stirling-pdf:latest
    

    I think at this point you are familiar enough with Docker to know what the --nameand -p flags mean. Feel free to use whatever values make more sense for you.

You should see:

admin@user10-ThinkPad-P15-Gen-1:~$ docker container logs pdftest
Copying original files without overwriting existing files
Running Stirling PDF with DOCKER_ENABLE_SECURITY=false and VERSION_TAG=0.41.0
Installing font package: font-noto
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/community/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/edge/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/edge/community/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/edge/testing/x86_64/APKINDEX.tar.gz
(1/4) Installing font-noto-common (24.7.1-r0)
(2/4) Installing font-noto-math (24.7.1-r0)
(3/4) Installing font-noto-symbols (24.7.1-r0)
(4/4) Installing font-noto (24.7.1-r0)
Executing fontconfig-2.15.0-r1.trigger
OK: 1404 MiB in 380 packages
Setting permissions and ownership for necessary directories...
Picked up JAVA_TOOL_OPTIONS: -XX:+UnlockExperimentalVMOptions     -XX:MaxRAMPercentage=75     -XX:InitiatingHeapOccupancyPercent=20     -XX:+G1PeriodicGCInvokesConcurrent     -XX:G1PeriodicGCInterval=10000     -XX:+UseStringDeduplication     -XX:G1PeriodicGCSystemLoadThreshold=70
Standard Commons Logging discovery in action with spring-jcl: please remove commons-logging.jar from classpath in order to avoid potential conflicts
16:10:53.356 [main] INFO  s.s.SPDF.config.ConfigInitializer - No changes detected; settings file left as-is.
16:10:53.365 [main] INFO  s.software.SPDF.SPDFApplication - Settings file: ./configs/settings.yml
 ____ _____ ___ ____  _     ___ _   _  ____       ____  ____  _____
/ ___|_   _|_ _|  _ \| |   |_ _| \ | |/ ___|     |  _ \|  _ \|  ___|
\___ \ | |  | || |_) | |    | ||  \| | |  _ _____| |_) | | | | |_
 ___) || |  | ||  _ <| |___ | || |\  | |_| |_____|  __/| |_| |  _|
|____/ |_| |___|_| \_\_____|___|_| \_|\____|     |_|   |____/|_|
Powered by Spring Boot 3.4.1
16:10:53.813 [main] INFO  s.software.SPDF.SPDFApplication - Starting SPDFApplication v0.41.0 using Java 21.0.6 with PID 10 (/app.jar started by stirlingpdfuser in /)
16:10:53.814 [main] INFO  s.software.SPDF.SPDFApplication - The following 1 profile is active: "default"
Standard Commons Logging discovery in action with spring-jcl: please remove commons-logging.jar from classpath in order to avoid potential conflicts
16:10:56.192 [main] INFO  s.software.SPDF.SPDFApplication - Running configs ApplicationProperties(legal=ApplicationProperties.Legal(termsAndConditions=https://www.stirlingpdf.com/terms-and-conditions, privacyPolicy=https://www.stirlingpdf.com/privacy-policy, accessibilityStatement=, cookiePolicy=, impressum=), security=ApplicationProperties.Security(enableLogin=false, csrfDisabled=false, initialLogin=ApplicationProperties.Security.InitialLogin(username=), oauth2=ApplicationProperties.Security.OAUTH2(enabled=false, issuer=, clientId=, autoCreateUser=true, blockRegistration=false, useAsUsername=email, scopes=[openid, profile, email], provider=google, client=ApplicationProperties.Security.OAUTH2.Client(google=Google [clientId=, clientSecret=NULL, scopes=[https://www.googleapis.com/auth/userinfo.email, https://www.googleapis.com/auth/userinfo.profile], useAsUsername=email], github=GitHub [clientId=, clientSecret=NULL, scopes=[read:user], useAsUsername=login], keycloak=Keycloak [issuer=, clientId=, clientSecret=NULL, scopes=[openid, profile, email], useAsUsername=preferred_username])), saml2=ApplicationProperties.Security.SAML2(enabled=false, autoCreateUser=true, blockRegistration=false, registrationId=stirling, idpSingleLogoutUrl=https://dev-XXXXXXXX.okta.com/app/dev-XXXXXXXX_stirlingpdf_1/externalKey/slo/saml, idpSingleLoginUrl=https://dev-XXXXXXXX.okta.com/app/dev-XXXXXXXX_stirlingpdf_1/externalKey/sso/saml, idpIssuer=http://www.okta.com/externalKey, idpCert=class path resource [okta.crt]), loginAttemptCount=5, loginResetTimeMinutes=120, loginMethod=all, customGlobalAPIKey=null), system=ApplicationProperties.System(defaultLocale=en-US, googlevisibility=false, showUpdate=false, showUpdateOnlyAdmin=false, customHTMLFiles=false, tessdataDir=/usr/share/tessdata, enableAlphaFunctionality=false, enableAnalytics=true, datasource=ApplicationProperties.Datasource(enableCustomDatabase=false, customDatabaseUrl=, type=postgresql, hostName=localhost, port=5432, name=postgres, username=postgres), disableSanitize=false), ui=ApplicationProperties.Ui(appName=null, homeDescription=null, appNameNavbar=null, languages=[]), endpoints=ApplicationProperties.Endpoints(toRemove=[], groupsToRemove=[]), metrics=ApplicationProperties.Metrics(enabled=true), automaticallyGenerated=ApplicationProperties.AutomaticallyGenerated(UUID=d76378ea-15c2-4069-91e0-70081a35280f, appVersion=0.41.0), enterpriseEdition=ApplicationProperties.EnterpriseEdition(enabled=false, maxUsers=0, ssoAutoLogin=false, customMetadata=ApplicationProperties.EnterpriseEdition.CustomMetadata(autoUpdateMetadata=false, author=username, creator=Stirling-PDF, producer=Stirling-PDF)), autoPipeline=ApplicationProperties.AutoPipeline(outputFolder=null), processExecutor=ApplicationProperties.ProcessExecutor(sessionLimit=ApplicationProperties.ProcessExecutor.SessionLimit(libreOfficeSessionLimit=1, pdfToHtmlSessionLimit=1, pythonOpenCvSessionLimit=8, weasyPrintSessionLimit=16, installAppSessionLimit=1, calibreSessionLimit=1, qpdfSessionLimit=4, tesseractSessionLimit=1), timeoutMinutes=ApplicationProperties.ProcessExecutor.TimeoutMinutes(libreOfficeTimeoutMinutes=30, pdfToHtmlTimeoutMinutes=20, pythonOpenCvTimeoutMinutes=30, weasyPrintTimeoutMinutes=30, installAppTimeoutMinutes=60, calibreTimeoutMinutes=30, tesseractTimeoutMinutes=30, qpdfTimeoutMinutes=30)))
16:10:56.896 [main] INFO  s.s.S.config.EndpointConfiguration - Total disabled endpoints: 2. Disabled endpoints: book-to-pdf, pdf-to-book
16:10:56.901 [main] INFO  s.software.SPDF.utils.GeneralUtils - No changes for 'AutomaticallyGenerated.appVersion' (already set to '0.41.0').
16:10:58.796 [main] INFO  s.software.SPDF.SPDFApplication - Started SPDFApplication in 5.428 seconds (process running for 6.274)
16:10:58.800 [scheduling-1] WARN  s.software.SPDF.utils.FileMonitor - not monitoring any directory, even the root directory itself: ./pipeline/watchedFolders
16:10:58.801 [scheduling-1] INFO  s.software.SPDF.utils.FileMonitor - Registered directory: ./pipeline/watchedFolders
16:10:58.806 [main] INFO  s.software.SPDF.SPDFApplication - Stirling-PDF Started.
16:10:58.806 [main] INFO  s.software.SPDF.SPDFApplication - Navigate to http://localhost:8080