Edge が PDF の表示に Adobe のエンジンを使うらしい
やめてほしい

Adobe 製品は入れたくないし入れてほしくない
IE の頃の使いづらい PDF 表示みたいになるようにしか思えない

せっかくウェブで快適に PDF を見れるエンジンが Chrome に搭載されてるのに Adobe のエンジンなんていれなくていいよ
なんのためにそんな余計なことをするの
無効にできるならいいけどできないなら PDF を開くために Chrome 入れるみたいなことが必要になってすごく面倒になる
簡易編集できる PDF ビュワー何がいいんだろう
最近は専用のソフトの PDF ビューワーは入れずにブラウザに入れてみてます
高速で開けますし 基本はこれで十分
ですがテキストボックスを入れたりハイライトしたりといった簡易編集機能が使えません
稀にこれらが必要になるのでなにか入れようとしたのですが 最近って何がいいんでしょう?

標準的なのは Adobe のやつ
だけど Adobe 製品って重いしそんな使いやすくないしインストール時に余計なものを入れるしであまりいれたいものではないです
以前高速だからと使っていたソフトは Sumatra PDF
これは高速な分シンプルで最小限の機能しかないので編集はできなかったはず
編集に使っていたソフトは PDF-XChange Viewer か Foxit PDF Reader
XChange の方は機能は多いけど重めで機能が多い分見づらかった記憶
Foxit は表示・編集の機能的には良かったけどその他でちょっと問題あり

Foxit の日本語版は扱いがちょっと特殊です
英語のグローバル版を使えば言語設定で言語を選べますが そこに日本語はありません
日本語サイトが別にあって そこで日本語用の別のインストーラが配布されています
英語版だと普通にダウンロードできるのに 日本語版は名前やメールアドレスや利用目的をフォームに入力する必要があります
返信されるメールにダウンロードリンクがあるようです
中身見て承認とかせず自動でしょうし 適当な一時メールアドレスをとって偽名でも良さそうですが こういうムダな手順が必要です
昔はこんなのなかったのですけどね

この日本語版だと言語設定に日本語が含まれます
日本語版は分かれてるせいで更新されるのが遅いし バグなのかアップデートが正常に行われません(英語版だと正常なのかは知らないです)
アップデートの処理が途中で停止して古いバージョンのアンインストールだけ行われて新しいバージョンがインストールされないです
どれだけ待っても終わらないのでタスクマネージャで停止するしかありません
そのままだとアンインストールされて Foxit が入ってない状態になっているので 自分で Temp フォルダからインストーラを探してきて手動でインストールする必要があります
ダウンロードし直そうとするとフォーム入力が必要になるので Temp フォルダを探してました
一度や二度ではなく毎回アップデートのたびにこれでした
開くファイルや編集時に入力するのが日本語なので日本語版にしてましたが UI は英語でもいいので英語版を使ったほうがいいのかも

そういうこともあって 他にいいのがあれば Foxit 以外にしてみたいところですが ググってもこれといって新しくて良さそうなのが見当たらないです
ベスト◯選みたいなところで出てきた知らないものだと Slim PDF というのがありましたが これも Sumatra PDF みたいに編集はできない閲覧専用みたいです
あとは以前から名前は聞いたことがあった Nitro PDF Reader
こっちは単独ではなくて Nitro PDF Pro のトライアルと一緒になってるみたいで名前やメールアドレスをいれるフォームあり
PDF Reader ってこういうのばかりですね
商用製品の簡易版とか体験版みたいのじゃなくて公式サイトが Github Pages になっているような OSS 系ってないんでしょうか
WeasyPrint でドキュメントタイトルをヘッダに表示する
WeasyPrint は PDF 作成に特化してるのでブラウザでは使えない CSS も使える
結構古い Working Draft だけどこの辺
https://www.w3.org/TR/2014/WD-css-gcpm-3-20140513/

string-set プロパティと string 関数が使えるので セクションタイトルをページの右上に常に表示したいなら

<!doctype html>
<meta charset="utf-8" />

<title>title</title>

<style>
@page {
size: A4;

@top-right {
content: string(heading);
}
}

h1 {
string-set: heading content();
}
</style>

<h1>h1</h1>
<p>p</p>

