<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Pdf – Serverküche</title><link>https://serverkueche.de/tags/pdf/</link><description>Pdf – Neueste Beiträge von Serverküche</description><generator>Hugo</generator><language>de-DE</language><managingEditor>feedback@serverkueche.de (Serverküche)</managingEditor><webMaster>feedback@serverkueche.de (Serverküche)</webMaster><copyright>2026 Serverküche</copyright><lastBuildDate>Thu, 10 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://serverkueche.de/tags/pdf/index.xml" rel="self" type="application/rss+xml"/><item><title>Stirling-PDF: der PDF-Werkzeugkasten auf dem eigenen Server</title><link>https://serverkueche.de/tutorials/stirling-pdf-werkzeugkasten/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><author>feedback@serverkueche.de (Serverküche)</author><guid>https://serverkueche.de/tutorials/stirling-pdf-werkzeugkasten/</guid><description>PDFs zusammenführen, komprimieren, umwandeln, per OCR durchsuchbar machen – lokal statt bei Online-Diensten: Stirling-PDF hinter Traefik, mit Login.</description><content:encoded><![CDATA[<p>„PDF zusammenfügen online“, „PDF komprimieren kostenlos“ – für solche Aufgaben lädt man seine Dokumente sonst auf irgendeinen Webdienst hoch, oft mit vertraulichen Inhalten. Stirling-PDF macht dasselbe auf deinem eigenen Server: über 50 PDF-Werkzeuge, deine Dateien verlassen nie deine Kontrolle.</p>
<h2 id="was-bauen-wir">Was bauen wir?</h2>
<p>Einen kompletten PDF-Werkzeugkasten mit <strong>Stirling-PDF v2.14.3</strong> hinter <a href="/tutorials/reverse-proxy-traefik/">Traefik</a>, abgesichert mit Login. Am Ende führst du PDFs zusammen, komprimierst und drehst sie, wandelst zwischen Formaten um, machst gescannte Dokumente per <strong>OCR</strong> durchsuchbar, schwärzt Inhalte, fügst Passwörter oder Wasserzeichen hinzu – alles im Browser, alles lokal. Genau das richtige Werkzeug, um die Dokumente aus <a href="/tutorials/paperless-dokumentenverwaltung/">Paperless</a> oder <a href="/tutorials/nextcloud-eigene-cloud/">Nextcloud</a> vorzubereiten.</p>
<h2 id="voraussetzungen">Voraussetzungen</h2>
<ul>
<li>Ein Server mit laufendem <a href="/tutorials/reverse-proxy-traefik/">Traefik</a> und <a href="/tutorials/docker-compose-grundlagen/">Docker Compose</a></li>
<li>Eine <a href="/tutorials/domain-mit-server-verbinden/">Subdomain, die auf den Server zeigt</a> – im Folgenden <code>DEINE_DOMAIN</code></li>
</ul>
<div class="not-prose my-6 overflow-hidden rounded-xl border border-paprika-200 bg-paprika-50 dark:border-paprika-800 dark:bg-paprika-900/20"
     data-track-content data-content-name="Affiliate-Box · /tutorials/stirling-pdf-werkzeugkasten/" data-content-piece="VPS 1000 G12">
  <div class="flex items-center justify-between border-b border-paprika-200 bg-paprika-100 px-4 py-1.5 text-xs font-semibold uppercase tracking-wide text-paprika-700 dark:border-paprika-800 dark:bg-paprika-900/40 dark:text-paprika-300">
    <span>🍳 Empfehlung</span>
    <span title="Mit * markierte Links sind Affiliate-Links.">Anzeige</span>
  </div>
  <div class="flex flex-col gap-4 p-4 sm:flex-row sm:items-center sm:justify-between">
    <div>
      <p class="text-lg font-bold text-slate-900 dark:text-white">VPS 1000 G12</p>
      <p class="mt-1 text-sm text-slate-600 dark:text-slate-300">4 vCore · 8 GB RAM · 256 GB NVMe</p>
      <p class="mt-1 text-sm font-semibold text-paprika-700 dark:text-paprika-400">ab 10,36 €/Monat</p>
      <p class="mt-2 text-sm text-slate-600 dark:text-slate-400">Stirling-PDF läuft gut auf einem kleinen VPS; nur OCR großer Dateien mag mehr RAM.</p>
    </div>
    <a href="https://www.netcup.com/de/server/vps/vps-1000-g12-12m?ref=44083" rel="sponsored noopener" target="_blank"
   data-track-event="Affiliate|netcup: Affiliate-Box|VPS 1000 G12 · {page}"
   class="inline-flex shrink-0 items-center justify-center rounded-lg bg-paprika-600 px-5 py-2.5 font-semibold text-white transition-colors hover:bg-paprika-700">
  Zu netcup →
