PDF、PS 和 DjVu

来自 ArchWiki
(重定向自 PostScript

本文介绍用于查看、编辑和转换 PDFPostScript (PS)、DjVu (déjà vu) 和 XPS 文件的软件。

引擎

  • DjVuLibre — 用于创建、操作和查看 DjVu 文档的套件。
https://djvu.sourceforge.net/ || djvulibre
  • Ghostscript — PostScript 和 PDF 解释器。提供 gs(1) 命令行界面,另请参阅 /usr/share/doc/ghostscript/*/Use.htm (在线),以及许多包装脚本,如 ps2pdfpdf2ps
https://ghostscript.com/ || ghostscript
  • libgxps — 基于 GObject 的库,用于处理和渲染 XPS 文档。
https://wiki.gnome.org/Projects/libgxps || libgxps
  • libspectre — 用于渲染 Postscript 文档的小型库。
https://www.freedesktop.org/wiki/Software/libspectre || libspectre
  • Mupdf — MuPDF 是一款轻量级的 PDF、XPS 和 EPUB 查看器,由软件库、命令行工具和查看器组成。
https://mupdf.com/ || libmupdf
  • Poppler — 基于 Xpdf 的 PDF 渲染库。为了使 Poppler 支持 CJK(中文、日语、韩语),安装 poppler-data
https://poppler.freedesktop.org/ || poppler

查看器

帧缓冲

  • fbgs — 适用于 Linux 帧缓冲控制台的简易 PostScript/pdf 查看器。
https://www.kraxel.org/blog/linux/fbida/ || fbida
  • fbpdf — 基于 MuPDF 的小型帧缓冲 PDF 和 DjVu 查看器,具有 Vim 快捷键,并用 C 语言编写
https://repo.or.cz/w/fbpdf.git || fbpdf-gitAUR
  • jfbview — 帧缓冲 PDF 和图像查看器。功能包括类似 Vim 的控件、缩放以适应、TOC(目录)视图和快速多线程渲染。
https://github.com/jichu4n/jfbview || jfbviewAUR

图形界面

注意: 一些 网页浏览器 可以显示 PDF 文件,例如使用 PDF.js
  • apvlv — 使用 GTK 库的轻量级文档查看器,具有 Vim 快捷键。支持 PDF、DjVu、EPUB、HTML 和 TXT。
https://naihe2010.github.io/apvlv/ || apvlvAUR
  • Atril — MATE 的简单多页文档查看器。支持 DjVu、DVI、EPS、EPUB、PDF、PostScript、TIFF、XPS 和 Comicbook。
https://github.com/mate-desktop/atril || atril
  • CorePDF — 基于 Qt 和 poppler 的简单轻量级 PDF 查看器。C-Suite 的一部分。
https://cubocore.gitlab.io/ || corepdfAUR
  • Deepin Document Viewer — 一款简单的 PDF 和 DjVu 阅读器,支持书签、高亮和注释。
https://github.com/linuxdeepin/deepin-reader || deepin-reader
  • DjView — DjVu 文档查看器。
https://djvu.sourceforge.net/djview4.html || djview
https://gnu.ac.cn/software/emacs/ || emacs
  • ePDFView — 使用 Poppler 和 GTK 库的轻量级 PDF 文档查看器。开发已停止。
http://freecode.com/projects/epdfview || epdfview-gitAUR
https://www.foxitsoftware.com/pdf-reader/ || foxitreaderAUR
  • GNOME 文档查看器 — GNOME 的文档查看器,使用 GTK。支持 DjVu、DVI、EPS、PDF、PostScript、TIFF、XPS 和 Comicbook。gnome 的一部分。
https://apps.gnome.org/Evince/ || evince
  • gv — Ghostscript 解释器的图形用户界面,允许查看和浏览 PostScript 和 PDF 文档。
https://gnu.ac.cn/software/gv/ || gvAUR
  • llpp — 非常快速的 PDF 阅读器,基于 MuPDF,支持连续页面滚动、书签和全文搜索。
https://repo.or.cz/w/llpp.git || llppAUR
  • MuPDF — 非常快速的 EPUB、FictionBook、PDF、XPS 和 Comicbook 查看器,用可移植 C 语言编写。具有 CJK 字体支持和类似 vim 的绑定。
https://mupdf.com/ || mupdf
  • Okular — KDE 的通用文档查看器。支持 CHM、Comicbook、DjVu、DVI、EPUB、FictionBook、Mobipocket、ODT、PDF、Plucker、PostScript、TIFF 和 XPS。kde-graphics 的一部分。
https://okular.kde.org/ || okular
  • Papers — GNOME 的文档查看器,使用 GTK。支持 DjVu、PDF、TIFF 和 Comicbook。
https://apps.gnome.org/Papers/ || papers
  • pdfpc — 具有多显示器支持的 PDF 文件演示者控制台。
https://pdfpc.github.io/ || pdfpc
  • qpdfview — 标签式文档查看器。它使用 Poppler 支持 PDF,libspectre 支持 PS,DjVuLibre 支持 DjVu,CUPS 支持打印,Qt 工具包用于其界面。
https://launchpad.net/qpdfview || qpdfviewAUR
  • Sioyek — 基于 MuPDF 的轻量级 PDF 查看器,具有专为查看研究论文和技术书籍而设计的功能,例如标记、书签、高亮、可搜索的命令面板、跳转到参考等。
https://sioyek.info/ || sioyekAUR
  • Xpdf — 可以解码 LZW 并读取加密 PDF 的查看器。
https://www.xpdfreader.com/ || xpdf
  • Xreader — X-Apps 项目的文档查看器。支持 DjVu、DVI、EPUB、PDF、PostScript、TIFF、XPS、Comicbook。
https://github.com/linuxmint/xreader/ || xreader
  • Zathura — 高度可定制和功能强大的文档查看器(基于插件)。支持 PDF、DjVu、PostScript 和 Comicbook。
https://pwmt.org/projects/zathura/ || zathura

比较

本文或本节的事实准确性存在争议。

原因: 填写 PDF 表单在 MuPDF 和 llpp 中似乎已损坏。(在 Talk:PDF, PS and DjVu 中讨论)
名称 PDF 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 文档查看器 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
  1. 需要安装可选依赖项

PDF 表单

上表中的PDF 表单列指的是 AcroForms 支持。如果您不需要直接从 PDF 中提取输入,您也可以使用 #图形 PDF 编辑 中的应用程序在 PDF 上添加文本。PDF 表单可以使用 LibreOffice Writer (视图 > 工具栏 > 表单控件) 和高级 PDF 编辑器创建。

专有的且已弃用的 XFA 表单格式未被 Poppler 完全支持[1][2],仅被 Adobe ReaderMaster PDF Editor 支持。

或者,诸如 FirefoxChromium 之类的网络浏览器具有内置的 PDF 查看器,能够填写表单。

图形 PDF 编辑

可以导入 PDF 文件的编辑器

  • Scribus 可以导入和导出 PDF;文本作为多边形导入。[3]
  • LibreOffice Draw 可以导入和导出 PDF;文本作为文本导入;嵌入字体被替换。[4][5]
  • Inkscape 可以导入和导出 PDF;文本作为克隆字形或文本导入;对于后者,嵌入字体将被替换。
  • 诸如 GIMPkrita 之类的图形编辑器也可以导入和导出 PDF,但代价是 栅格化

基本编辑器

  • flpsed — PostScript 和 PDF 注释器,仅支持文本框。
https://flpsed.org/flpsed.html || flpsedAUR
  • HandyOutliner for DjVu / PDF — 使创建 DjVu 和 PDF 文档书签的过程更轻松快捷。
https://handyoutlinerfo.sourceforge.net || handyoutliner-binAUR
  • jPDF Tweak — Java Swing 应用程序,可以组合、拆分、旋转、重新排序、水印、加密、签名以及调整 PDF 文件。
https://jpdftweak.sourceforge.net/ || jpdftweakAUR
  • Paper Clip — PDF 文档元数据编辑器,用于编辑标题、作者、关键字和更多详细信息。
https://apps.gnome.org/PdfMetadataEditor/ || paper-clip
  • PDF Arranger — 帮助合并或拆分 pdf 文档,并旋转、裁剪和重新排列页面。它是 PDF-Shuffler 的维护分支。
https://github.com/jeromerobert/pdfarranger || pdfarranger
  • PDF ChainPDFtk 的 GTK 前端,用 C++ 编写,支持连接、突发、水印、附加文件等。
https://pdfchain.sourceforge.net/ || pdfchainAUR
  • PdfJumbler — 用于重新排列、合并、删除和旋转 PDF 文件中页面的简单工具。
https://github.com/mgropp/pdfjumbler || pdfjumblerAUR
  • PDF Mix ToolPoDoFo 的 Qt 前端,用 C++ 编写,支持拆分、合并、旋转和混合 PDF 文件。
https://scarpetta.eu/pdfmixtool/ || pdfmixtool
  • PDFsam — 用 Java 编写的开源应用程序,支持合并、拆分和旋转。
https://pdfsam.org/ || pdfsamAUR
  • PDF Slicer — 用于提取、合并、旋转和重新排序 PDF 文档页面的简单应用程序。
https://junrrein.github.io/pdfslicer/ || pdfslicer
  • PDF Tricks — 用于使用 Ghostscript 对 PDF 文件进行小型操作的简单高效的应用程序。
https://github.com/muriloventuroso/pdftricks || pdftricks

裁剪工具

  • briss — Java GUI,用于将 PDF 文档的页面裁剪为一个或多个选定区域。
https://sourceforge.net/projects/briss/ || brissAUR
  • krop — 用于裁剪 PDF 文件页面的简单图形工具。
https://arminstraub.com/software/krop || kropAUR
  • pdfCropMargins — 自动裁剪 PDF 文件的页边距。
https://github.com/abarker/pdfCropMargins || pdfcropmarginsAUR
  • PdfHandoutCrop — 用于裁剪每张纸多页的 pdf 讲义的工具。
https://cges30901.github.io/pdfhandoutcrop/ || pdfhandoutcropAUR

高级编辑器

  • Master PDF Editor — 功能强大的专有 PDF 编辑器。最新版本免费供非商业用途使用。-free 软件包已过时,但缺少水印。
https://code-industry.net/free-pdf-editor/ || masterpdfeditorAUR, masterpdfeditor-freeAUR
  • PDF Studio — 类似于 Adobe Acrobat 的一体化专有 PDF 编辑器。
https://www.qoppa.com/pdfstudio/ || pdfstudio-binAUR
  • PDF4QT — 开源 PDF 编辑器。
https://jakubmelka.github.io/ || pdf4qtAUR

高级编辑器对比

名称 费用(美元,终身) 页面标签 表单设计器 内容编辑(文本和图像) 优化 PDF 数字签名 PDF 许可证
Master PDF Editor 85.34 专有
Qoppa PDF Studio Standard 99 专有
Qoppa PDF Studio Pro 139 专有

PDF 工具

另请参阅 Ghostscript

  • Camelot — Camelot:面向人类的 PDF 表格提取。
https://github.com/atlanhq/camelot || python-camelotAUR, python-camelot-gitAUR
  • Coherent PDF — 用于操作 PDF 文件的专有非免费命令行工具,包括合并、加密、解密、缩放、裁剪、旋转、书签、图章、徽标、页码。
https://community.coherentpdf.com/ || cpdfAUR
  • DiffPDF — 比较两个 PDF 文件中每页的文本或视觉外观。
https://gitlab.com/eang/diffpdf || diffpdf
  • mupdf-tools — 作为 MuPDF 一部分开发的工具,包含 mutool(1)muraster
https://mupdf.com || mupdf-tools
  • pdfcpu — 用于创建和修改 PDF 的命令行工具。
https://github.com/pdfcpu/pdfcpu || pdfcpu-binAUR
  • pdf_extbook — 提取带书签的 PDF 页面。
https://github.com/raffaem/pdf_extbook || pdf_extbook-gitAUR
  • pdfgrep — 用于在 PDF 文件中搜索文本的命令行实用程序。
https://pdfgrep.org/ || pdfgrep
  • pdfjam — 可用于将 PDF 进行 n-up 排版、连接、旋转和翻转,并将它们排列成适合书籍装订的格式。
https://github.com/DavidFirth/pdfjam || texlive-binextra
  • pdfminer.six — pdfminer 的社区维护分支,pdfminer 是 PDF 文档的文本提取工具。
https://github.com/pdfminer/pdfminer.six || python-pdfminer
  • pdf2svg — 将 PDF 文件转换为 SVG 文件。
http://www.cityinthesky.co.uk/opensource/pdf2svg/ || pdf2svg
  • PDFtk — 用于处理 PDF 文档日常事务的简单工具。
https://gitlab.com/pdftk-java/pdftk || pdftk
  • QPDF — 内容保留的 PDF 转换系统。
https://github.com/qpdf/qpdf || qpdf
  • Stapler — 使用 PyPDF2 库的 PDFtk 的轻量级替代品。
https://github.com/hellerbarde/stapler || staplerAUR, stapler-gitAUR
  • Tabula — Tabula 是一个用于解放 PDF 文件中表格数据的工具。
https://tabula.technology || tabulaAUR, tabula-javaAUR
  • Vector Slicer — 从 SVG 导出多页 PDF。
https://gitlab.gnome.org/World/design/vector-slicer || vector-slicer
  • verapdf — 一个专门构建的开源文件格式验证器,涵盖所有 PDF/A 和 PDF/UA 部分及符合性级别。
https://verapdf.org || verapdfAUR

命令代码片段

从图片创建 PDF

使用 GraphicsMagick

$ 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
提示: 遗忘的密码可以使用 pdfcrack 恢复,请参阅 pdfcrack(1)

加密 PDF

用户密码 用于加密,所有者密码 用于限制文档解密后的操作,更多信息请参阅 Wikipedia:PDF#加密和签名

使用 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 版面设计 (nup)

PDF 版面设计 是将多个输入页面组合成一个输出页面的过程,并将其排列成一个 x 网格。

可以使用 pdfjam 完成(请注意,pdfnuppdfbook 等包装脚本已弃用)

$ pdfjam --nup rowsxcolumns input.pdf --outfile output.pdf

或使用 pdfsak

$ 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 命令完全从 PDF 中删除 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
警告: 这将大幅增加您的 PDF 文件大小。例如,如果您的打印机无法正确打印您的 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 中的任何位置

有关这些和其他解决方案的详细信息,请访问 StackExchange

向 PDF 添加数字签名

jsignpdfAUR 可以使用 GUI 和 CLI 以 X.509 证书对 PDF 文件进行数字签名。

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 工具,使用 cert.pfx 对 PDF 进行签名。

Okular 用户必须将 cert.pfx 导入到证书存储区,例如默认 Firefox 配置文件中的证书存储区。[7][死链 2024-01-13 ⓘ] 使用 Firefox,可以通过设置 > 隐私与安全 > 查看证书 > 您的证书 > 导入 并选择 cert.pfx 完成此操作。之后,Okular 将提供此证书以在签名 PDF 时使用。

Libreoffice 也可以对 PDF 进行签名。[8]

从 PDF 中删除注释

使用 pdftk [9]

$ 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

$ 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”的页面对应于大于 1 的 PDF 页面,并且您希望导航栏中显示的页码与物理页面上显示的页码相对应,则页码标签非常有用。

这不应与在物理页面中添加页码混淆。请参阅 PDF 参考的第 12.4.2 节,以更好地理解页码标签。

  1. 使用 pagelabels-py,假设我们有一个名为 my_document.pdf 的 PDF,它有 12 页。
    • 第 1 页到第 4 页应标记为 Intro IIntro IV
    • 第 5 页到第 9 页应标记为 26
    • 第 10 页到第 12 页应标记为 Appendix AAppendix 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 规范
  2. 使用 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
      可以是 DecimalArabicNumeralsUppercaseRomanNumeralsLowercaseRomanNumeralsUppercaseLettersLowercaseLettersNoNumber
    • 然后使用
      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
书签重定向到的页码

在此示例中,上面的文件将创建以下书签结构

  • 第 1 章
    • 第 1.1 章
    • 第 1.2 章
    • 第 1.3 章
      • 第 1.3.1 章
  • 第 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

该脚本需要 pdftknawkghostscript

查找 PDF 中使用的字体

pdffonts(1) 命令(来自 poppler)可用于查找 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 标准

使用 ghostscript

$ gs -dPDFA -dBATCH -dNOPAUSE -sColorConversionStrategy=UseDeviceIndependentColor -sDEVICE=pdfwrite -dPDFACompatibilityPolicy=2 -sOutputFile=document_pdfa.pdf document.pdf

参考:https://stackoverflow.com/a/56459053

验证 PDF/A 合规性

使用 verapdfAUR,您可以验证您的 PDF 是否符合不同风格的 PDF/A 标准

$ verapdf --flavour 1a --format text document.pdf

DjVu 工具

  • DjVuLibre 提供了许多命令行工具,例如 ddjvu(1)
  • img2djvu — 基于 DjVu Libre 和 ImageMagick 的单通道 DjVu 编码器。
https://github.com/ashipunov/img2djvu || img2djvu-gitAUR
  • pdf2djvu — 从 PDF 文件创建 DjVu 文件。
https://jwilk.net/software/pdf2djvu || pdf2djvuAUR

将 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 工具

  • pstotext — 将 PostScript 文件转换为文本。
https://www.cs.wisc.edu/~ghost/doc/pstotext.htm || pstotextAUR

ps2pdf

ps2pdf 是 ghostscript 的包装器,用于将 PostScript 转换为 PDF

$ ps2pdf -sPAPERSIZE=a4 -dOptimize=true -dEmbedAllFonts=true YourPSFile.ps

说明

  • 使用 -sPAPERSIZE=something,您可以定义纸张尺寸。有关有效的 PAPERSIZE 值,请参阅 [10][死链 2022-09-22 ⓘ]
  • -dOptimize=true 使创建的 PDF 针对加载进行优化。
  • -dEmbedAllFonts=true 使字体始终看起来不错。
注意: 您无法在 ps2pdf 中选择纸张方向。如果您的输入 PS 文件是健康的,它已经包含方向信息。如果您尝试使用封装的 PS 文件,如果它不适合您指定的 -sPAPERSIZE,您将遇到问题,因为 EPS 文件通常不包含纸张方向信息。一种解决方法是在 ghostscript 设置中创建一个新纸张(例如,将其称为“slide”),并将其用作 -sPAPERSIZE=slide

C/C++

  • libharu — 用于生成 PDF 文档的 C 库。
https://github.com/libharu/libharu || libharu,Lua 绑定: lua-hpdfAUR
  • PoDoFo — 一个用于处理 PDF 文件格式的 C++ 库。
https://podofo.sourceforge.net || podofo

Python

  • borb — borb 是一个用于在 python 中读取、创建和操作 PDF 文件的库。
https://borbpdf.com/, https://github.com/jorisschellekens/borb || 未打包?在 AUR 中搜索
  • pdfrw — 一个用于读取和写入 PDF 的纯 Python 库。
https://github.com/pmaupin/pdfrw || python-pdfrw
  • PyPDF — 一个构建为 PDF 工具包的纯 Python 库。
https://github.com/py-pdf/pypdf || python-pypdf
  • PyX — 用于创建 PostScript 和 PDF 文件的 Python 库。
https://pyx.sourceforge.net || python-pyx
  • ReportLab — 一个经过验证的工业级 PDF 生成解决方案
https://www.reportlab.com/ || python-reportlab

Java

  • iText Core — iText 是一个更通用、可编程和企业级的 PDF 解决方案,允许您将​​其功能嵌入到您自己的软件中以进行数字化转型。
https://itextpdf.com/products/itext-core || itext-rups-binAUR
  • OpenPDF — OpenPDF 是一个免费的 Java 库,用于创建和编辑 PDF 文件,具有 LGPL 和 MPL 开源许可证。 OpenPDF 基于 iText 的一个分支。
https://github.com/LibrePDF/OpenPDF || 未打包?在 AUR 中搜索

另见