という感じで h1 のスタイルで string-set を指定して heading に h1 タグ内の content を設定
右上のヘッダ部分の content で heading を参照
これでヘッダにセクションタイトルを設定できる

それならドキュメントタイトルを左上に表示にしたければ title タグに同じようなことをすればできるはず

<style>
@page {
size: A4;

@top-left {
content: string(title);
}

@top-right {
content: string(heading);
}
}

title {
string-set: title content();
}

h1 {
string-set: heading content();
}
</style>

これで表示されるかと思ったけど表示されない

title タグは head タグの中だからスタイルの対象外?
調べると head タグの中ではなく display: none の要素は対象外らしい
https://github.com/Kozea/WeasyPrint/issues/473

回避策は head と title タグを display: none じゃなくすることらしい
だけど head タグを block にすると表示対象になるのでその中も表示される
head タグ内の他のタグ(style タグなど)は display: none だから 問題は title タグ自身も表示されること
これを避けるために visibility を hidden にする
それだけだと見えないだけでレイアウトに影響するのでサイズを 0 にする
これで左上にドキュメントタイトルが表示できるようになった

	head, head title {
display: block;
visibility: hidden;
width: 0;
height: 0;
}

結構前からある問題みたいだし そろそろ修正されて欲しいけど
ドキュメントの PDF をテキストから作りたいけど
ドキュメントの PDF を出力したいけど Word は色々と辛い
スタイルが言うことを聞かなかったり バージョン管理や差分確認のしづらさがあるし 画像が多いと重くなったり 大きい画像の位置調整がしづらかったり
デメリットが多いけど 見たままだしマウス操作できるなどのメリットもあるしでとりあえず Word にしてたけどそろそろやめたい

テキストベースでドキュメントを書く記法だと markdown が有名でよく使われてる
HTML にすれば PDF 化もできる
だけど パーサごとに独自拡張とかあったりで記法が完全に統一されてない
ツール次第で出力が変わるものだと その場限りのものならともかく 長期間修正を繰り返す前提のものには使いづらい

方向的にはこれでいいので markdown に近いマークアップ言語を探してみる
markdown よりはしっかりした規格があるようなのだと AsciiDoc や reStructuredText が候補
AsciiDoc の方は記法があまりわかりやすくなく 直感だと reStructuredText の方が良さそう
だけど記法の詳細を見ると ソースコード上での見た目を重視な分 本文に合わせた装飾が必要みたい
見出しの下線や表のレイアウトなど
なんか日本語の全角と相性が悪そう

他のドキュメント記法は何かないか探していたら pandoc というツールを発見
これ自体は記法ではなく ドキュメント間の変換ツール
数十はあるドキュメントフォーマットを変換できる結構すごいものだった
名前は聞いたことあったけど使ったことなかった……
PDF への変換までサポートしてるみたいなので このツールの標準フォーマットを使えばいい気がする
と思って調べると 独自拡張の markdown だった
markdown は上に書いた問題あるしなー と思ったけど PDF 変換まで pandoc で行うなら pandoc 用の拡張 markdown に限定すれば別にいいような気もする
それなりにしっかりとしたツールだし その他 markdown 独自拡張やパーサみたいに気づけば消えていってるようなことはなさそうだし



で 使っては見たけど 色々問題が
本当にちょっとしたドキュメントの PDF 化ならすごく簡単だった
Docker のイメージが用意されてるので 説明どおりにすれば PDF 化までお手軽変換
ただし英語限定とスタイルがそのままでよければ

デフォルトだと latex を中間データにして PDF を生成していて その latex エンジンが日本語をサポートしてない
昔 latex テンプレートしか用意されてないフォーマットの PDF を作る必要があったときに latex を使ったときは platex という日本語用のバージョンを使ったはず
pandoc のデフォルトは pdflatex
platex はサポートしてなくて変わりに Unicode 対応の xelatex と lualatex なら使えるらしい

--pdf-engine=lualatex -V documentclass=ltjsarticle -V luatexjapresetoptions=ms

というオプションを pandoc に渡せば日本語も使えるらしいけど Docker 環境だと ltjsarticle が入ってないみたいでエラー
調べても Windows に texlive を scheme-full で完全インストールしておけば良いとかそういう前提で Docker 環境なら何を入れればよいかよくわからない

