lab

s-pdf (latest)

Published 2026-03-25 11:48:00 +00:00 by myve

Installation

docker pull hub.myvelabs.com/lab/s-pdf:latest
sha256:407cac79fe43a8c8643a0a407ded855ff4bfb5201163b2bef1c0e728f389edb0

About this package

#1 PDF Application on GitHub that lets you edit PDFs on any device anywhere

Image layers

ARG RELEASE
ARG LAUNCHPAD_BUILD_ARCH
LABEL org.opencontainers.image.ref.name=ubuntu
LABEL org.opencontainers.image.version=24.04
ADD file:3f78aa860931e0853077f09eb31eddbeeef8a9dd70977305b4876aa176770721 in /
CMD ["/bin/bash"]
ENV JAVA_HOME=/opt/java/openjdk
ENV PATH=/opt/java/openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ENV LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8
RUN /bin/sh -c set -eux; apt-get update; DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends fontconfig ca-certificates p11-kit tzdata locales ; echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen; locale-gen en_US.UTF-8; rm -rf /var/lib/apt/lists/* # buildkit
ENV JAVA_VERSION=jdk-25.0.2+10
RUN /bin/sh -c set -eux; ARCH="$(dpkg --print-architecture)"; case "${ARCH}" in amd64) ESUM='d6c89e08f42be94cd55eab20190958a35b993625018a3ac59cb3d16d8445cf98'; BINARY_URL='https://github.com/adoptium/temurin25-binaries/releases/download/jdk-25.0.2%2B10/OpenJDK25U-jre_x64_linux_hotspot_25.0.2_10.tar.gz'; ;; arm64) ESUM='e90ad4a618a0228a2126e7c6abfbc0729e2649d7d72cef45fd640239866eb050'; BINARY_URL='https://github.com/adoptium/temurin25-binaries/releases/download/jdk-25.0.2%2B10/OpenJDK25U-jre_aarch64_linux_hotspot_25.0.2_10.tar.gz'; ;; ppc64el) ESUM='1cc773ab86cbdbb02732398ad4550950db859fb08f8eb6548c8c5e188f697455'; BINARY_URL='https://github.com/adoptium/temurin25-binaries/releases/download/jdk-25.0.2%2B10/OpenJDK25U-jre_ppc64le_linux_hotspot_25.0.2_10.tar.gz'; ;; riscv64) ESUM='0be0aa0a9578d229c2de2e9e05741d1c0726185a2017f8ce2249989f79dc9562'; BINARY_URL='https://github.com/adoptium/temurin25-binaries/releases/download/jdk-25.0.2%2B10/OpenJDK25U-jre_riscv64_linux_hotspot_25.0.2_10.tar.gz'; ;; s390x) ESUM='ccb977223490643318230b53107aaa23c136d2793b5174dc38d4b0daab9a18e3'; BINARY_URL='https://github.com/adoptium/temurin25-binaries/releases/download/jdk-25.0.2%2B10/OpenJDK25U-jre_s390x_linux_hotspot_25.0.2_10.tar.gz'; ;; *) echo "Unsupported arch: ${ARCH}"; exit 1; ;; esac; savedAptMark="$(apt-mark showmanual)"; apt-get update; apt-get install -y --no-install-recommends wget gnupg; wget --progress=dot:giga -O /tmp/openjdk.tar.gz ${BINARY_URL}; wget --progress=dot:giga -O /tmp/openjdk.tar.gz.sig ${BINARY_URL}.sig; export GNUPGHOME="$(mktemp -d)"; gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 3B04D753C9050D9A5D343F39843C48A565F8F04B; gpg --batch --verify /tmp/openjdk.tar.gz.sig /tmp/openjdk.tar.gz; rm -rf "${GNUPGHOME}" /tmp/openjdk.tar.gz.sig; echo "${ESUM} */tmp/openjdk.tar.gz" | sha256sum -c -; mkdir -p "$JAVA_HOME"; tar --extract --file /tmp/openjdk.tar.gz --directory "$JAVA_HOME" --strip-components 1 --no-same-owner ; rm -f /tmp/openjdk.tar.gz; apt-mark auto '.*' > /dev/null; apt-mark manual $savedAptMark > /dev/null; apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; rm -rf /var/lib/apt/lists/*; find "$JAVA_HOME/lib" -name '*.so' -exec dirname '{}' ';' | sort -u > /etc/ld.so.conf.d/docker-openjdk.conf; ldconfig; java -Xshare:dump; # buildkit
RUN /bin/sh -c set -eux; echo "Verifying install ..."; echo "java --version"; java --version; echo "Complete." # buildkit
COPY --chmod=755 entrypoint.sh /__cacert_entrypoint.sh # buildkit
ENTRYPOINT ["/__cacert_entrypoint.sh"]
SHELL [/bin/bash -o pipefail -c]
ENV DEBIAN_FRONTEND=noninteractive LANG=C.UTF-8 LC_ALL=C.UTF-8 TESS_BASE_PATH=/usr/share/tesseract-ocr/5/tessdata
ARG UNOSERVER_VERSION=3.6
RUN |1 UNOSERVER_VERSION=3.6 /bin/bash -o pipefail -c set -eux; apt-get update; apt-get install -y --no-install-recommends software-properties-common; add-apt-repository -y ppa:libreoffice/ppa; apt-get update; apt-get install -y --no-install-recommends ca-certificates tzdata tini bash fontconfig curl ffmpeg poppler-utils fontforge gosu unpaper fonts-dejavu fonts-liberation2 fonts-crosextra-caladea fonts-crosextra-carlito fonts-noto-core fonts-noto-mono fonts-noto-extra fonts-noto-cjk poppler-data python3 python3-uno tesseract-ocr tesseract-ocr-eng tesseract-ocr-deu tesseract-ocr-fra tesseract-ocr-por tesseract-ocr-chi-sim tesseract-ocr-osd libcairo2 libpango-1.0-0 libpangoft2-1.0-0 libgdk-pixbuf-2.0-0 libfreetype6 libfontconfig1 libx11-6 libxt6 libxext6 libxrender1 libxtst6 libxi6 libxinerama1 libxkbcommon0 libsm6 libice6 libegl1 libgl1 libopengl0 libdbus-1-3 libglib2.0-0 libnss3 libasound2t64 libxcomposite1 libxrandr2 xvfb x11-utils coreutils libreoffice-writer-nogui libreoffice-calc-nogui libreoffice-impress-nogui libreoffice-draw-nogui libreoffice-java-common ; libreoffice --version; soffice --version 2>/dev/null || true; /usr/lib/libreoffice/program/soffice.bin --headless --convert-to pdf /dev/null 2>/dev/null || true; fc-cache -f -v 2>&1 | awk 'NR <= 20'; apt-get remove --purge -y software-properties-common || true; apt-get autoremove --purge -y || true; rm -rf /var/lib/apt/lists/*; rm -rf /usr/share/doc/* /usr/share/man/* /usr/share/info/* /usr/share/lintian/* /usr/share/linda/* /usr/share/icons/* /usr/share/themes/* /usr/share/javascript/* /usr/share/gtk-3.0/* /usr/share/fontforge/pixmaps /usr/share/fontforge/osx /usr/share/fontforge/cidmap /usr/share/fontforge/prefs /usr/share/liblangtag/* /usr/share/tcltk/* /usr/share/python-wheels/* /usr/share/glib-2.0/schemas/* /usr/share/mime/* /usr/share/xml/iso-codes /usr/share/GConf /usr/share/bash-completion /usr/share/zsh /usr/share/libmysofa /usr/share/alsa /usr/share/iso-codes /usr/share/perl5 /usr/share/libthai /usr/share/libexttextcat /usr/share/openal /usr/share/gcc; find /usr/share/locale -mindepth 1 -maxdepth 1 -type d ! -name 'en*' -exec rm -rf {} + 2>/dev/null || true; rm -rf /usr/share/i18n/locales /usr/share/i18n/charmaps; rm -rf /usr/lib/libreoffice/share/gallery /usr/lib/libreoffice/share/template /usr/lib/libreoffice/share/wizards /usr/lib/libreoffice/share/autotext /usr/lib/libreoffice/help /usr/lib/libreoffice/share/config/images_*.zip /usr/lib/libreoffice/share/basic /usr/lib/libreoffice/share/Scripts /usr/lib/libreoffice/share/autocorr /usr/lib/libreoffice/share/classification /usr/lib/libreoffice/share/wordbook /usr/lib/libreoffice/share/fingerprint /usr/lib/libreoffice/share/xdg /usr/lib/libreoffice/share/numbertext /usr/lib/libreoffice/share/shell /usr/lib/libreoffice/share/palette /usr/lib/libreoffice/share/theme_definitions /usr/lib/libreoffice/share/xslt /usr/lib/libreoffice/share/labels /usr/lib/libreoffice/share/dtd /usr/lib/libreoffice/share/tipoftheday /usr/lib/libreoffice/share/toolbarmode /usr/lib/libreoffice/share/psprint /usr/lib/libreoffice/CREDITS.fodt /usr/lib/libreoffice/LICENSE.html; rm -rf /usr/lib/libreoffice/share/extensions/wiki-publisher /usr/lib/libreoffice/share/extensions/nlpsolver /usr/lib/libreoffice/share/extensions/dict-* 2>/dev/null || true; rm -rf /usr/lib/libreoffice/program/libdba* /usr/lib/libreoffice/program/libdbahsql* /usr/lib/libreoffice/program/libdbu* /usr/lib/libreoffice/program/libreport* 2>/dev/null || true; rm -rf /usr/lib/python3.12/test /usr/lib/python3.12/idlelib /usr/lib/python3.12/tkinter /usr/lib/python3.12/lib2to3 /usr/lib/python3.12/pydoc_data; rm -rf /usr/lib/python3/dist-packages/scipy /usr/lib/python3/dist-packages/sympy /usr/lib/python3/dist-packages/mpmath; rm -rf /usr/lib/python3/dist-packages/cffi /usr/lib/python3/dist-packages/cffi-*.dist-info /usr/lib/python3/dist-packages/_cffi_backend*.so /usr/lib/python3/dist-packages/_cffi_backend*.cpython*.so 2>/dev/null || true; find /usr/lib -name '*.so*' -type f -not -path '*/jvm/*' -not -path '*/libreoffice/*' -exec strip --strip-unneeded {} + 2>/dev/null || true; MULTIARCH_LIBDIR=$(dpkg-architecture -qDEB_HOST_MULTIARCH 2>/dev/null || find /usr/lib -maxdepth 1 -type d -name '*-linux-gnu' | head -1); rm -f "${MULTIARCH_LIBDIR}"/libLLVM*.so* "${MULTIARCH_LIBDIR}"/libgallium*.so* 2>/dev/null || true; find /usr/lib/python3* -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true; find /usr/lib/python3* \( -name '*.pyc' -o -name '*.pyi' \) -delete 2>/dev/null || true; rm -rf /usr/share/bug /usr/share/lintian /usr/share/linda /var/log/dpkg.log /var/log/apt/* /usr/local/share/ghostscript/*/doc /usr/local/share/ghostscript/*/examples /usr/share/ImageMagick-*/doc /usr/share/ImageMagick-*/www; rm -rf /usr/share/tesseract-ocr/*/tessdata/tessconfigs; find /usr/share/fonts/truetype/noto -type f ! -name '*Regular*' -delete 2>/dev/null || true; find /usr/share/fonts/opentype -type f ! -name '*Regular*' -delete 2>/dev/null || true; find /usr/share/fonts/truetype -name '*DejaVu*' ! -name '*-Regular*' ! -name '*-Bold*' ! -name '*Bold.ttf' ! -name 'DejaVuSans.ttf' ! -name 'DejaVuSerif.ttf' ! -name 'DejaVuSansMono.ttf' -type f -delete 2>/dev/null || true; find /usr/share/fonts -type d -empty -delete 2>/dev/null || true; GCONV_DIR=$(find /usr/lib -type d -name gconv 2>/dev/null | head -1); if [ -n "$GCONV_DIR" ] && [ -d "$GCONV_DIR" ]; then mkdir -p /tmp/gconv-keep; for mod in UTF-8.so UTF-16.so UTF-32.so UTF-7.so ISO8859-1.so ISO8859-15.so ISO8859-2.so ISO8859-9.so UNICODE.so CP1252.so CP1251.so CP1250.so EUC-JP.so EUC-KR.so EUC-CN.so SHIFT_JIS.so GB18030.so BIG5.so gconv-modules gconv-modules.d gconv-modules.cache; do [ -e "$GCONV_DIR/$mod" ] && cp -a "$GCONV_DIR/$mod" /tmp/gconv-keep/ 2>/dev/null || true; done; rm -rf "$GCONV_DIR"/*; cp -a /tmp/gconv-keep/* "$GCONV_DIR/" 2>/dev/null || true; rm -rf /tmp/gconv-keep; fi; rm -rf /var/lib/dpkg/info/*.list /var/lib/dpkg/info/*.md5sums /var/lib/dpkg/info/*.conffiles /var/lib/dpkg/info/*.postinst /var/lib/dpkg/info/*.preinst /var/lib/dpkg/info/*.prerm /var/lib/dpkg/info/*.postrm /var/lib/dpkg/info/*.triggers /var/lib/dpkg/info/*.shlibs /var/lib/dpkg/info/*.symbols /var/lib/dpkg/info/*.templates; rm -rf /var/cache/fontconfig/* /tmp/* # buildkit
COPY /opt/calibre /opt/calibre # buildkit
COPY /usr/local/bin/qpdf /usr/bin/qpdf # buildkit
COPY /magick-export/ / # buildkit
COPY /usr/local/bin/gs /usr/local/bin/gs # buildkit
COPY /usr/local/share/ghostscript /usr/local/share/ghostscript # buildkit
COPY /opt/venv /opt/venv # buildkit
RUN |1 UNOSERVER_VERSION=3.6 /bin/bash -o pipefail -c ldconfig /usr/local/lib && PYTHONDONTWRITEBYTECODE=1 /opt/venv/bin/python -c "import cffi; print('cffi OK:', cffi.__version__)" && PYTHONDONTWRITEBYTECODE=1 /opt/venv/bin/python -c "import cv2; print('OpenCV', cv2.__version__)" && PYTHONDONTWRITEBYTECODE=1 /opt/venv/bin/python -c "import ocrmypdf; print('ocrmypdf OK')" && find /opt/venv -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true # buildkit
ARG PUID=1000
ARG PGID=1000
RUN |3 UNOSERVER_VERSION=3.6 PUID=1000 PGID=1000 /bin/bash -o pipefail -c set -eux; if ! getent group stirlingpdfgroup >/dev/null 2>&1; then groupadd -g "${PGID}" stirlingpdfgroup 2>/dev/null || groupadd stirlingpdfgroup; fi; if ! id -u stirlingpdfuser >/dev/null 2>&1; then useradd -m -u "${PUID}" -g stirlingpdfgroup -d /home/stirlingpdfuser -s /bin/bash stirlingpdfuser 2>/dev/null || useradd -m -g stirlingpdfgroup -d /home/stirlingpdfuser -s /bin/bash stirlingpdfuser; fi; ln -sf /usr/sbin/gosu /usr/local/bin/su-exec # buildkit
WORKDIR /app
COPY --chown=1000:1000 /layers/dependencies/ /app/ # buildkit
COPY --chown=1000:1000 /layers/spring-boot-loader/ /app/ # buildkit
COPY --chown=1000:1000 /layers/snapshot-dependencies/ /app/ # buildkit
COPY --chown=1000:1000 /layers/application/ /app/ # buildkit
COPY --chown=1000:1000 /app/build/libs/restart-helper.jar /restart-helper.jar # buildkit
COPY --chown=1000:1000 scripts/ /scripts/ # buildkit
COPY app/core/src/main/resources/static/fonts/*.ttf /usr/share/fonts/truetype/ # buildkit
RUN |3 UNOSERVER_VERSION=3.6 PUID=1000 PGID=1000 /bin/bash -o pipefail -c set -eux; ln -sf /opt/calibre/ebook-convert /usr/bin/ebook-convert; ln -sf /opt/venv/bin/unoconvert /usr/local/bin/unoconvert; ln -sf /opt/venv/bin/unoserver /usr/local/bin/unoserver; ln -sf /opt/venv/bin/ocrmypdf /usr/local/bin/ocrmypdf; ln -sf /opt/venv/bin/weasyprint /usr/local/bin/weasyprint; ln -sf /opt/venv/bin/unoping /usr/local/bin/unoping; chmod +x /scripts/*; mkdir -p /configs /configs/cache /configs/heap_dumps /logs /customFiles /pipeline/watchedFolders /pipeline/finishedFolders /tmp/stirling-pdf/heap_dumps; ln -s /logs /app/logs; ln -s /configs /app/configs; ln -s /customFiles /app/customFiles; ln -s /pipeline /app/pipeline; chown -R stirlingpdfuser:stirlingpdfgroup /home/stirlingpdfuser /configs /logs /customFiles /pipeline /tmp/stirling-pdf; chown -h stirlingpdfuser:stirlingpdfgroup /app/logs /app/configs /app/customFiles /app/pipeline; chown stirlingpdfuser:stirlingpdfgroup /app; chmod 750 /tmp/stirling-pdf; chmod 750 /tmp/stirling-pdf/heap_dumps; fc-cache -f # buildkit
ARG VERSION_TAG=2.8.0
RUN |4 UNOSERVER_VERSION=3.6 PUID=1000 PGID=1000 VERSION_TAG=2.8.0 /bin/bash -o pipefail -c echo "${VERSION_TAG:-dev}" > /etc/stirling_version # buildkit
ENV VERSION_TAG=2.8.0 STIRLING_AOT_ENABLE=false STIRLING_JVM_PROFILE=balanced _JVM_OPTS_BALANCED=-XX:+ExitOnOutOfMemoryError -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/configs/heap_dumps -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1HeapRegionSize=4m -XX:G1PeriodicGCInterval=60000 -XX:+UseStringDeduplication -XX:+UseCompactObjectHeaders -XX:+ExplicitGCInvokesConcurrent -Dspring.threads.virtual.enabled=true -Djava.awt.headless=true _JVM_OPTS_PERFORMANCE=-XX:+ExitOnOutOfMemoryError -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/configs/heap_dumps -XX:+UseShenandoahGC -XX:ShenandoahGCMode=generational -XX:+UseCompactObjectHeaders -XX:+UseStringDeduplication -XX:+AlwaysPreTouch -XX:+ExplicitGCInvokesConcurrent -Dspring.threads.virtual.enabled=true -Djava.awt.headless=true JAVA_CUSTOM_OPTS= HOME=/home/stirlingpdfuser PUID=1000 PGID=1000 UMASK=022 PATH=/opt/venv/bin:/opt/java/openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin UNO_PATH=/usr/lib/libreoffice/program LIBREOFFICE_BIN_PATH=/usr/lib/libreoffice/program/soffice.bin STIRLING_TEMPFILES_DIRECTORY=/tmp/stirling-pdf TMPDIR=/tmp/stirling-pdf TEMP=/tmp/stirling-pdf TMP=/tmp/stirling-pdf QTWEBENGINE_CHROMIUM_FLAGS=--no-sandbox --disable-gpu --disable-software-rasterizer DBUS_SESSION_BUS_ADDRESS=/dev/null
LABEL org.opencontainers.image.title=Stirling-PDF org.opencontainers.image.description=Full version with Calibre, LibreOffice, Tesseract, OCRmyPDF org.opencontainers.image.source=https://github.com/Stirling-Tools/Stirling-PDF org.opencontainers.image.licenses=MIT org.opencontainers.image.vendor=Stirling-Tools org.opencontainers.image.url=https://www.stirlingpdf.com org.opencontainers.image.documentation=https://docs.stirlingpdf.com maintainer=Stirling-Tools org.opencontainers.image.authors=Stirling-Tools org.opencontainers.image.version=2.8.0 org.opencontainers.image.keywords=PDF, manipulation, API, Spring Boot, React
EXPOSE [8080/tcp]
STOPSIGNAL SIGTERM
HEALTHCHECK &{["CMD-SHELL" "curl -fs --max-time 10 http://localhost:8080/api/v1/info/status || exit 1"] "30s" "15s" "2m0s" "0s" '\x05'}
ENTRYPOINT ["tini" "--" "/scripts/init.sh"]
CMD []

Labels

Key Value
maintainer Stirling-Tools
org.opencontainers.image.authors Stirling-Tools
org.opencontainers.image.created 2026-03-24T19:47:31.667Z
org.opencontainers.image.description #1 PDF Application on GitHub that lets you edit PDFs on any device anywhere
org.opencontainers.image.documentation https://docs.stirlingpdf.com
org.opencontainers.image.keywords PDF, manipulation, API, Spring Boot, React
org.opencontainers.image.licenses NOASSERTION
org.opencontainers.image.ref.name ubuntu
org.opencontainers.image.revision 47cad0a131f3187b13db2b0661666d574a572cab
org.opencontainers.image.source https://github.com/Stirling-Tools/Stirling-PDF
org.opencontainers.image.title Stirling-PDF
org.opencontainers.image.url https://github.com/Stirling-Tools/Stirling-PDF
org.opencontainers.image.vendor Stirling-Tools
org.opencontainers.image.version 2.8.0
Details
Container
2026-03-25 11:48:00 +00:00
28
OCI / Docker
linux/amd64
Stirling-Tools
NOASSERTION
977 MiB
Versions (1) View all
latest 2026-03-25