onepage-pdf について
onepage-pdf は HTML を縦長の 1 ページ PDF にレンダリングし、実際のコンテンツの高さに合わせて切り抜きます。Web レイアウトを PDF 化する用途向けで、CSS の修正やテキストのマスキングにも対応します。
主な機能
- 01ヘッドレス Chrome で HTML を描画
- 02測定したコンテンツ高で PDF を切り抜き
- 03追加 CSS の上書きを適用
- 04テキスト置換と禁止語チェック
- 05出力が 1 ページであることを確認
活用シーン
- 01Web レイアウトを縦長 PDF に変換
- 02印刷時のレスポンシブレイアウト問題を修正
- 03PDF 公開前にテキストをマスキング
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ acedatacloud/ skills --skill onepage-pdfインストール後、Claude Code で/onepage-pdfを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEexamples/demo-fixes.cssdemo.htmlreferences/mechanics.mdscripts/onepage_pdf.py詳細
onepage-pdf
github.com/xntj-ai/onepage-pdf からベンダー提供されたものです。 张拼拼 · XNTJ によるもので、MIT License の下で提供されています。詳細は LICENSE を参照してください。
ヘッドレス Chrome で HTML を縦長の PDF 1 ページにレンダリングし、PyMuPDF でページを実際のコンテンツの高さまでトリミングします。高さは予測しません(印刷レイアウトと画面レイアウトは異なるため)。レンダリング後に測定するので、正確です。
必要環境: pymupdf をインストールした Python と、ローカルの Chrome または Edge。API トークンは不要です。
ワークフロー
1. まずソース HTML を確認する
HTML を読み、4 つの点を確認します。これらによって --extra-css が必要かどうかが決まります。
- レスポンシブブレークポイント。 印刷メディアクエリは
@pageサイズではなく、デフォルトの用紙幅(約741px)に対して評価されます。N ≥ 741の@media (max-width: N)は印刷時に適用され、デスクトップレイアウトが崩れる可能性があります。そのようなルールごとに、デスクトップの値を!importantで固定するオーバーライドを記述してください(例:.grid{grid-template-columns:repeat(3,1fr)!important})。 - グラスモーフィズム。
backdrop-filterのぼかしは、PDF 出力では通知なしに無効になります。グラス要素が複雑な背景の上にある場合は、印刷用の代替スタイルを追加してください。.glass{backdrop-filter:none!important;background:rgba(255,255,255,.88)!important}。 - スクロール連動の表示アニメーション。 一般的なクラスパターン(
fade*、reveal*、animate*、aos)は自動的に表示状態になります。それ以外でopacity:0から始まるものには、opacity:1!importantの明示的なオーバーライドが必要です。 - vh/vw によるサイズ指定。 ビューポート単位は印刷時にページ領域を基準に解決され、約1%ずれます。
min-height:100vhのヒーロー要素は、巨大なページ上で約187inの高さになります。このようなルールは固定 px 値でオーバーライドしてください。
すべてのオーバーライドを1つの CSS ファイルにまとめ、--extra-css で渡します。
2. 変換する
以下のパスは、このスキルのディレクトリを基準とします。
python scripts/onepage_pdf.py input.html -o output.pdf --width 1280 \
[--extra-css fixes.css] [--replace subs.json --forbid words.txt]
--width:ページのデザイン幅に合わせます(8px 単位にスナップします。8px 単位でないページサイズは MediaBox の丸め処理の不具合を引き起こし、不要なページが生成されます)。--replace:JSON[["old","new"], ...]。記載順に適用されます。長く、より具体的な文字列を先に指定してください。公開前の墨消しに使用します。--forbid:1行につき1語を指定します。HTML または最終 PDF のテキストレイヤーに1つでも残っていると、スクリプトは中断します。必ず--replaceと併用してください。--crop pixel:ベクターのトリミングで判定を誤る場合(例:装飾要素が実際のコンテンツより下まで描画されている場合)に、ラスターの行スキャンに切り替えます。
スクリプトは、オーバーフロー時の自動再試行を伴う巨大ページへのレンダリング、コンテンツのトリミング(ビューアーとの互換性のため、MediaBox と CropBox を同一の値に書き換えます)、CJK 対応の出力パス、1ページであることの検証を自動処理します。
examples/ に同梱のサンプルがあります。最初から最後まで実行してみてください。
python scripts/onepage_pdf.py examples/demo.html -o /tmp/demo.pdf \
--width 1280 --extra-css examples/demo-fixes.css
3. 検証する
スクリプトは OK 1 page, WxHpt と出力します。次に、以下を行います。
- サムネイルをレンダリングして目視確認します(レイアウトが保たれていること、グリッドが崩れていないこと、背景が表示されていること、下部が切れていないこと)。
import pymupdf doc = pymupdf.open("output.pdf") doc[0].get_pixmap(dpi=40).save("check.png") - 墨消しを行った場合、PDF のテキストに対する禁止語チェックはすでに実行されています。それでも、レンダリング画像を確認して、ラスター形式で機密情報が残っていないか確認してください。
- スクリプトの警告に注意してください。高さが14400ptを超えると Acrobat で問題が発生します(Chrome、Firefox、WeChat のプレビューでは問題ありません)。「content nearly fills the bedrock」と表示された場合は、末尾が切れていないか確認してください。
トラブルシューティングと仕組み
出力に問題がある場合(レイアウトの崩れ、背景の欠落、空白ページ、不要な2ページ目、CJK グリフのぼやけや欠落)は、references/mechanics.md を参照してください。このツールの基盤となる Chrome の印刷レンダリングルールと、CDP ベースの代替手順について説明しています。