とりあえずコンテナ内で tlmgr で scheme-full をインストールしてみたけど full というだけあって重すぎて数時間かかるペース
しかも途中で Docker のホストの WSL ごと落ちて完了してない
メモリ不足とか?

とりあえず tlmgr のインストールで ltjsarticle を直接指定したらインストールできたらしい
他に足りないのがあれば都度エラーが出ると思うのでそのたびに入れればいいか という感じで

試してみると次はフォントがないというエラー
haranoaji というフォントが必要みたい
ms を指定してるのになぜ?
ipa とかに変えてもこのフォントが要求される
とりあえず tlmgr で入れる

これで一応 PDF は出るようになった……けど スタイル的に求めるのには程遠い
なんというか論文?とか出版物?にありそうな感じ
もうちょっと親しみやすい感じにしたい
見た目的には Word をちょっとカスタムしたくらいのでいいんだけど



スタイルを変えようとしたけど latex のスタイル調整なんてしたことないし マクロ構文が複雑すぎて読む気も起きない
あー CSS は偉大だなー

latex をマスターするつもりでやるならともかく サクッとスタイルだけ好みにしたいだけで何時間かかるかもわからない苦労はしたくない
デフォルトスタイルでいいとか スタイル定義がすでにあるわけでもないなら PDF 生成のエンジンに latex 使うのはやめたほうがいいかも

スタイルが Word みたいのでいいなら docx を使えばいいのかも
pandoc は docx への変換もサポートしてるし そこから PDF 化できる
試してみると docx はそれなりにはいい感じ
--reference-doc でテンプレートの docx を指定するとそのスタイルを使ってくれる
だけどこれまで使ってた Word ファイルをそのまま指定だと スタイルが完全に思い通りにあたってないことも
内部的に使うスタイル名が決まってるみたいなので pandoc でデフォルトテンプレートの docx を出力して その docx のスタイルをカスタマイズして --reference-doc に指定するのが良いみたい

テキストベースなものと違ってコピペで済ませられないのでスタイル設定し直すのは結構面倒
それに本文・見出し・箇条書き・表くらいなシンプルなドキュメントなら十分そうだけど 表紙ページとかインデックスページとかヘッダ・フッタとか複数セクションの分割とかってどうすればいいんだろう?

docx 変換は情報が少なく苦労も多そう
やっぱり HTML を通した PDF 変換が一番無難でカスタマイズしやすいのかも
中間ファイルが HTML なら HTML をパースして構造置き換えたりも簡単にできるし スタイル調整も CSS で楽にできるし



HTML を使う場合は デフォルトエンジンは wkhtmltopdf
懐かしい というかまだ生きてたんだ
公式ページを見てみると QtWebkit の開発が停止したり復活したり Chrome の Blink 化や PhantomJS の終了だったり 色々あったみたい
https://wkhtmltopdf.org/status.html
プロジェクトは続いてるけど あまり活発に開発されてるわけでもないようで 別の類似ツールの使用も検討してくださいって言ってるくらいだし 最近は Chrome のヘッドレスモードで PDF 化できるから使わなくてもいい気はしてる

一応入れてみる
pandoc のエンジンとしては対応してるけど同梱されてないし Docker イメージに wkhtmltopdf を含んでるのもなかったので ubuntu を使った pandoc イメージで apt を使ってインストール
Qt 関係が依存で必要だからか GB 単位でインストールが必要で結構重い
これだけだと日本語が□になってたので日本語フォントも追加でインストールが必要
wkhtmltopdf のオプションに詳しくないので全体的な調整がやりづらいし wkhtmltopdf じゃなくて Chrome で PDF 化でいいかな



とりあえず pandoc で HTML 化して Chrome で PDF 化する方向にしようとしたけど ブラウザの HTML 印刷機能は弱かった
そもそもウェブページの印刷用だから ドキュメントの作成レベルのクオリティは要らないはずといえばそうなんだけど

