27
1月
2022
19:21

从 Linux 命令行操作 PDF 文件

27 1月 2022 19:21

在工作中,我经常处理PDF文件——合并文件并压缩它们。 为了不重新启动到 Windows(我之前在 Windows 中使用过“PDF 工具免费”实用程序),我通过选择适当的命令来自动化此过程,以批量转换和处理 PDF 到 JPEG、JPEG 到 PDF、PDF 到 PDF(减小文件大小) )。

项目 功能 终端命令
1. 合并多个 PDF 文件到单个文件输出.pdf
infile1.pdf+infile2.pdf+infile3.pdf = output.pdf
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile='output.pdf' 'infile1.pdf' 'infile2.pdf' 'infile3.pdf'

или

qpdf --empty --pages infile1.pdf infile2.pdf -- output.pdf
将 PDF 文件中的多个 页面**合并到单个文件输出.pdf 中

infile1.pdf(p.1, 12-13)+infile2.pdf(p.1-10)+infile3.pdf(p.44) = output.pdf
qpdf --empty --pages infile1.pdf 1,12-13 infile2.pdf 1-10 infile3.pdf 44 -- output.pdf
2. 分割页面形成PDF文件,从5页到7页和12页到新文件output.pdf qpdf input.pdf --pages . 5-7,12 -- output.pdf

或者

qpdf --empty --pages input.pdf 5-7,12 -- output.pdf
重新排序 PDF 文件中的页面,从 1,2,3,5 到 4,3,2,1 并将结果保存到新文件 output.pdf qpdf 'infile.pdf' --pages . 4,3,2,1 -- output.pdf
从包含 16 页的输入文件中删除第一页 qpdf infile.pdf out.pdf --pages infile.pdf 2-17 --

或者