</a>

  </div><div class="px-4 pb-4"><p class="not-prose my-3 flex flex-wrap items-center gap-x-2 gap-y-1 rounded-lg border border-herb-500/40 bg-herb-50 px-3 py-2 text-sm text-slate-700 dark:bg-herb-900/20 dark:text-slate-200">
  <span>💶 <strong>5 € Gutschein</strong> für netcup-Neukunden:</span><code data-track-voucher="36nc17844976032"
        class="rounded bg-white px-2 py-0.5 font-mono text-sm font-semibold text-herb-800 dark:bg-slate-800 dark:text-herb-400">36nc17844976032</code>
  <span class="text-xs text-slate-500 dark:text-slate-400">(nur Neukunden, keine Domains)</span>
</p></div>
</div>

<h2 id="schritt-für-schritt">Schritt für Schritt</h2>
<h3 id="schritt-1-projekt-und-compose-datei">Schritt 1: Projekt und Compose-Datei</h3>
<p>Stirling-PDF ist im Kern zustandslos – es verarbeitet Dateien und gibt sie zurück, ohne sie dauerhaft zu speichern. Nur Konfiguration und OCR-Sprachdaten liegen in Volumes. Lege das Projekt an:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mkdir -p /opt/stirling/data /opt/stirling/configs <span class="o">&amp;&amp;</span> <span class="nb">cd</span> /opt/stirling</span></span></code></pre></div>
</div>
<p>Die <code>compose.yaml</code> – ersetze <code>DEINE_DOMAIN</code>:</p>
<div class="sk-code">
  <span class="sk-code-head">YAML</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">services</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">stirling-pdf</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">stirlingtools/stirling-pdf:2.14.3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">restart</span><span class="p">:</span><span class="w"> </span><span class="l">unless-stopped</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">./data:/usr/share/tessdata  </span><span class="w"> </span><span class="c"># OCR-Sprachdaten</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">./configs:/configs          </span><span class="w"> </span><span class="c"># Konfiguration</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">environment</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">LANGS</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;de_DE&#39;</span><span class="w">                  </span><span class="c"># UI-Sprache</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">networks</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">proxy]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.enable=true&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.routers.stirling.rule=Host(`DEINE_DOMAIN`)&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.routers.stirling.entrypoints=websecure&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.routers.stirling.tls.certresolver=le&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.services.stirling.loadbalancer.server.port=8080&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">networks</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">proxy</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">external</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div>
</div>
<h3 id="schritt-2-starten-und-auf-healthy-warten">Schritt 2: Starten und auf „healthy&quot; warten</h3>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker compose up -d</span></span></code></pre></div>
</div>
<p>Das Image bringt einen eigenen Healthcheck mit, und Traefik leitet erst auf den Container, wenn dieser <code>healthy</code> ist – das dauert nach dem Start etwa 20–30 Sekunden (die Java-Anwendung braucht einen Moment). Prüfe:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker compose ps</span></span></code></pre></div>
</div>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">NAME                      IMAGE                              STATUS
</span></span><span class="line"><span class="cl">stirling-stirling-pdf-1   stirlingtools/stirling-pdf:2.14.3  Up (healthy)</span></span></code></pre></div>
</div>
<h3 id="schritt-3-erster-login-und-pflicht-passwortwechsel">Schritt 3: Erster Login und Pflicht-Passwortwechsel</h3>
<p>Öffne <code>https://DEINE_DOMAIN/</code>. Stirling-PDF v2 ist standardmäßig durch einen Login geschützt – ein wichtiger Unterschied zu vielen anderen Tools, das solltest du nicht deaktivieren, wenn der Dienst öffentlich erreichbar ist.</p>
<p><figure class="my-6"><img src="/tutorials/stirling-pdf-werkzeugkasten/sp-login_hu_9e8c58ea593452e.webp" srcset="/tutorials/stirling-pdf-werkzeugkasten/sp-login_hu_abef7d403aa2c77a.webp 480w, /tutorials/stirling-pdf-werkzeugkasten/sp-login_hu_9e8c58ea593452e.webp 768w, /tutorials/stirling-pdf-werkzeugkasten/sp-login_hu_a65b0493c8b03bdd.webp 1200w, /tutorials/stirling-pdf-werkzeugkasten/sp-login_hu_7f0e1da46b4bad7c.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/stirling-pdf-werkzeugkasten/sp-login_hu_3b0aef3adb59e34e.webp"
    alt="Die Anmeldeseite von Stirling-PDF mit Feldern für Benutzername und Passwort" title="Der Login schützt den Werkzeugkasten – standardmäßig aktiv in Stirling-PDF v2"
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Der Login schützt den Werkzeugkasten – standardmäßig aktiv in Stirling-PDF v2</figcaption></figure></p>
<p>Melde dich mit den Standarddaten <strong><code>admin</code> / <code>stirling</code></strong> an. Beim ersten Login <strong>erzwingt</strong> Stirling-PDF sofort einen Passwortwechsel – gut so. Vergib ein starkes Passwort; danach musst du dich mit dem neuen Passwort erneut anmelden.</p>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-amber-400 bg-amber-50 dark:border-amber-700 dark:bg-amber-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">⚠️</span>Standard-Zugangsdaten sofort ändern
  </p>
  <div class="prose-kitchen text-sm"><code>admin</code>/<code>stirling</code> sind öffentlich bekannt. Solange dieses Passwort gilt, ist dein Werkzeugkasten für jeden offen, der die Domain kennt. Der erzwungene Wechsel beim ersten Login ist Absicht – überspringe ihn nicht und wähle ein echtes Passwort.</div>
