PDF, PS 和 DjVu
本文档介绍了用于查看、编辑和转换 PDF、PostScript (PS)、DjVu(déjà vu)和 XPS 文件的软件。
引擎
- DjVuLibre — 用于创建、操作和查看 DjVu 文档的套件。
- Ghostscript — PostScript 和 PDF 的解释器。提供 gs(1) 命令行界面,另请参阅
/usr/share/doc/ghostscript/*/Use.htm(在线),以及许多包装器脚本,如 ps2pdf 和 pdf2ps。
- libgxps — 基于 GObject 的库,用于处理和渲染 XPS 文档。
- libspectre — 用于渲染 Postscript 文档的小型库。
- MuPDF — MuPDF 是一个轻量级的 PDF、XPS 和 EPUB 查看器,包含一个软件库、命令行工具和查看器。
- Poppler — 基于 Xpdf 的 PDF 渲染库。要支持 CJK(中文、日文、韩文),请安装 poppler-data。
查看器
帧缓冲
- fbgs — 适用于 Linux 帧缓冲控制台的简易 PostScript/pdf 查看器。
- fbpdf — 基于 MuPDF 的小型帧缓冲 PDF 和 DjVu 查看器,具有 Vim 键绑定,用 C 语言编写
- jfbview — 帧缓冲 PDF 和图像查看器。功能包括类似 Vim 的控件、缩放以适应、TOC(大纲)视图和快速多线程渲染。
图形界面
- apvlv — 使用 GTK 库的轻量级文档查看器,具有 Vim 键绑定。支持 PDF、DjVu、EPUB、HTML 和 TXT。
- Atril — MATE 的简单多页文档查看器。支持 DjVu、DVI、EPS、EPUB、PDF、PostScript、TIFF、XPS 和 Comicbook。
- CorePDF — 基于 Qt 和 Poppler 的简单轻量级 PDF 查看器。C-Suite 的一部分。
- DjView — DjVu 文档查看器。
- Emacs — 另请参阅 pdf-tools 以获得改进的 PDF 支持(emacs-pdf-tools-gitAUR)和用于 djvu 支持的 djvu 包。
- ePDFView — 使用 Poppler 和 GTK 库的轻量级 PDF 文档查看器。开发已停止。
- Evince — GNOME 的文档查看器,使用 GTK。支持 DjVu、DVI、EPS、PDF、PostScript、TIFF、XPS 和 Comicbook。
- Foxit Reader — 小巧、快速(与 Acrobat 相比)的专有 PDF 查看器。Linux 版的发布(除安全更新外)已于 2020 年 11 月停止。
- GNOME Document Viewer — GNOME 的文档查看器,使用 GTK。evince 的现代分支,部分用 Rust 编写。支持 PDF、DjVu、TIFF 和漫画书(CBR、CBT、CBZ、CB7)。gnome 的一部分。
- gv — Ghostscript 解释器的图形用户界面,允许查看和导航 PostScript 和 PDF 文档。
- llpp — 基于 MuPDF 的非常快速的 PDF 阅读器,支持连续页面滚动、书签和整个文档的文本搜索。
- MuPDF — 用便携式 C 语言编写的非常快速的 EPUB、FictionBook、PDF、XPS 和 Comicbook 查看器。支持 CJK 字体和类 Vim 绑定。
- Okular — KDE 的通用文档查看器。支持 CHM、Comicbook、DjVu、DVI、EPUB、FictionBook、Mobipocket、ODT、PDF、Plucker、PostScript、TIFF 和 XPS。是 kde-graphics 的一部分。
- pdfpc — 支持多显示器的 PDF 文件演示者控制台。
- qpdfview — 标签式文档查看器。它使用 Poppler 支持 PDF,libspectre 支持 PS,DjVuLibre 支持 DjVu,CUPS 支持打印,并使用 Qt 工具包作为其界面。
- Sioyek — 基于 MuPDF 的轻量级 PDF 查看器,具有专为查看研究论文和技术书籍设计的特性,例如标记、书签、高亮、可搜索的命令面板、跳转到参考文献等。
- https://sioyek.info/ || sioyekAUR
- Xpdf — 可解码 LZW 和读取加密 PDF 的查看器。
- Xreader — X-Apps Project 的文档查看器。支持 DjVu、DVI、EPUB、PDF、PostScript、TIFF、XPS、Comicbook。
- Zathura — 高度可定制且功能强大的文档查看器(基于插件)。支持 PDF、DjVu、PostScript 和 Comicbook。
比较
| 名称 | PostScript | DjVu | XPS | PDF 表单 | PDF 注释 | 非矩形选择 | 许可证 | Wayland 原生 | |
|---|---|---|---|---|---|---|---|---|---|
| Adobe Reader | 自定义 | – | – | – | 是 | – | 是 | 专有 | – |
| apvlv | Poppler | – | DjVuLibre | – | 否 | – | 否(至少默认情况下不是) | GPLv2 | – |
| Atril | Poppler | libspectre | DjVuLibre | libgxps | 是 | – | – | GPLv2 | 是 |
| DjView | – | – | DjVuLibre | – | – | – | – | GPLv2 | – |
| Emacs | Ghostscript1 | DjVuLibre1 | – | 否 | 是 | 是 | GPLv3 | – | |
| Emacs pdf-tools | Poppler | – | – | – | – | 是 | 是 | GPLv3 | – |
| ePDFView | Poppler | – | – | – | 否 | – | – | GPLv2 | – |
| Foxit Reader | 自定义 | – | – | – | 是 | 是 | 是 | 专有 | – |
| GNOME Document Viewer | Poppler | libspectre | DjVuLibre | libgxps | 是 | 是 | 是 | GPLv2 | 是 |
| gv | Ghostscript | – | – | 否 | – | – | GPLv3 | – | |
| llpp | libmupdf | – | – | libmupdf | 是 | – | – | GPLv3 | – |
| MuPDF | 自定义 | – | – | 自定义 | 是(mupdf-gl) | 是(mupdf-gl) | 是(mupdf-gl) | AGPLv3 | 否 |
| Okular | Poppler | libspectre | DjVuLibre | 自定义 | 是 | 是 | 是 | GPL, LGPL | 是 |
| PDF4QT | 自定义 | – | – | – | 否 | 是 | 是 | LGPLv3 | 是 |
| pdfpc | Poppler | – | – | – | 否 | – | – | GPLv2 | – |
| qpdfview | Poppler | libspectre1 | DjVuLibre1 | – | 是 | 是 | – | GPLv2 | 是(缺少缩放支持) |
| Xpdf | 自定义 | – | – | – | 否 | – | – | GPLv3 | 是 |
| Xreader | Poppler | libspectre1 | DjVuLibre1 | libgxps1 | 是 | 是 | 是 | GPLv2 | – |
| Zathura | libmupdf1 / Poppler1 | libspectre1 | DjVuLibre1 | libmupdf1 | 否 | 否 | 是 | zlib | 是 |
- 可选依赖项需要安装
PDF 表单
上表中的“PDF 表单”列指的是 AcroForms 支持。如果您不需要直接从 PDF 中提取输入,您还可以使用 #Graphical PDF editing 中的应用程序将文本放在 PDF 之上。PDF 表单可以使用 LibreOffice Writer(View > Toolbars > Form Controls)和 高级 PDF 编辑器创建。
表单专有且已弃用的 XFA 格式并未被 Poppler 完全支持[1][2],仅被 Adobe Reader 和 Master PDF Editor 支持。
或者,Firefox 或 Chromium 等 Web 浏览器具有内置的 PDF 查看器,能够填写表单。
图形化 PDF 编辑
可导入 PDF 文件的编辑器
- Scribus 可导入和导出 PDF;文本被导入为多边形。[3]
- LibreOffice Draw 可导入和导出 PDF;文本被导入为文本;嵌入的字体会被替换。[4][5]
- Inkscape 可导入和导出 PDF;文本被导入为克隆的字形或文本;后者嵌入的字体会被替换。
- 像 GIMP 和 krita 这样的图形编辑器也可以导入和导出 PDF,但代价是栅格化。
基础编辑器
- flpsed — PostScript 和 PDF 注释器,仅支持文本框。
- HandyOutliner for DjVu / PDF — 使创建 DjVu 和 PDF 文档的书签的过程更轻松快捷。
- jPDF Tweak — Java Swing 应用程序,可以合并、拆分、旋转、重新排序、添加水印、加密、签名以及进行其他 PDF 文件调整。
- Paper Clip — PDF 文档元数据编辑器,用于编辑标题、作者、关键字等详细信息。
- PDF Arranger — 帮助合并或拆分 PDF 文档,并旋转、裁剪和重新排列页面。它是 PDF-Shuffler 的维护分支。
- PDF Chain — PDFtk 的 GTK 前端,用 C++ 编写,支持拼接、拆分、水印、附加文件等。
- PdfJumbler — 用于重新排列、合并、删除和旋转 PDF 文件页面的简单工具。
- PDF Mix Tool — PoDoFo 的 Qt 前端,用 C++ 编写,支持拆分、合并、旋转和混合 PDF 文件。
- PDFsam — 开源应用程序,用 Java 编写,支持合并、拆分和旋转。
- https://pdfsam.org/ || pdfsamAUR
- PDF Slicer — 用于提取、合并、旋转和重新排列 PDF 文档页面的简单应用程序。
- PDF Tricks — 使用 Ghostscript 对 PDF 文件进行小型操作的简单、高效的应用程序。
裁剪工具
- briss — Java GUI,用于将 PDF 文档页面裁剪到选定的一或多个区域。
- krop — 用于裁剪 PDF 文件页面的简单图形工具。
- pdfCropMargins — 自动裁剪 PDF 文件页边距。
- PdfHandoutCrop — 用于裁剪每张纸上有多个页面的 PDF 手册的工具。
高级编辑器
- Master PDF Editor — 功能强大的专有 PDF 编辑器。最新版本免费供非商业用途使用。-free 包已过时,但缺少水印。
- https://code-industry.net/free-pdf-editor/ || masterpdfeditorAUR,masterpdfeditor-qt_includeAUR, masterpdfeditor-freeAUR
- PDF4QT — 开源 PDF 编辑器。
- PDF Studio — 全能的专有 PDF 编辑器,类似于 Adobe Acrobat。
高级编辑器比较
| 名称 | 价格(美元,终身) | 页面标签 | 表单设计器 | 内容编辑(文本和图像) | 优化 PDF | 数字签名 PDF | 许可证 |
|---|---|---|---|---|---|---|---|
| Master PDF Editor | 85.34 | 否 | 是 | 是 | 是 | 是 | 专有 |
| Qoppa PDF Studio Standard | 99 | 是 | 否 | 否 | 否 | 否 | 专有 |
| Qoppa PDF Studio Pro | 139 | 是 | 是 | 是 | 是 | 是 | 专有 |
PDF 工具
另请参阅 Ghostscript。
- Camelot — Camelot:人类可读的 PDF 表格提取。
- Coherent PDF — 专有非免费命令行工具,用于操作 PDF 文件,包括合并、加密、解密、缩放、裁剪、旋转、书签、盖章、徽标、页码。
- DiffPDF — 比较两个 PDF 文件中每页的文本或视觉外观。
- mupdf-tools — 作为 MuPDF 的一部分开发的工具,包含 mutool(1) 和 muraster。
- pdf2svg — 将 PDF 文件转换为 SVG 文件。
- pdfcmd — 用于连接、剪切、重新排序或合并 PDF 文件的命令行工具。
- pdfcpu — 用于创建和修改 PDF 的命令行工具。
- pdf_extbook — 提取带书签的 PDF 页面。
- https://github.com/raffaem/pdf_extbook[死链接 2025-08-16—HTTP 404] || pdf_extbook-gitAUR
- pdfgrep — 用于在 PDF 文件中搜索文本的命令行实用程序。
- pdfjam — 可用于 n-up、连接、旋转和翻转 PDF,并将其排列成适合书籍装订的格式。
- pdfminer.six — pdfminer 的社区维护分支,一个用于 PDF 文件的文本提取工具。
- PDFtk — 用于处理日常 PDF 文档的简单工具。
- QPDF — 内容保留的 PDF 转换系统。
- Stapler — PDFtk 的轻量级替代品,使用 PyPDF2 库。
- Tabula — Tabula 是一个用于释放 PDF 文件中数据表的工具。
- https://tabula.technology || tabulaAUR, tabula-javaAUR
- Vector Slicer — 从 SVG 导出多页 PDF。
- verapdf — 一个专门构建的开源文件格式验证器,涵盖所有 PDF/A 和 PDF/UA 部分和一致性级别。
- https://verapdf.org || verapdfAUR
- wrt2pdf — 一个命令行工具,用于从纯文本文件创建 PDF。
命令行片段
从图像创建 PDF
$ gm convert 1.jpg 2.jpg 3.jpg out.pdf
使用 ImageMagick
$ magick 1.jpg 2.jpg 3.jpg out.pdf
请注意,ImageMagick 的输出是有损的。要从 JPEG 无损创建 PDF,请使用 img2pdf。
合并 PDF
使用 Ghostscript
$ gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=out.pdf -dBATCH 1.pdf 2.pdf 3.pdf
使用 PDFtk
$ pdftk 1.pdf 2.pdf 3.pdf cat output out.pdf
使用 Poppler
$ pdfunite 1.pdf 2.pdf 3.pdf out.pdf
使用 QPDF
$ qpdf --empty --pages 1.pdf 2.pdf 3.pdf -- out.pdf
从 PDF 提取文本
使用 Poppler 并保持布局
$ pdftotext -layout in.pdf out.txt
另请参阅 pdftotext(1)。
使用 calibre
$ ebook-convert in.pdf out.txt
结果因应用程序和 PDF 文件而异。
解密 PDF
本节列出了将 PDF 解密为未加密文件的命令。请注意,大多数 PDF 查看器也支持加密 PDF。
使用 PDFtk
$ pdftk in.pdf input_pw password output out.pdf
使用 Poppler 解密为 PostScript
$ pdftops -upw password in.pdf out.ps
使用 QPDF
$ qpdf --decrypt --password=password in.pdf out.pdf
加密 PDF
用户密码用于加密,所有者密码用于限制文档解密后的操作,有关更多信息,请参阅 Wikipedia:PDF#Encryption and signatures。
使用 PDFtk
$ pdftk in.pdf output out.pdf user_pw password
使用 PoDoFo
$ podofoencrypt -u user_password -o owner_password in.pdf out.pdf
使用 QPDF
$ qpdf --encrypt user_password owner_password key_length -- in.pdf out.pdf
其中 key_length 可以是 40、128 或 256。
从 PDF 提取图像
使用 poppler,将图像保存为 JPEG
$ pdfimages infile.pdf -j outfileroot
从 PDF 提取页面范围,拆分多页 PDF 文档
使用 Ghostscript 作为单个文件[6]
$ gs -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dSAFER -dFirstPage=first -dLastPage=last -sOutputFile=outfile.pdf infile.pdf
使用 PDFtk 作为单个文件
$ pdftk infile.pdf cat first-last output outfile.pdf
使用 Poppler 作为单独的文件
$ pdfseparate -f first -l last infile.pdf outfileroot-%d.pdf
使用 QPDF 作为单个文件
$ qpdf --empty --pages infile.pdf first-last -- outfile.pdf
使用 mutool 作为单个文件
$ mutool clean -g infile.pdf outfile.pdf first-last
排版 PDF (n-up)
PDF 排版是将多个输入页面合并到一个输出页面上的过程,该页面被组织成一个行x列的网格。
可以使用 pdfjam (请注意,诸如 pdfnup 和 pdfbook 之类的包装器脚本已弃用)
$ pdfjam --nup rowsxcolumns input.pdf --outfile output.pdf
或者使用 pdfsak[死链接 2025-04-06—HTTP 404]
$ pdfsak --input-file input.pdf --output output.pdf --nup rows columns
检查元数据
使用 ExifTool
$ exiftool -All file.pdf
使用 Poppler
$ pdfinfo file.pdf
删除元数据
使用 ExifTool
使用 ExifTool
$ exiftool -All= -overwrite_original input.pdf $ mv input.pdf /tmp/temp.pdf $ qpdf --linearize /tmp/temp.pdf input.pdf
需要执行线性化步骤以防止恢复已删除的元数据。请参阅 此 SuperUser 问题和相关的 ExifTool 论坛帖子。
使用 pdftk
许多 PDF 文件同时使用 Info 字典(旧方法)和 XMP 流(新方法)来存储文档元数据。此 pdftk 命令将完全移除 XMP 流。它不会移除 Info 字典。
请注意,PDF 中的对象可能具有自己的、独立的 XMP 元数据流,而此命令不会移除这些对象。它仅移除 PDF 的文档级 XMP 流。
$ pdftk input.pdf drop_xmp output output.pdf
减小 PDF 大小
可以通过设置适当的优化或压缩级别来减小 PDF 大小。
使用 Ghostscript,其中一个
$ ps2pdf -dPDFSETTINGS=/screen in.pdf out.pdf
或者
$ gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/printer -sOutputFile=out.pdf in.pdf
有关不同设置,请参阅 文档。
还有一个 shrinkpdfAUR,这是一个包装 gs 的脚本。
光栅化 PDF
这些命令会将您的 PDF 转换为图像。
使用 GraphicsMagick 将特定页面转换为图像文件
$ gm convert -density dpi infile.pdf[page] outfile.jpg
使用 ImageMagick 将特定页面转换为图像文件
$ magick convert -density dpi infile.pdf[page] outfile.jpg
使用 ImageMagick 将所有页面转换为另一个 PDF 文件,该文件由每页一个图像文件组成
$ magick convert -density dpi infile.pdf outfile.pdf
使用 Poppler 将所有页面转换为每页一个图像文件
$ pdftoppm -jpeg -r dpi infile.pdf outfileroot
使用 Poppler 将特定页面转换为图像文件
$ pdftoppm -jpeg -r dpi -f page -singlefile infile.pdf outfileroot
拆分 PDF 页面
使用 mupdf-tools 将每一页垂直拆分为两页
$ mutool poster -y 2 in.pdf out.pdf
可用于撤销简单的 拼版。
添加图像
将图像添加到 PDF 中的任何位置都可以完成
- 使用 ImageMagick (convert)、xvAUR 和 pdftk。(包装器脚本)
- 使用 xournalAUR
- 使用 LibreOffice
有关这些和其他解决方案的详细信息,请参阅 StackExchange。
向 PDF 添加数字签名
jsignpdfAUR 可以通过 GUI 和 CLI 对 PDF 文件进行 X.509 证书数字签名。
Okular 和 MuPDF 等阅读器可以通过数字签名对 PDF 进行签名。这需要一个 PFX 证书,该证书可以使用 OpenSSL 命令生成
$ openssl req -x509 -days 365 -newkey rsa:2048 -keyout cert.pem -out cert.pem $ openssl pkcs12 -export -in cert.pem -out cert.pfx
MuPDF 用户可以使用图形界面或其 mutool-sign[死链接 2025-08-16—HTTP 404] 工具使用 cert.pfx 对 PDF 进行签名。
Okular 用户必须将 cert.pfx 导入到证书存储中,例如默认的 Firefox 配置文件中的证书存储。[7][死链接 2024-01-13—HTTP 404] 在 Firefox 中,可以通过 设置 > 隐私与安全 > 查看证书 > 您的证书 > 导入 并选择 cert.pfx 来完成此操作。之后,Okular 在签名 PDF 时将提供此证书供使用。
Libreoffice 也可以签名 PDF。[8]
从 PDF 中移除注释
$ pdftk in.pdf output - uncompress | sed '/^\/Annots/d' | pdftk - output out.pdf compress
使用 perl-cam-pdfAUR
$ rewritepdf.pl -C in.pdf out.pdf
有关更多信息,请参阅 https://superuser.com/a/1051543。
添加页码
使用 pdfsak[死链接 2025-04-06—HTTP 404]
$ pdfsak --input-file input.pdf --output output.pdf --text "\large \$page/\$pages" br 0.99 0.99 --latex-engine xelatex --font "Noto Regular"
添加页码标签
页码标签是 PDF 阅读器导航栏中显示的逻辑页码。例如,如果 PDF 的前几页是罗马数字(I、II 等)编号的索引,而编号为“1”的页面对应于 PDF 页码大于 1 的页面,并且您希望导航栏中显示的页码与物理页面上显示的页码对应,那么它们会很有用。
这不应与在物理页面上添加页码混淆。请参阅 PDF 参考的 第 12.4.2 节以更好地理解页码标签。
- 使用 pagelabels-py,假设我们有一个名为
my_document.pdf的 PDF 文件,它有 12 页。- 第 1 页到第 4 页应标记为
Intro I到Intro IV。 - 第 5 页到第 9 页应标记为
2到6。 - 第 10 页到第 12 页应标记为
Appendix A到Appendix C - 我们可以发出以下命令列表
$ python3 -m pagelabels --delete "my_document.pdf" $ python3 -m pagelabels --startpage 1 --prefix "Intro " --type "roman uppercase" "my_document.pdf" $ python3 -m pagelabels --startpage 5 --firstpagenum 2 "my_document.pdf" $ python3 -m pagelabels --startpage 10 --prefix "Appendix " --type "letters uppercase" "my_document.pdf"
- 注意 pagelabels-py 将把您的文件转换为 PDF 1.3 规范
- 第 1 页到第 4 页应标记为
- 使用 pdftk,创建一个包含标签的
metadata.txt文件PageLabelBegin PageLabelNewIndex: 1 PageLabelStart: 1 PageLabelPrefix: Cover PageLabelNumStyle: NoNumber PageLabelBegin PageLabelNewIndex: 2 PageLabelStart: 1 PageLabelPrefix: Back Cover PageLabelNumStyle: NoNumber PageLabelBegin PageLabelNewIndex: 3 PageLabelStart: 1 PageLabelNumStyle: LowercaseRomanNumerals PageLabelBegin PageLabelNewIndex: 27 PageLabelStart: 1 PageLabelNumStyle: DecimalArabicNumerals
- 其中:
- PageLabelBegin
- 标志着将要定义一个新的页码标签
- PageLabelNewIndex
- 是从哪个 PDF 页面索引开始应用编号样式,从一开始计数。编号样式将一直持续到下一个页码标签,或者,如果没有更多页码标签,则一直持续到文档末尾。
- PageLabelStart
- 是起始编号。例如,如果您在此处指定 5,则页面将从 5, 6, 7, ... 开始编号。
- PageLabelPrefix
- 是放在页码标签数字前面的文本。
- PageLabelNumStyle
- 可以是
DecimalArabicNumerals、UppercaseRomanNumerals、LowercaseRomanNumerals、UppercaseLetters、LowercaseLetters或NoNumber。
- 然后使用
pdftk book.pdf update_info_utf8 metadata.txt output book-with-metadata.pdf
- 其中:
有关更多详细信息,请参阅 此 SuperUser 问题。
提取书签
使用 pdftk
$ pdftk file.pdf dump_data_utf8 | grep '^Bookmark'
使用 qpdf
$ qpdf --json --json-key=outlines file.pdf
有关更多信息,请参阅 https://unix.stackexchange.com/questions/143886/how-to-extract-bookmarks-from-a-pdf-file。
添加书签
使用 pdftk
创建一个名为 bookmark_definitions.txt 的文本文件,其中包含以下格式的书签定义
BookmarkBegin BookmarkTitle: Chapter 1 BookmarkLevel: 1 BookmarkPageNumber: 1 BookmarkBegin BookmarkTitle: Chapter 1.1 BookmarkLevel: 2 BookmarkPageNumber: 2 BookmarkBegin BookmarkTitle: Chapter 1.2 BookmarkLevel: 2 BookmarkPageNumber: 3 BookmarkBegin BookmarkTitle: Chapter 1.3 BookmarkLevel: 2 BookmarkPageNumber: 4 BookmarkBegin BookmarkTitle: Chapter 1.3.1 BookmarkLevel: 3 BookmarkPageNumber: 5 BookmarkBegin BookmarkTitle: Chapter 2 BookmarkLevel: 1 BookmarkPageNumber: 6
其中:
- BookmarkBegin
- 信号是一个新的书签定义
- BookmarkTitle
- 书签的标题
- BookmarkLevel
- 书签在层次结构中的级别
- BookmarkPageNumber
- 书签重定向到的页面编号
在此示例中,上述文件将创建以下书签结构
- Chapter 1
- Chapter 1.1
- Chapter 1.2
- Chapter 1.3
- Chapter 1.3.1
- Chapter 2
使用以下命令应用书签
$ pdftk input.pdf update_info_utf8 bookmark_definitions.txt output output.pdf
提取书签中的页面
要提取书签中的页面,您可以使用 pdf_extbook-gitAUR。
使用 pdf_extbook file,系统会提示您选择要提取其页面的书签以及保存位置。要提取给定层级的全部书签
$ pdf_extbook file -a level output_file_stem
删除空白页
可以使用以下脚本从 PDF 文件中删除空白页(致谢:SuperUser 帖子)
#!/bin/sh
IN="$1"
filename=$(basename "${IN}")
filename="${filename%.*}"
PAGES=$(pdfinfo "$IN" | grep ^Pages: | tr -dc '0-9')
non_blank() {
for i in $(seq 1 $PAGES); do
PERCENT=$(gs -o - -dFirstPage=${i} -dLastPage=${i} -sDEVICE=ink_cov "$IN" | grep CMYK | nawk 'BEGIN { sum=0; } {sum += $1 + $2 + $3 + $4;} END { printf "%.5f\n", sum } ')
if [ $(echo "$PERCENT > 0.001" | bc) -eq 1 ]; then
echo $i
#echo $i 1>&2
fi
echo -n . 1>&2
done | tee "$filename.tmp"
echo 1>&2
}
set +x
pdftk "${IN}" cat $(non_blank) output "${filename}_noblanks.pdf"
使用方法如下:pdf_remove_blank_pages input.pdf。
该脚本需要 pdftk、nawk 和 ghostscript。
查找 PDF 中使用的字体
来自 poppler 的 pdffonts(1) 命令,可用于查找 PDF 使用的字体以及它们是否已嵌入其中。
$ pdffonts file.pdf
name type encoding emb sub uni object ID ------------------------------------ ----------------- ---------------- --- --- --- --------- Times-Roman Type 1 Custom no no no 8 0 Times-Italic Type 1 Standard no no no 9 0 Times-Bold Type 1 Standard no no no 7 0 Helvetica Type 1 Standard no no no 34 0 Helvetica-Bold Type 1 Standard no no no 35 0
当 PDF 文本显示出现问题时,可以使用此方法来确定是否需要安装缺失的 字体或其 度量兼容等效字体。
修复损坏的 PDF 文件
使用 ghostscript
$ gs -o repaired.pdf -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress corrupted.pdf
使用 poppler
$ pdftocairo -pdf corrupted.pdf repaired.pdf
使用 mupdf-tools
$ mutool clean corrupted.pdf repaired.pdf
参考:https://superuser.com/q/278562
将 PDF 转换为 PDF/A 标准
使用 ocrmypdfAUR
$ ocrmypdf --tesseract-timeout=0 --remove-background document.pdf document_pdfa.pdf
参考:https://ocrmypdf.cn/en/latest/cookbook.html#don-t-actually-ocr-my-pdf
验证 PDF/A 合规性
使用 verapdfAUR,您可以验证 PDF 对不同 PDF/A 标准的合规性
$ verapdf --flavour 1a --format text document.pdf
DjVu 工具
- pdf2djvu — 从 PDF 文件创建 DjVu 文件。
将 DjVu 转换为图像
将 DjVu 分解为单独的页面
$ djvmcvt -i input.djvu /path/to/out/dir output-index.djvu
将 DjVu 页面转换为图像
$ ddjvu --format=tiff page.djvu page.tiff
将 DjVu 页面转换为 PDF
$ ddjvu --format=pdf inputfile.djvu ouputfile.pdf
您还可以使用 --page 来导出特定页面
$ ddjvu --format=tiff --page=1-10 input.djvu output.tiff
这将把第 1 到第 10 页转换为一个 tiff 文件。
处理图像
您可以使用 scantailor-advanced 来
- 修复方向
- 拆分页面
- 倾斜校正
- 裁剪
- 调整边距
从图像创建 DjVu
有一个有用的脚本 img2djvu-gitAUR。
$ img2djvu -c1 -d600 -v1 ./out
它将从 ./out 目录中的所有文件创建 600 DPI 的 out.djvu。
或者,您可以尝试 didjvuAUR,它似乎可以创建更小的文件,尤其是在图像具有清晰背景的情况下。
PostScript 工具
- Ghostscript
- pstotext — 将 PostScript 文件转换为文本。
ps2pdf
ps2pdf 是 ghostscript 的一个包装器,用于将 PostScript 转换为 PDF
$ ps2pdf -sPAPERSIZE=a4 -dOptimize=true -dEmbedAllFonts=true YourPSFile.ps
说明
- 使用
-sPAPERSIZE=something定义纸张大小。有关有效的 PAPERSIZE 值,请参阅 [10][死链接 2022-09-22—HTTP 404]。 -dOptimize=true使创建的 PDF 针对加载进行优化。-dEmbedAllFonts=true使字体始终显示美观。
-sPAPERSIZE 时,您将遇到问题,因为 EPS 文件通常不包含纸张方向信息。一种解决方法是在 ghostscript 设置中创建一个新的纸张(例如,命名为“slide”)并将其用作 -sPAPERSIZE=slide。库
C/C++
- libharu — 用于生成 PDF 文档的 C 库。
- https://github.com/libharu/libharu || libharu, Lua 绑定:lua-hpdfAUR
- PoDoFo — 一个用于处理 PDF 文件格式的 C++ 库。
Python
- borb — borb 是一个用于在 Python 中读取、创建和操作 PDF 文件的库。
- pdfrw — 一个纯 Python 库,用于读取和写入 PDF。
- PyPDF — 一个纯 Python 库,构建为 PDF 工具包。
- PyX — 用于创建 PostScript 和 PDF 文件的 Python 库。
- ReportLab — 一个久经考验的、功能强大的 PDF 生成解决方案
Java
- iText Core — iText 是一个更通用、更具可编程性且适合企业级的 PDF 解决方案,允许您将其实用功能嵌入到自己的软件中,以实现数字化转型。
- OpenPDF — OpenPDF 是一个免费的 Java 库,用于创建和编辑 PDF 文件,具有 LGPL 和 MPL 开源许可证。OpenPDF 基于 iText 的一个分支。