我可以使用 awk 修改 PDF 中的 FitH 值吗?

我可以使用 awk 修改 PDF 中的 FitH 值吗?

我曾经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.csvPDF 中第一列中的数字并将其替换为第二列中的数字。 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])

相关内容