\CheckBox 带有 hyperref:无法选中它

\CheckBox 带有 hyperref:无法选中它

我正在使用这个简单的例子:

\documentclass[hidelinks, english, a4paper, 11pt]{scrartcl}

\usepackage{hyperref}   % typeset hyperlinks
\usepackage[ngerman]{babel}

\begin{document}
\begin{Form}
    \CheckBox[name=asd]{label}
\end{Form}
\end{document}

我知道它很大程度上依赖于 PDF 查看器、这些复选框的工作方式以及它们的显示方式。

我似乎无法让此复选框工作。当我在表明,单击该框时不会执行任何操作。在 Chrome 中,它会创建一个红色方块,我认为这表示已选中,但我不确定。PDF.js(Firefox 内的 PDF 查看器)完全不执行任何操作。

我还没有使用 Adob​​e Acrobat Reader 检查,但这已经令人沮丧了。

我最终尝试做的是创建一个 PDF 格式的表单,可以填写,然后打印,它并不像在线表单那样发送。

我需要的是,即使未选中,框也可见。选中的框应如下所示:⊠(Unicode 符号U+22A0 “平方乘以”),而未选中的框应该看起来像同类型的空框。

由于它无法在任何可用的查看器中工作,所以我有点不知所措。此表单应尽可能适用于尽可能多的查看器。类似的东西\TextField{}工作正常。

如果可能的话,请向我建议最佳做法。

xelatex在 Linux 上使用(TeX Live 2014/dev)

答案1

我今天偶然发现了这个问题。对于复选框,XeTeX 3.14159265-2.6-0.99992(TeX Live 2015/Debian)生成的 PDF 对象不包含所谓的“外观词典”(/AP)。单击复选框实际上可能会改变其状态,但不会产生可见效果。这实际上可能是 xelatex 和/或 hyperref 包中的一个错误。

我尝试手动修复 PDF,但任何心智健全的人都不会手动编写 PDF 代码。我设法使用 python3-pdfrw 0.3 找到了一种解决方法。它将外观字典从工作复选框(由 LibreOffice Writer 生成)复制到 xetex 生成的 PDF 中的复选框对象中:

#!/usr/bin/env python3

import sys
import os

from pdfrw import PdfReader, PdfWriter
from pdfrw.findobjs import find_objects
from pdfrw.objects import PdfName

for annot in find_objects(
  PdfReader("libreform.pdf").pages, 
  valid_types=(PdfName.XObject,PdfName.Annot,), 
  valid_subtypes=(PdfName.Widget,)
):
  if (annot.FT == '/Btn'):
    AP = annot.AP

outfn = sys.argv[2]
inpfn = sys.argv[1]
pdf = PdfReader(inpfn)
pages = pdf.pages
for annot in find_objects(
  pages, 
  valid_types=(PdfName.XObject, None), 
  valid_subtypes=(PdfName.Widget,)
):
  if (annot.FT == '/Btn'):
    annot.AP = AP
    annot.Type = "/Annot"

writer = PdfWriter(outfn, trailer=pdf)
writer.write()

代码和示例文件可以在以下位置找到:https://ssl.hehoe.de/zeug/pdflatexCheckboxFix

相关内容