我无法使用 LaTeX 字体(例如,奥吉)用于使用生成的 PDF 表单中的文本字段电子表格我在 Windows 10 上使用 MikTeX 2.9。Acrobat Reader 正在选择另一种字体来代替它显示(看起来像 MyriadPro-Regular,它似乎是 Adobe Reader 用来替代缺失字体的):
LaTeX 字体是完全嵌入根据 Adobe Reader 的属性显示为“Augie”:
此外,根据pdffonts
:
pdffonts embedViaPS.pdf
name type encoding emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
[none] Type 3 Custom yes no no 27 0
Augie Type 1C WinAnsi yes no no 24 0
ZapfDingbats Type 1C Custom yes no yes 13 0
Helvetica Type 1C WinAnsi yes no no 17 0
我的理解是,要在一个字段中使用字体,它必须是完全嵌入(而不是嵌入子集-j0
)。我使用dvips
并自定义了GhostScript 来实现这一点ps2pdf
。以下是 TeXstudio 的(已编辑)输出,显示了所有命令:
latex.exe -src -interaction=nonstopmode embedViaPS.tex
dvips.exe -j0 -o embedViaPS.ps embedViaPS.dvi
This is dvips(k) 5.998 Copyright 2018 Radical Eye Software (www.radicaleye.com)
' TeX output 2018.08.31:1642' -> embedViaPS.ps
<C:\MikTeXPortable\texmfs/data\fonts\pk\ljfour\jknappen\ec\dpi600\ecrm1000.pk>
<C:/MikTeXPortable/texmfs/install/dvips/base/tex.pro>
<C:/MikTeXPortable/texmfs/install/fonts/enc/dvips/base/8r.enc>
<C:/MikTeXPortable/texmfs/install/dvips/base/texps.pro>
<C:/MikTeXPortable/texmfs/install/dvips/base/special.pro>.
<C:/MikTeXPortable/texmfs/install/fonts/type1/emerald/faumw.pfb>
[1]
Process exited normally
"C:\Program Files\gs\gs9.10\bin\gswin64c.exe" -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -dEmbedAllFonts=true -dSubsetFonts=false -sOutputFile="C:\hiddenpath\embedViaPS.pdf" -f "C:\hiddenpath\embedViaPS.ps"
Process exited normally
Process started: "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" "C:\hiddenpath\embedViaPS.pdf"
Process exited normally
我使用下面的 MWE 做了一些调试:
\documentclass{article}
\usepackage[dvips]{eforms}
\usepackage{emerald}
\usepackage[T1]{fontenc}
\begin{document}
\everyTextField{
\BC{1 0 0} % border color
\BG{.941 1 .941} % background color
\textColor{0 0 1} % is black
\AA{\AAFormat{console.println("Font set to: '" + event.target.textFont + "', trying to set it to: '" + event.target.value + "'"); event.target.textFont = event.target.value;}}
\textSize{10}
\Ff{\FfDoNotScroll}
}
% Content containing form fields, such as...
{\ECFAugie
Your name: }
\textField[\textFont{Augie}]{name}{1.5in}{12bp}
\end{document}
在 Adobe Reader DC 中打开该文档生成的 PDF 后,我在 JavaScript 控制台(在“首选项”中启用)中看到以下输出:
Font set to: 'Augie', trying to set it to: ''
我使用Augie
作为名称,因为这就是 Adobe Reader 中显示的内容pdffonts
和属性。但是,即使我已经使用\textField
该字体初始化了(来自输出),它也不会在 Adobe Reader DC 中显示该字体。此外,如果我尝试使用表单字段将其重置为 Augie(键入Augie
并按 Enter),我会得到以下结果:
Font set to: 'Augie', trying to set it to: 'Augie'
InvalidSetError: Set not possible, invalid or unknown.
Field.textFont:2:Field name:Format
该脚本允许我在字段中输入字体名称,当我按下 Enter 键时,它会尝试使用 JavaScript 设置该字段的字体。我能够将字段设置为其他值,例如,,,,,Helv
等Helvetica
。Another
(Bauhaus93
后两个值在我的 Windows 计算机上安装为 TrueType 字体)。
我不想(或者说不能)XeTeX
使用似乎没有办法将字体完全嵌入到 PDF 中。
- 该字体还有其他名称吗
Augie
? - 字体是否还有其他细节不正确,例如它不是可编辑根据其
fsType/FSType
?我甚至可以在 LaTeX 中控制它吗?编辑作为测试,我faumw.pfb
使用 FontForge 破解了 Augie 字体(),并将其设置为fsType 为 8 -可编辑嵌入,但什么都没改变。 - 我还没有尝试在 MikTeX 中安装 TrueType(OpenType)字体,因为这是一个漫长的过程,但也许这样会产生更好的结果?
答案1
理论上,根据 PDF 规范,任何嵌入文档字体也可以用于交互式 PDF 表单,例如文本输入字段。要实现此功能,字体必须在/AcroForm
文档的 PDF 目录词典中正确注册。
这是一个 LaTeX 示例,使用标准 CM 字体(PostScript Type 1)的样式、大小和颜色的各种组合:
表明
唉,
爱看阅读器
无法显示嵌入的 T1 字体,这很可能是一个错误。看来 AR 只能正确解析 TrueType 字体。
为了生成所示的 PDF,无法使用创建 PDF 表单的标准包hyperref
和eforms
,因为它们无法注册用于表单的嵌入字体。相反,我们\textField
根据文件重新实现命令pdfbase.sty
。它提供\pbs_add_form_font:
将当前文本字体对象映射为/AcroForm
字典中的字体资源的功能。为了访问字体对象,\pbs_add_form_font:
使用pdftex
内置的\pdffontobjnum
。因此,下面的示例只能使用pdflatex
或来处理lualatex
。
\documentclass{article}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Text Input Field
% \textField{<name>}{<width>}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{pdfbase,xcolor}
\makeatletter
\ExplSyntaxOn
\newcommand{\textField}[2]{
% register current font in /AcroForm <<...>> PDF dictionary
\pbs_add_form_font:
% get current text colour
\extractcolorspec{.}\@tempb
\expandafter\convertcolorspec\@tempb{rgb}\@tempb
\edef\@tempa{\expandafter\@rgbcomp\@tempb\@nil}
% insert Text Field
\raisebox{0.4\depth}{\makebox[#2][l]{
\pbs_pdfannot:nnnn{#2}{\ht\strutbox}{\dp\strutbox}{
/Subtype/Widget/FT/Tx/T (#1)
% set font, size, current colour
/DA (\pbs_last_form_font:\space\f@size\space Tf~\@tempa\space rg)
/MK<</BC [0~0~0]/BG [0.9~0.9~0.9]>>
}\strut
}}
% register Text Field in /AcroForm
\pbs_appendtofields:n{\pbs_pdflastann:}
}
\ExplSyntaxOff
\def\@rgbcomp#1,#2,#3\@nil{#1 #2 #3} %helper
\makeatother
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% set of characters of the current font to be embedded
\usepackage{luatex85}
\newcommand{\embedChars}[1]{\pdfincludechars\font{#1}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\parindent=0pt
\begin{document}
%\normalfont%
\embedChars{ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789- /}%
First Name: \textField{myFName1}{0.4\linewidth}\\
Last Name: \textField{myLName1}{0.4\linewidth}\\
Date of Birth: \textField{myBDate1}{0.2\linewidth}\\
\scshape\Large\color{red}%
\embedChars{ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789- /}%
First Name: \textField{myFName2}{0.4\linewidth}\\
Last Name: \textField{myLName2}{0.4\linewidth}\\
Date of Birth: \textField{myBDate2}{0.3\linewidth}\\
\huge\itshape\color{blue}%
\embedChars{ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789- /}%
First Name: \textField{myFName3}{0.4\linewidth}\\
Last Name: \textField{myLName3}{0.4\linewidth}\\
Date of Birth: \textField{myBDate3}{0.6\linewidth}\\
\end{document}