我正在使用这个简单的例子:
\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 查看器)完全不执行任何操作。
我还没有使用 Adobe 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。