我正在尝试合并不同的 pdf 文件(所有文件都是用 latex 生成的 - 但文档类别不同)不会破坏相应的超链接。
我已经尝试使用 ghostscript、apple automator 和 latex 中的选项的终端\includepdf
:它们都会破坏使用 hyperref 创建的超链接。
有什么好建议吗?
编辑:这似乎是一个常见问题,有人能尝试解释/评论为什么这种看似简单的任务反而相当艰巨吗?是什么使得合并 pdf 而不破坏超链接变得困难?
答案1
我的方法使用pax
包及其pdfannotextractor
Perl 脚本(由海科·奥伯迪克)。
如果要合并两个 PDF 文件(a.pdf
和b.pdf
)并保留 PDF 注释(内部和外部链接都属于 PDF 注释的一种),请使用手动或自动方法。
(如果出现问题,可以使用脚本--debug
的选项pdfannotextractor
。)
手动安装
pax
从 CTAN(或通过 TeXLive 或 MikTeX)安装包。下载并解压缩
PDFBox-0.7.3
Java 库(Apache PDFBox 的旧版本,一个 Java PDF 库)。pdfannotextractor
不断使用:a.pdf
b.pdf
CLASSPATH='PDFBox-0.7.3/lib/PDFBox-0.7.3.jar:%CLASSPATH%' pdfannotextractor a.pdf CLASSPATH='PDFBox-0.7.3/lib/PDFBox-0.7.3.jar:%CLASSPATH%' pdfannotextractor b.pdf
(您将获得两个新文件:
a.pax
和b.pax
)使用 编译以下文档
pdflatex
:\documentclass{article} \usepackage{pax} \usepackage{pdfpages} \begin{document} \includepdf[pages=-]{a.pdf} \includepdf[pages=-]{b.pdf} \end{document}
自动安装
该pdfannotextractor
脚本可以自行执行安装:
pax
从 CTAN(或通过 TeXLive 或 MikTeX)安装包。自动安装
PDFBox-0.7.3
档案:pdfannotextractor --install
pdfannotextractor
不断使用:a.pdf
b.pdf
pdfannotextractor a.pdf pdfannotextractor b.pdf
(您将获得两个新文件:
a.pax
和b.pax
)使用 编译以下文档
pdflatex
:\documentclass{article} \usepackage{pax} \usepackage{pdfpages} \begin{document} \includepdf[pages=-]{a.pdf} \includepdf[pages=-]{b.pdf} \end{document}
答案2
结论
使用
它们是免费的(就像啤酒一样和语音)并且适用于大多数操作系统。
我不知道为什么大多数工具不保留超链接。
方法
有关可能的解决方案的列表 - 不幸的是没有讨论何时保留链接,请参阅。https://stackoverflow.com/q/2507766/2657549。
我正在使用以下文件的两个副本进行测试,我将其命名为a.pdf
和b.pdf
:
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents*}{bib.bib}
@misc{ex,
author={Doe, Jack},
title={An Example}
}
\end{filecontents*}
\usepackage{biblatex}
\addbibresource{bib.bib}
\usepackage{hyperref}
\begin{document}
\section{A section}
\label{section}
url: \href{https://tex.stackexchange.com/a/531215/34551}{this post}
reference: \cite{ex}
internal link: \ref{section}
file link: \href{run:a.pdf}{file}
\printbibliography
\end{document}
我使用以下工具将它们合并为一个tot.pdf
文件,并测试 URL、引用和内部链接是否在两个文档中保留。
+-----------+----------------------------------------------------------------------------+------+-------+-------+------+
| Software | Command | url | ref. | link | file |
+-----------+----------------------------------------------------------------------------+------+-------+-------+------+
| convert | convert a.pdf b.pdf tot.pdf | ✗ | ✗ | ✗ | ✗ |
| pdfjam | pdfjam a.pdf b.pdf -o tot.pdf | ✗ | ✗ | ✗ | ✗ |
| gs | gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=tot.pdf a.pdf b.pdf | ✗ | ✗ | ✗ | ✗ |
| pdfunite | pdfunite a.pdf b.pdf tot.pdf | ✓ | ✗ | ✗ | ✓ |
| pdftk | pdftk a.pdf b.pdf cat output tot.pdf | ✓ | ✓ | ✓ | ✓ |
| pdfsam | (it's a gui) | ✓ | ✓ | ✓ | ✓ |
| sejda.com | (it's a website) | ✓ | ✓ | ✓ | ✓ |
+-----------+----------------------------------------------------------------------------+------+-------+-------+------+
(请注意,如果引用的文档正在合并,则文件链接不会转换为内部锚点。如果不重写 LaTeX 源代码,我认为这是不可行的。)
版本
- 转换:ImageMagick 6.9.10-23 Q16 x86_64 20190101
- pdfjam:这是 pdfjam 3.03 版本。
- gs:GPL Ghostscript 9.27(2019-04-04)
- pdfunite:版本 0.71.0
- pdftk:移植到 Java 3.0.2,打造一个操作 PDF 文档的便捷工具
- pdfsam:PDF 拆分与合并基础版 4.0.1
- https://www.sejda.com/merge-pdf没有提到任何版本,但于 2020/03/04 进行了测试。
许可证和定价
- pdftk 的“服务器”版本(=提供命令行界面)可用适用于大多数操作系统在下面GPL 许可证。
- pdfsam 也是适用于大多数操作系统并根据GNU Affero 通用公共许可证 v3 条款。
- 这塞伊达条款使用它的界面似乎合理,但相当长。Java 库属于GNU Affero 公共许可证 3.0和API甚至可用。
其他选择
未测试:
答案3
还有一些工具可以合并pdf文件同时保留超链接。我重新测试了一些比较成熟的工具。
Ghostscript(免费)
我测试的所有命令都破坏了一些链接(但我可能错过了适合您的命令)。
PDFSAM / Sejda(免费增值版)这些产品来自同一来源,但风格各异。
我使用 Sejda online 4 文件取得了最大的成功,它们将具有按预期工作的内部/外部链接。但是请注意,在我的有限测试中,最后一份文档为了论证起见而说的第 1-5 页现在将是例如总数的物理 15-19,但它们被保留为逻辑 1-5,因此我可以从第 3 页(18)内部跳转到第 2 页(17)或索引 5(19)- 内容 1(15)等,我确实看到旧的数字 1-5 正在使用中,这很有帮助。
Pdftk(免费增值版)也很好地合并到了免费版中。
但是,与上面类似构建的页面仅显示新的物理页码,因此看到第 1 页的链接跳转到第 15 页很奇怪。
总之,你确定这是可行的方法吗?因为内部链接和页码的编号会到处都是。将所有文件包含在 main.tex 中更有意义,因为可以控制页码和链接的编号。
答案4
PDF-XChange 编辑器这样做似乎没有任何问题。但是,这是一项“高级功能”,当您使用免费版本执行此操作时,编辑器会在整个文档上盖上通知。