PDFs erstellen und lesen mit pdfpecker
pdfpecker wandelt HTML und CSS (oder Markdown) ohne Browser in ein PDF um und rendert PDF-Seiten zurück in Bilder, damit Sie sehen können, was Sie erstellt haben. Gehen Sie in dieser Reihenfolge vor: HTML schreiben, konvertieren, die Seiten ansehen, korrigieren, erneut konvertieren.
Einrichtung
python3 -c "import pdfpecker" 2>/dev/null || python3 -m pip install --quiet pdfpecker
Das Hilfsskript ist scripts/pdf.py im Ordner dieses Skills (in Claude Code: ${CLAUDE_SKILL_DIR}/scripts/pdf.py).
Es kapselt das Paket, sodass Sie für die üblichen Aufgaben kein eigenes Python benötigen:
python3 scripts/pdf.py html invoice.html invoice.pdf # Bilder und CSS werden relativ zur HTML-Datei aufgelöst
python3 scripts/pdf.py md notes.md notes.pdf --page-size Letter
python3 scripts/pdf.py preview invoice.pdf --dpi 80 # schreibt invoice-page-1.png, … und gibt die Pfade aus
python3 scripts/pdf.py text report.pdf --pages 1-2
python3 scripts/pdf.py markdown report.pdf report.md # jedes PDF als Markdown, Tabellen und Listen bleiben erhalten
python3 scripts/pdf.py info report.pdf # Seitenanzahl
python3 scripts/pdf.py merge all.pdf cover.pdf report.pdf
Führen Sie python3 scripts/pdf.py <befehl> --help für jede Option aus. Von Python aus sind die gleichen Aufrufe
pdfpecker.html_to_pdf(html, base_dir=...), html_file_to_pdf(pfad, ausgabe), markdown_to_pdf(text),
pdf_to_images(pdf, dpi=80), pdf_to_text(pdf), pdf_to_markdown(pdf), pdf_page_count(pdf), merge_pdfs([...])
und pdf_to_pdfa(pdf, "ausgabe.pdf") (ein vorhandenes PDF in PDF/A für die Archivierung).
Das HTML schreiben
Beginnen Sie mit einer Vorlage, wenn eine passt: templates/invoice.html (einseitige Rechnung mit einer Tabellenposition) und
templates/report.html (mehrseitiger Bericht mit Deckblatt, Seitenzahlen, einer Tabelle mit wiederholtem Kopf und einem
Diagramm in SVG). Kopieren Sie sie neben Ihre Ausgabe und bearbeiten Sie sie.
Setzen Sie das Seitenlayout in CSS, nicht in Optionen:
@page {
size: A4; /* oder Letter, A5, "A4 landscape", 210mm 99mm */
margin: 18mm 16mm 20mm;
@bottom-center { content: "Seite " counter(page) " von " counter(pages); font: 9pt sans-serif; color: #666; }
}
@page :first { @bottom-center { content: none; } }
h2 { break-after: avoid; } /* eine Überschrift mit dem Nachfolgenden zusammenhalten */
tr, figure, .card { break-inside: avoid; }
.new-page { break-before: page; }
thead { display: table-header-group; } /* wird auf jeder Seite wiederholt (Standard für <thead>) */
Was Sie wissen sollten (Details in reference.md):
- Kein JavaScript. Skripte werden nicht ausgeführt. Zeichnen Sie Diagramme als Inline-SVG oder CSS (Balken als proportionierte
<div>-Elemente) und füllen Sie Daten vor der Konvertierung ein. - Kein Netzwerk. Bilder, Stylesheets und Schriftarten werden aus dem Ordner der HTML-Datei (
base_dir) oder überdata:-URIs geladen, niemals von http(s)-URLs. Laden Sie zuerst herunter, was Sie benötigen, oder betten Sie es ein. - Schriftarten. Ohne eigene Schriftarten verwendet der Text Helvetica (
sans-serif, Arial), Times (serif) und Courier (monospace) mit integrierten Fallbacks, die Lateinisch, Griechisch und Kyrillisch abdecken. Chinesisch, Japanisch, Koreanisch, Arabisch, Hebräisch, Hindi, Thai und andere Schriften erscheinen als?, wenn Sie keine Schriftart mit diesen Zeichen übergeben:--font NotoSansSC-Regular.otf(oder--system-fontszur Verwendung der auf dem Rechner installierten Schriftarten). Verwenden Sie@font-facemit einem relativensrcfür eine bestimmte Schriftart. - Modernes CSS funktioniert: flexbox, grid, Tabellen, floats, mehrspaltig, Positionierung, Transformationen, Verläufe, Schatten, abgerundete Ecken,
object-fit, SVG, Webschriften, Zähler und CSS-Variablen. Gestalten Sie wie für die Druckvorschau von Chrome; PdfPecker folgt dem Layout von Chrome. - Einheiten. Verwenden Sie
mm,ptoderpx(96 px pro Zoll). A4-Inhaltsbreite mit 16 mm Rändern beträgt 178 mm (ca. 673 px).
Das Ergebnis überprüfen
Sehen Sie sich die Seiten immer an, bevor Sie ein PDF übergeben: führen Sie preview aus und betrachten Sie die PNGs. Überprüfen Sie auf abgeschnittenen Text oder Text, der die Seite verlässt, eine Tabelle oder Überschrift, die schlecht über Seiten geteilt ist, eine einsame letzte Zeile auf einer neuen Seite, leere Seiten, ? anstelle von Buchstaben (fehlende Schriftart) und nicht geladene Bilder (falscher Pfad). text bestätigt den Wortlaut und die Reihenfolge. Korrigieren Sie HTML oder CSS, konvertieren Sie erneut und sehen Sie noch einmal nach.
Fehler
Das Skript wird mit Exit-Status 1 beendet und gibt den Grund aus. Von Python aus ist jeder Fehler ein pdfpecker.PdfPeckerError:
PdfPeckerArgumentError für eine falsche Option, PdfReadError für eine Datei, die kein lesbares PDF ist,
PdfPasswordError, PdfLimitError (zu viele Seiten), PdfTimeoutError und PdfFileError für eine nicht lesbare Schriftart oder Datei.