awkを使用してPDFのFitH値を変更できますか?

awkを使用してPDFのFitH値を変更できますか?

私はpandocMarkdown文書をフォーマットされたPDFに変換するエンジンとしてpdfroffを使用したことがあります。コードは次のとおりです

pandoc -s --toc --pdf-engine=pdfroff -o test.pdf test.md

出力ファイルはtest.pdfPDFブックマークとリンクを少し不適切にレンダリングします。元より約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.csvPDFのすべてのインスタンスを自動的に見つけて2番目の値(615.04)に置き換えてから、dictionary.csvPDFファイル全体のすべての行に対してこの操作を繰り返したいと思います。

でこれを行う最良の方法は何ですか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])

関連情報