我正在努力使我的 XeLaTeX 编译的 PDF 文件符合 PDF/X-1a:2001 标准。
当我使用这个答案使用 TeXLive 2015,文档可以完全验证(在 Acrobat Pro DC 中)。但是,当我在实际文档(包括章节、目录和其他交互内容)上测试相同的解决方案时,我收到错误。
我使用以下代码编译了代码xelatex -output-driver="xdvipdfmx -V 3" pdfx.tex
:
\documentclass{book}
\usepackage{atbegshi}
\AtBeginShipout{
\special{pdf: put @thispage
<<
/TrimBox [0 0 210.990 162.086]
>>
}
}
\special{pdf: put @thispage
<<
/TrimBox [0 0 210.990 162.086]
>>
}
\special{pdf:docinfo
<<
/GTS_PDFXVersion (PDF/X-1:2001)
/GTS_PDFXConformance (PDF/X-1a:2001)
>>
}
\special{pdf:put @catalog
<<
/PageMode /UseNone
/OutputIntents [
<<
/Info (none)
/Type /OutputIntent
/S /GTS_PDFX
/OutputConditionIdentifier (Custom)
/RegistryName (http://www.color.org/)
>>
]
>>
}%
\usepackage{datetime}
\usepackage{hyperref}
\hypersetup{%
pdftitle={Title},
pdfinfo={
ModDate={D:\pdfdate},
Trapped={False},
},
}
\begin{document}
\chapter{Some chapter}
\chapter{Some chapter}
\chapter{Some chapter}
\chapter{Some chapter}
\end{document}
并导致 PDF 验证在 Acrobat 中输出“文档包含操作”错误:
我测试的一些文档也抛出了以下错误:“页面区域内的注释”,它指向使用命令生成的目录\tableofcontents
和使用\hyperlink
命令生成的内部链接。(超链接在文档中,因为生成交互式文档和打印版本基本上使用相同的源。)
所以问题在于文档的交互性。
我尝试通过更改来禁用它
\usepackage{hyperref}
到
\usepackage[draft]{hyperref}
但这不仅会禁用由 添加的交互性hyperref
,还会跳过hypersetup
,从而导致文档修改日期、标题和捕获密钥不包含在编译的 PDF 中。效果:没有关于交互性的错误,但文档仍然不符合 PDF/X-1a:2001,因为它需要hypersetup
包含元数据。
如何在仍能进行hypersetup
工作的同时完全禁用文档中的所有交互性?
理论上,我可以重新定义/覆盖所有“交互式”hyperref
命令以及所有使用交互性的自定义命令(在序言的最末尾,以便覆盖所有早期的定义):
…
\def \hyperlink#1#2{#2}
\def \href#1#2{#2}
\def \url#1{#1}
\begin{document}
…
但:
- 我不确定如何才能禁用交互性
\pageref
而不丢失文档中的页码 - 这种方法非常特定于文档,因为它需要检查交互性究竟在哪里添加以及通过哪些命令添加
- 虽然它对我测试过的一些文档有效,但对于上面的 MWE 却不起作用。
有没有更直接/通用的方法来禁用整个文档中的交互性?
答案1
这NoHyper
环境可能会满足您的要求:在其范围内,大多数hyperref
功能都被禁用,方法是重新定义用于生成链接的内部宏,hyperref
使它们不执行任何操作。但是,与draft
包选项相反,它不会停用书签的创建、文档信息的包含等。
通常,你会将文档中想要禁用链接的部分括起来
\begin{NoHyper}
...
\end{NoHyper}
在这种情况下,由于您想避免整个文档中的链接,因此可能更容易替换
\usepackage{hyperref}
在你的例子中
\usepackage[bookmarks=false]{hyperref}
\NoHyper
全局禁用链接和书签,同时仍能在 PDF 文件中包含元数据。禁用书签是必需的,因为它们的存在会触发问题中显示的相同验证错误。