</div>
<h3 id="schritt-4-der-werkzeugkasten">Schritt 4: Der Werkzeugkasten</h3>
<p>Nach dem Login siehst du die Oberfläche: links deine Dateien, rechts der komplette Werkzeugkatalog, gruppiert in Kategorien wie Signierung, Dokumentensicherheit und Verifizierung.</p>
<p><figure class="my-6"><img src="/tutorials/stirling-pdf-werkzeugkasten/sp-tools_hu_81e0be9b55818aba.webp" srcset="/tutorials/stirling-pdf-werkzeugkasten/sp-tools_hu_35a4dceccb6f443b.webp 480w, /tutorials/stirling-pdf-werkzeugkasten/sp-tools_hu_81e0be9b55818aba.webp 768w, /tutorials/stirling-pdf-werkzeugkasten/sp-tools_hu_adbc225e971ed613.webp 1200w, /tutorials/stirling-pdf-werkzeugkasten/sp-tools_hu_261c037580b0e2bc.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/stirling-pdf-werkzeugkasten/sp-tools_hu_f4c0f572125af27b.webp"
    alt="Die Stirling-PDF-Oberfläche mit Upload-Bereich in der Mitte und dem Werkzeugkatalog rechts" title="Über 50 Werkzeuge, gruppiert nach Aufgabe – Zusammenführen, Komprimieren, Umwandeln, OCR und mehr"
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Über 50 Werkzeuge, gruppiert nach Aufgabe – Zusammenführen, Komprimieren, Umwandeln, OCR und mehr</figcaption></figure></p>
<p>Der Einstieg ist immer gleich: Eine PDF per <strong>Vom Computer hochladen</strong> laden (oder per Drag &amp; Drop), dann das gewünschte Werkzeug rechts wählen. Die Datei erscheint im eingebauten Viewer:</p>
<p><figure class="my-6"><img src="/tutorials/stirling-pdf-werkzeugkasten/sp-file_hu_c5cc3c7895191886.webp" srcset="/tutorials/stirling-pdf-werkzeugkasten/sp-file_hu_85c7e574cf5a5182.webp 480w, /tutorials/stirling-pdf-werkzeugkasten/sp-file_hu_c5cc3c7895191886.webp 768w, /tutorials/stirling-pdf-werkzeugkasten/sp-file_hu_4d0ff60ec82a904b.webp 1200w, /tutorials/stirling-pdf-werkzeugkasten/sp-file_hu_5f429ea55ef0bf5d.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/stirling-pdf-werkzeugkasten/sp-file_hu_d9cc7fb9b0b31642.webp"
    alt="Eine geladene PDF im Stirling-PDF-Viewer mit Seitennavigation und dem Werkzeugkatalog daneben" title="Eine geladene PDF im Viewer – rechts wählst du das Werkzeug, das darauf angewendet wird"
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Eine geladene PDF im Viewer – rechts wählst du das Werkzeug, das darauf angewendet wird</figcaption></figure></p>
<p>Die nützlichsten Werkzeuge im Alltag:</p>
<ul>
<li><strong>Zusammenführen / Aufteilen:</strong> mehrere PDFs zu einer vereinen oder Seiten heraustrennen.</li>
<li><strong>Komprimieren:</strong> die Dateigröße für den Mailversand reduzieren.</li>
<li><strong>Umwandeln:</strong> PDF ↔ Bild, Word/Office → PDF und zurück.</li>
<li><strong>OCR &amp; Scans bereinigen:</strong> gescannte Dokumente durchsuchbar machen (dafür sind die <code>tessdata</code>-Sprachdaten da).</li>
<li><strong>Schwärzen:</strong> vertrauliche Stellen dauerhaft entfernen – nicht nur schwarz übermalen.</li>
</ul>
<h3 id="schritt-5-ocr-sprachen-ergänzen-optional">Schritt 5: OCR-Sprachen ergänzen (optional)</h3>
<p>Für OCR auf Deutsch braucht Stirling-PDF die passenden Tesseract-Sprachdaten. Das offizielle Image bringt gängige Sprachen mit; fehlt eine, legst du die entsprechende <code>.traineddata</code>-Datei in den gemounteten <code>data</code>-Ordner (<code>/usr/share/tessdata</code>). Danach steht die Sprache im OCR-Werkzeug zur Auswahl.</p>
<h2 id="wenn-es-nicht-funktioniert">Wenn es nicht funktioniert</h2>
<div class="troubleshoot not-prose">
<p><strong>Die Seite kommt nicht (Traefik-404), obwohl der Container läuft.</strong> Der Healthcheck ist noch nicht <code>healthy</code> – Traefik leitet dann bewusst nicht. Nach dem Start 20–30 Sekunden warten; Status mit <code>docker inspect -f '{{.State.Health.Status}}' stirling-stirling-pdf-1</code> prüfen.</p>
<p><strong>Login mit <code>admin</code>/<code>stirling</code> scheitert.</strong> Entweder wurde das Passwort schon geändert (dann das neue nutzen), oder die Konfiguration im <code>configs</code>-Volume ist inkonsistent. Zum Zurücksetzen die Anwendung stoppen und die Nutzerkonfiguration im <code>configs</code>-Ordner prüfen; im Zweifel den Ordner leeren (Achtung: setzt alle Einstellungen zurück).</p>
<p><strong>OCR findet meine Sprache nicht.</strong> Die passende <code>.traineddata</code> fehlt im <code>tessdata</code>-Volume. Die Datei von den Tesseract-Sprachpaketen holen und in den <code>data</code>-Ordner legen (siehe Schritt 5).</p>
<p><strong>Eine Umwandlung (z. B. Office → PDF) schlägt fehl.</strong> Solche Konvertierungen brauchen zusätzliche Werkzeuge (LibreOffice), die nur in den größeren Image-Varianten enthalten sind. Für den vollen Funktionsumfang die <code>-fat</code>-Variante des Images verwenden (<code>stirlingtools/stirling-pdf:2.14.3-fat</code>).</p>
<p><strong>Große Dateien führen zu Fehlern oder langer Wartezeit.</strong> OCR und Konvertierung sind speicherintensiv. Auf einem kleinen VPS kann RAM knapp werden – dann entweder kleinere Dateien verarbeiten oder auf ein größeres Produkt wechseln.</p>

