我曾经pandoc
使用 pdfroff 作为引擎将 Markdown 文档转换为格式化 PDF。其代码是:
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
可以读取pdfroff
生成的 PDF 并显示所有输出,所以我想用来awk
搜索dictionary.csv
PDF 中第一列中的数字并将其替换为第二列中的数字。 pdf中的相关行都是这样的:
<</D [23 0 R /FitH 565.040039]>>endobj
因此它565.040039
出现两次:一次作为书签值,一次作为链接值。该数字也出现在第一列中dictionary.csv
,我想自动查找 PDF 中的所有实例并将其替换为第二个值 ( 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])