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 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 文档查看器 | 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 的社区维护分支,一个用于 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 使用信息字典(旧式)和 XMP 流(新式)存储文档元数据。此 pdftk 命令完全从 PDF 中删除 XMP 流。它不会删除信息字典。
请注意,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 页面索引,从 1 开始计数。编号样式将持续到下一个页码标签,或者如果没有更多页码标签,则持续到文档末尾。
- 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 — 一个纯 Python 库,用于读取和写入 PDF。
- PyPDF — 一个纯 Python 库,构建为 PDF 工具包。
- PyX — 用于创建 PostScript 和 PDF 文件的 Python 库。
- ReportLab — 一个经过验证的行业强度 PDF 生成解决方案
Java
- iText Core — iText 是一个更通用、可编程和企业级的 PDF 解决方案,允许您将其功能嵌入到您自己的软件中以进行数字化转型。
- OpenPDF — OpenPDF 是一个免费的 Java 库,用于创建和编辑具有 LGPL 和 MPL 开源许可证的 PDF 文件。 OpenPDF 基于 iText 的一个分支。