私はpandoc
Markdown文書をフォーマットされたPDFに変換するエンジンとしてpdfroffを使用したことがあります。コードは次のとおりです
pandoc -s --toc --pdf-engine=pdfroff -o test.pdf test.md
出力ファイルはtest.pdf
PDFブックマークとリンクを少し不適切にレンダリングします。元より約50単位高いです。を使って、次のようなブックマークを表示するファイルをjpdftweak
出力できました。marks.csv
1;O;Table of Contents;1 FitH 707.000061
1;O;Section 1;2 FitH 607.0
1;O;Section 2;2 FitH 565.040039
2;O;Subsection 2.1;2 FitH 524.08
2;O;Subsection 2.2;2 FitH 484.120026
1;O;Conclusion;2 FitH 443.160034
使用awk
:最後の列のみを表示できます。
awk -F";" '{print $4}' marks.csv | awk -F" " '{print $3}'
または、変更されたFitH値を持つ他のフィールドを含めるように変更してから、別のファイルに出力することもできます。
awk -F";" '{print $4}' marks.csv | awk -F" " '{print $3","$3+50}' > dictionary.csv
~につながる
707.000061,757
607.0,657
565.040039,615.04
524.08,574.08
484.120026,534.12
443.160034,493.16
メモ:このような値に50を加えると、数値の小数点がなくなることがわかりますが、位置の物理的な変化が非常に小さいので、これは私にとってあまり重要ではありません。手動ですべての値を変更できvim
、うまく機能することを指摘したいと思います。私はこれをスクリプトで自動化したいと思います(もう一度言うが、使用するのが最善ですawk
)。
vim
生成されたPDFを読み取ってpdfroff
すべての出力を表示できるので、それを使用してPDFから最初の列の数字をawk
検索しdictionary.csv
、2番目の列の数字に置き換えたいと思います。 PDFの関連行はすべて次のとおりです。
<</D [23 0 R /FitH 565.040039]>>endobj
したがって、565.040039
ブックマーク値として1回、リンク値として1回、2回表示されます。この数値は最初の列にも表示され、dictionary.csv
PDFのすべてのインスタンスを自動的に見つけて2番目の値(615.04
)に置き換えてから、dictionary.csv
PDFファイル全体のすべての行に対してこの操作を繰り返したいと思います。
でこれを行う最良の方法は何ですかawk
?
答え1
最新のGNU Linuxでは、bashプロンプトで次のことができます。
awk '{print $NF}' marks.csv | awk -F. '{print "s/"$0"/"($1+50)"."$2"/g"}' >replace.sed
while read -rs f; do
sed -f replace.sed "$f" >"$(sed 's/\.[pP][dD][fF]$//' <<<"$f")_adjust.pdf"
done < <(/bin/ls *.[pP][dD][fF])