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 渲染库。为了使 Poppler 支持 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 的一部分。
- Deepin Document Viewer — 一款简单的 PDF 和 DjVu 阅读器,支持书签、高亮和注释。
- DjView — DjVu 文档查看器。
- Emacs — 另请参阅 pdf-tools 以获得改进的 pdf 支持 (emacs-pdf-tools-gitAUR) 和 djvu 包 以获得 djvu 支持。
- ePDFView — 使用 Poppler 和 GTK 库的轻量级 PDF 文档查看器。开发已停止。
- Foxit Reader — 小巧、快速(与 Acrobat 相比)的专有 PDF 查看器。Linux 版本的发布(安全更新除外)已停止 (2020 年 11 月)。
- GNOME 文档查看器 — GNOME 的文档查看器,使用 GTK。支持 DjVu、DVI、EPS、PDF、PostScript、TIFF、XPS 和 Comicbook。gnome 的一部分。
- gv — Ghostscript 解释器的图形用户界面,允许查看和浏览 PostScript 和 PDF 文档。
- llpp — 非常快速的 PDF 阅读器,基于 MuPDF,支持连续页面滚动、书签和全文搜索。
- MuPDF — 非常快速的 EPUB、FictionBook、PDF、XPS 和 Comicbook 查看器,用可移植 C 语言编写。具有 CJK 字体支持和类似 vim 的绑定。
- Okular — KDE 的通用文档查看器。支持 CHM、Comicbook、DjVu、DVI、EPUB、FictionBook、Mobipocket、ODT、PDF、Plucker、PostScript、TIFF 和 XPS。kde-graphics 的一部分。
- Papers — GNOME 的文档查看器,使用 GTK。支持 DjVu、PDF、TIFF 和 Comicbook。
- pdfpc — 具有多显示器支持的 PDF 文件演示者控制台。
- qpdfview — 标签式文档查看器。它使用 Poppler 支持 PDF,libspectre 支持 PS,DjVuLibre 支持 DjVu,CUPS 支持打印,Qt 工具包用于其界面。
- Sioyek — 基于 MuPDF 的轻量级 PDF 查看器,具有专为查看研究论文和技术书籍而设计的功能,例如标记、书签、高亮、可搜索的命令面板、跳转到参考等。
- https://sioyek.info/ || sioyekAUR
- Xpdf — 可以解码 LZW 并读取加密 PDF 的查看器。
- Xreader — X-Apps 项目的文档查看器。支持 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 文档查看器 | 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 中提取输入,您也可以使用 #图形 PDF 编辑 中的应用程序在 PDF 上添加文本。PDF 表单可以使用 LibreOffice Writer (视图 > 工具栏 > 表单控件) 和高级 PDF 编辑器创建。
专有的且已弃用的 XFA 表单格式未被 Poppler 完全支持[1][2],仅被 Adobe Reader 和 Master PDF Editor 支持。
或者,诸如 Firefox 或 Chromium 之类的网络浏览器具有内置的 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 软件包已过时,但缺少水印。
- PDF Studio — 类似于 Adobe Acrobat 的一体化专有 PDF 编辑器。
- PDF4QT — 开源 PDF 编辑器。
高级编辑器对比
名称 | 费用(美元,终身) | 页面标签 | 表单设计器 | 内容编辑(文本和图像) | 优化 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。
- pdfcpu — 用于创建和修改 PDF 的命令行工具。
- pdf_extbook — 提取带书签的 PDF 页面。
- pdfgrep — 用于在 PDF 文件中搜索文本的命令行实用程序。
- pdfjam — 可用于将 PDF 进行 n-up 排版、连接、旋转和翻转,并将它们排列成适合书籍装订的格式。
- pdfminer.six — pdfminer 的社区维护分支,pdfminer 是 PDF 文档的文本提取工具。
- pdf2svg — 将 PDF 文件转换为 SVG 文件。
- PDFtk — 用于处理 PDF 文档日常事务的简单工具。
- QPDF — 内容保留的 PDF 转换系统。
- Stapler — 使用 PyPDF2 库的 PDFtk 的轻量级替代品。
- Tabula — Tabula 是一个用于解放 PDF 文件中表格数据的工具。
- https://tabula.technology || tabulaAUR, tabula-javaAUR
- Vector Slicer — 从 SVG 导出多页 PDF。
- verapdf — 一个专门构建的开源文件格式验证器,涵盖所有 PDF/A 和 PDF/UA 部分及符合性级别。
- https://verapdf.org || verapdfAUR
命令代码片段
从图片创建 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#加密和签名。
使用 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 完成(请注意,pdfnup 和 pdfbook 等包装脚本已弃用)
$ 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
使用 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 以 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 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 节,以更好地理解页码标签。
- 使用 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
- 书签重定向到的页码
在此示例中,上面的文件将创建以下书签结构
- 第 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
。
该脚本需要 pdftk、nawk 和 ghostscript。
查找 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 工具
- 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 工具
- pstotext — 将 PostScript 文件转换为文本。
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
使字体始终看起来不错。
-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 — 一个用于读取和写入 PDF 的纯 Python 库。
- PyPDF — 一个构建为 PDF 工具包的纯 Python 库。
- PyX — 用于创建 PostScript 和 PDF 文件的 Python 库。
- ReportLab — 一个经过验证的工业级 PDF 生成解决方案
Java
- iText Core — iText 是一个更通用、可编程和企业级的 PDF 解决方案,允许您将其功能嵌入到您自己的软件中以进行数字化转型。
- OpenPDF — OpenPDF 是一个免费的 Java 库,用于创建和编辑 PDF 文件,具有 LGPL 和 MPL 开源许可证。 OpenPDF 基于 iText 的一个分支。