ヘッダ・フッタをうまく扱えない
CSS の定義上は各コーナーを扱うプロパティは存在するけど未だにブラウザはサポートしてないらしい
position に absolute, fixed を使う方法はブラウザ依存だし Chrome だと各ページに表示はできるけど カウンターが更新されない
全てのページに同じページ数が表示される
全ページ数を表示する方法もない
JavaScript でコンテンツサイズとページサイズを計算してページ分けして それぞれのページに別々のヘッダ・フッタの要素を配置するという無理やりなものもあったけど画像や表とかがページを挟むとかもあるとどこかで問題が出そう

思ったより良かった部分はセクション分け機能は動いて

@page foo {
size: A4 portrait;
}
@page bar {
size: A4 landscape;
}

.section1 {
page: foo;
}
.section2 {
page: bar;
}

というスタイルを当てれば section1 と section2 でページが分かれて セクションごとに用紙の縦横を切り替えられる
ヘッダ・フッタのコーナーがサポートされれば @page のブロックに配置することでセクションごとのヘッダ・フッタも作れるはず
ただここも完璧ではなくて セクションごとに用紙の縦横は切り替わったけど内部の計算は用紙サイズの変更を反映してないみたい

1 つめのセクションは用紙が縦で 2 つめのセクションは用紙が横として それぞれの本文は同じで数字付きの箇条書き

1. aaa
2. aaa
3. aaa
4. aaa
...

みたいなの

数字は 1 ~ 20 までで

縦:
1 枚目 → 1 ~ 15
2 枚目 → 16 ~ 20
横:
1 枚目 → 1 ~ 8
2 枚目 → 9 ~ 16
3 枚目 → 17 ~ 20

を期待したのに横でも縦と同じ 2 枚になって 1 枚目に 15 まで入って 2 枚目が 16 からになってる
縮小されて全部が見えるならまだいいけど 8 までしか入ってなくて 9 から 15 は用紙の範囲外でプレビューにも映ってない
実際には使い物にならない

こういう問題があるし HTML はドキュメントの PDF 作成には向いてなさそう
latex でスタイルカスタマイズを頑張るか pandoc の PDF 化エンジンで選択できて wkhtmltopdf でも推奨してた weasyprint を試してみるとかかなー
PDF を PNG に変換
WSL の Ubuntu を使う方法
xpdf をインストール

sudo apt install xpdf

pdftocairo コマンドが使えるようになる

pdftocairo -png doc.pdf

# 出力ファイル名指定
pdftocairo -png doc.pdf image.png

# ページ指定
pdftocairo -png -f 4 -l 4 doc.pdf image.png

ページを 1 つ指定するオプションは無いみたいで f で開始 l で終了のページを指定
同じのを指定するとその 1 ページだけ

Internal Error が出るときあるけど変換はできてる
Python の PDF ライブラリ
PDF ビュワーで既存 PDF にテキストボックスを配置したり前に配置したのを編集できたりするので あれを Python でまとめてやりたくて調べたもの
フリーソフトでできるくらいなのに 無理そうな感じ


Python の有名どころ PDF ライブラリ
カッコの中は調べたタイミングでの Github スターと最終更新があった年

PyPDF2 (2721/2018)

メタデータ取り出したり 分割結合とかはできそうだけど テキスト入れたりはできなそう
サンプル見ても reportlab っていう別ライブラリ使ってる

pdfminer (3710/2016)

スターは最多だけど Python2 のみの対応
Python 3 対応はフォークした別リポジトリ

pdfminer.six (1380/2019)

pdfminer の Python2, 3 の両方対応のフォークだけど スター数的にはそこまで活発じゃなさそう
ドキュメントというドキュメントもないし リンクにあった wiki はページ一つだけでそのページもコンテンツなし
元のリポジトリのドキュメントも大したこと書かれてないし 何ができるかよくわからない
README の簡易説明見た感じだと テキスト抽出はできるけど テキストボックス編集とかはできなそうに見える

pdfrw (1032/2018)

PyPDF2 に似た感じ

pyfpdf (416/2018)

PHP の FPDF の Python 版らしい
期待してなかったけどドキュメントが一番まともで 機能的にも編集はこれが一番機能ありそう
ただ残念なことに 既存 PDF の編集は FPDI というロード用の別モジュールが必要で Python 版だとこのモジュールが無いみたい
なので新規作成のみ