qpdf 'infile.pdf' --pages . 2-17 -- output.pdf
从包含 16 页的 PDF 文件中删除最后一页 qpdf infile.pdf out.pdf --pages infile.pdf 1-16 --
从包含 17 页的输入 PDF 文件中删除一些页面:删除页码 6 和范围 10-12 的页面 qpdf infile.pdf out.pdf --pages infile.pdf 1-5,7-9,13-17 --
3. 将 PDF 文件中的所有页面旋转 180 度 qpdf in.pdf out.pdf --rotate=+180
将第 #1 页和第 #2 页旋转至 90 度 顺时针 qpdf in.pdf' out.pdf --rotate=+90:1-2
将第 3 页旋转至 90 度 逆时针 qpdf in.pdf' out.pdf --rotate=-90:3
将当前目录下PDF文件中的所有页面顺时针旋转90度 for f in $(ls ./*.pdf); do qpdf $f $f.out --rotate=+90; rm $f; mv $f.out $f; done
4. 将 PDF 文件拆分为页面,每个页面保存在单独的文件中:infile.pdf-> out-1.pdf, out-2.pdf, ..., out-n.pdf qpdf infile.pdf out.pdf --split-pages
5. 使用给定的输出文件名(掩码)将 PDF 拆分为页面 outXX.pdf:
infile.pdf -> out01.pdf, out02.pdf, ..., outNN.pdf (Split pages with file mask %d)
qpdf --split-pages=1 infile.pdf out%d.pdf
6. 将PDF转换为JPG,像素密度300 dpi,JPEG质量q=30(高压缩),将每页图像放在“images”文件夹中,所有文件以“pg-”为前缀进行分页 pg-01 .jpg, pg-02.jpg, etc. mkdir -p images && pdftoppm -jpeg -r 300 -jpegopt quality=30 'infile.pdf' images/pg
7. 批量将每个JPG文件转换为PDF文件 for f in $(ls images/*.jpg); do convert $f $f.pdf ; done
8. 将文件夹“images”中的所有 PDF 文件合并为单个 PDF 文件 qpdf --empty --pages ./images/*.pdf -- output.pdf
9. 重新压缩单个PDF文件 (注意:执行此命令有时不会减小文件大小:这取决于源文件的压缩率) gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/prepress -dNOPAUSE -dQUIET -dBATCH -sOutputFile=compressed.pdf infile.pdf
10. 重新压缩当前文件夹中的所有 PDF 文件并将结果放入“压缩”文件夹中)。 将结果放入名为“compressed”的文件夹中。

参见上面的注释。
mkdir -p compressed && for f in $(ls out*.pdf); do gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/prepress -dNOPAUSE -dQUIET -dBATCH -sOutputFile=./compressed/$f $f; done
11. 使用单个命令超压缩 PDF 文件 mkdir -p images && pdftoppm -jpeg -r 96 -jpegopt quality=30 'infile.pdf' images/pg && for f in $(ls images/pg-*.jpg); do convert $f $f.pdf ; done && qpdf --empty --pages ./images/*.pdf -- outfile.pdf && rm -R images
12. 将JPG分辨率降低至25%按顺序重新编号并保存为JPEG质量q=50的JPG文件(高压缩),将图像放在“images”文件夹中 mkdir -p images && i=1 ; for f in $(ls *.jpg); do convert -resize 25% -quality 50 $f ./images/img$i.jpg ; let i=i+1; done
13. 将 JPG 分辨率降低至 700x525,应用自动色阶,应用锐化滤镜,按顺序重新编号并保存到 JPG 文件,JPEG 质量 q=50(高压缩), 将图像放入文件夹“图像 mkdir -p images && i=1 ; for f in $(ls *.jpg); do convert -resize 700x525 -auto-level -unsharp 0.65x0.65+1+0.9+0.04 -quality 50 $f ./images/img$i.jpg ; let i=i+1; done
14. 新:对 JPEG 文件应用自动级别,将 JPG 压缩级别增加到 40(高压缩),以原始名称保存文件(覆盖文件)” mogrify -auto-level -quality 40% *.jpg
15. 一次操作:压缩所有 PDF 文件,应用 自动级别,并将结果放入带有名称的文件夹“out”中 out*.pdf for p in $(ls *.pdf); do mkdir -p images && pdftoppm -jpeg -r 150 -jpegopt quality=100 $p images/pg && for f in $(ls images/pg-*.jpg); do mogrify -auto-level -quality 37% $f; convert $f $f.pdf ; done && qpdf --empty --pages ./images/*.pdf -- 'out'$p && echo $p && echo $p && rm -R images; done
16. 一次操作:压缩所有 PDF 文件 *.pdf,将页面转换为灰度, 并应用自动色阶和锐化滤镜,并将结果放置在同名文件夹中 out*.pdf shopt -s nocaseglob && for p in $(ls *.pdf); do mkdir -p images && pdftoppm -jpeg -r 150 -jpegopt quality=100 $p images/pg && for f in $(ls images/pg-*.jpg); do mogrify -colorspace gray -auto-level -sharpen 15% -quality 30% $f; convert $f $f.pdf ; done && qpdf --empty --pages ./images/*.pdf -- 'out'$p && echo $p && rm -R images; done
17. 一步操作:压缩所有 PDF 文件 *.pdf,并应用自动色阶、调整大小和锐化滤镜,放置在名为“压缩”的文件夹中 mkdir compressed && shopt -s nocaseglob && for p in $(ls *.pdf); do mkdir -p images && pdftoppm -jpeg -r 150 -jpegopt quality=100 $p images/pg && for f in $(ls images/pg-*.jpg); do mogrify -auto-level -quality 37% $f; convert $f $f.pdf ; done && qpdf --empty --pages ./images/*.pdf -- './compressed/'$p && echo $p && rm -R images; done

如果运行其中一个命令时出现错误 "convert-im6.q16: attempt to perform an operation not allowed by the security policy PDF' @ error/constitute.c/IsCoderAuthorized/421."`, 您需要执行以下操作:

  • 打开文件policy.xml 例如,在编辑器中,nano. XML 文件位置取决于 ImageMagick 的版本 /etc/ImageMagick-6/policy.xml (or -7):
    sudo nano /etc/ImageMagick-6/policy.xml

    sudo nano /etc/ImageMagick-7/policy.xml
  • 找出 <policymap> 部分并转到之前的末尾 </policymap>
  • 插入字符串
    <policy domain="coder" rights="read | write" pattern="PDF" />
  • 保存更改 policy.xml f文件并退出编辑器。

最后更改:2023 年 11 月 21 日 - 更改了第 16 行并添加了第 17 行。
简体中文翻译: 02/16/2024。



相关出版物