</div>

<h2 id="wartung--backups">Wartung &amp; Backups</h2>
<ul>
<li><strong>Updates.</strong> Setze den Image-Tag (<code>stirlingtools/stirling-pdf:2.14.3</code>) gelegentlich auf die aktuelle Version und <code>docker compose up -d</code>. Stirling-PDF wird aktiv entwickelt und bekommt häufig neue Werkzeuge; ein Blick in die Release-Notes lohnt sich. Der Rest läuft über deinen normalen <a href="/tutorials/docker-stack-aktuell-halten/">Update-Prozess</a>.</li>
<li><strong>Backup ist klein.</strong> Weil die Dateiverarbeitung zustandslos ist, musst du nur den <code>configs</code>-Ordner (Login, Einstellungen) und ggf. eigene OCR-Sprachdaten sichern – am besten mit <a href="/tutorials/backups-mit-restic/">Restic</a>. Die verarbeiteten PDFs speicherst du ohnehin selbst.</li>
<li><strong>Sicherheit.</strong> Der Login ist die erste Verteidigungslinie – halte das Admin-Passwort stark und aktuell. Da hier potenziell vertrauliche Dokumente durchlaufen, ist der Betrieb hinter HTTPS (Traefik) und Login Pflicht; ein öffentlich erreichbares Stirling-PDF ohne Passwort wäre ein ernstes Datenleck.</li>
</ul>
]]></content:encoded></item></channel></rss>