R 用同一系列的其他字体替换PDF中未嵌入的字体的最佳方法是什么?

R 用同一系列的其他字体替换PDF中未嵌入的字体的最佳方法是什么?,r,pdf,fonts,latex,embedding,R,Pdf,Fonts,Latex,Embedding,我没有意识到R制作的统计图表和图形使用的是Windows计算机上没有安装的字体,这些字体是: Helvetica Helvetica Bold Helvetica斜板 ZapfDingbats 我发现通过从命令行运行pdffonts。所以这些字体没有嵌入到PDF文件中 我的论文被送去印刷,但印刷厂说这些字体需要嵌入到PDF文件中。我使用LaTeX编写了它,并将图形作为PDF包含在内 如何用非常相似的字体替换或替换这些字体(有些是许可的),而不扭曲单个PDF中的图形?我不打算使用商业设施 注释 -

我没有意识到R制作的统计图表和图形使用的是Windows计算机上没有安装的字体,这些字体是:
Helvetica

Helvetica Bold

Helvetica斜板

ZapfDingbats

我发现通过从命令行运行
pdffonts
。所以这些字体没有嵌入到PDF文件中

我的论文被送去印刷,但印刷厂说这些字体需要嵌入到PDF文件中。我使用
LaTeX
编写了它,并将图形作为PDF包含在内

如何用非常相似的字体替换或替换这些字体(有些是许可的),而不扭曲单个PDF中的图形?我不打算使用商业设施

注释
-Windows 7 32位
-这篇文章很相似:

然而,它是通过一个商业程序完成的,到现在已经相对陈旧了。也许有更好的新想法来克服这个问题。我希望如此

到目前为止我的试用期
我已经成功地使用Ghostscript专家在以下帖子中的程序进行了替换:

这需要安装(我有9.15版)加上Adobe for Windows,这是一个通用版本,并且此脚本来自命令行:

gswin32c ^
 -dNOPAUSE ^
 -dBATCH ^
 -sDEVICE=pdfwrite ^
 -dPDFSETTINGS=/prepress ^
 -dCompatibilityLevel=1.4 ^
 -dHaveTrueTypes=true ^
 -dSubsetFonts=true ^
 -sOutputFile="c:\path\to\somename.pdf" ^
 -c ".setpdfwrite <</NeverEmbed [ ]>> setdistillerparams" ^
 -f "c:\path\to\somename.ps"
gswin32c^
-多瑙河^
-dBATCH^
-sDEVICE=pdfwrite^
-dPDFSETTINGS=/预印^
-dCompatibilityLevel=1.4^
-dHaveTrueTypes=true^
-dSubsetFonts=true^
-sOutputFile=“c:\path\to\somename.pdf”^
-c“.setpdfwrite SetDiversiterParams”^
-f“c:\path\to\somename.ps”
问题
如何获得生成的
.ps
postscript文件,以及随后生成的
.pdf
文件(该文件现在以类似字体优雅地嵌入),该文件与原始pdf文件大小相同,即被精确裁剪为原始pdf文件的相同尺寸


如果我在AdobeReader(版本XI)中保留所有默认设置,不要与商业AdobeProfessional混淆,我在
.ps
文件中得到相同的大小,所以我真正需要的是在生成最终PDF时在Ghostscript中保留
.ps
文件的尺寸,有什么帮助吗?顺便说一句,我用
苏门答腊PDF
查看器打开
.ps
文件

Windows中所需的全部内容是以下步骤:

步骤1
安装Ghostscript并将其添加到路径变量中(
Win+break
是有用的快捷方式)

步骤2
从命令行运行这个脚本,并转到目标文件夹,在那里你有坏的PDF文件(我这样做是为了避免写整个路径)

步骤3

通过从命令行运行pdffont检查您的错误PDF:

pdffonts input-pdf-where-some-fonts-are-not-embedded.pdf
步骤4
运行以下代码以获得所需的带有嵌入式字体的PDF:

gswin32c ^  
-sFONTPATH=C\Windows\Fonts ^
-o output-pdf-with-embedded-fonts.pdf  ^
-sDEVICE=pdfwrite ^
-dPDFSETTINGS=/prepress ^
"input-pdf-where-some-fonts-are-not-embedded.pdf"

很接近:前面的SO问题()提到将
-dEmbedAllFonts=true
添加到gswin32c的命令行

批量处理多个PDF的第二个问题(在评论中)可以通过多种方式完成,其中“最佳”是最容易理解、维护和使用您随时可以访问的工具

在R中:

bash
中:

for fn in doctorate-*.pdf ; do
    ofn="$(basename ${fn} .pdf)-withfonts.pdf"
    echo "Processing: ${fn} --> ${ofn}"
    gswin32c -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress ^
             -dCompatibilityLevel=1.4 -dHaveTrueTypes=true -dSubsetFonts=true ^
             -dEmbedAllFonts=true -sOutputFile="${ofn}" ^
             -c ".setpdfwrite <</NeverEmbed [ ]>> setdistillerparams" ^
             -f "${fn}"
done
博士学位的fn-*.pdf;做
ofn=“$(basename${fn}.pdf)-withfonts.pdf”
echo“处理:${fn}-->${ofn}”
gswin32c-dNOPAUSE-dBATCH-sDEVICE=pdfwrite-dPDFSETTINGS=/prepress^
-dCompatibilityLevel=1.4-dHaveTrueTypes=true-dSubsetFonts=true^
-dEmbedAllFonts=true-sOutputFile=“${ofn}”^
-c“.setpdfwrite SetDiversiterParams”^
-f“${fn}”
完成

(请注意,如果您在windows中msys2下的bash终端中执行此操作,这可能会失败,因为msys2看到“/prepress”,并假设它是一条路径,将其转换为
c:/msys64/PREPREPRESS
,这显然对gs没有任何意义…

您是否尝试过gswin32c的
-dEmbedAllFonts=true
选项?这一点在报告中提到。从这个例子中,它直接导入和导出PDF而不是postscript。非常感谢您的帮助,效果非常好。请随意发布代码并给出答案。是否有任何方法可以批处理多个PDF?是否根本不需要
-dEmbedAllFonts=true
?否,在win32上的
fstang
在同一篇文章的评论中既不需要也没有提到它。+1对于批处理,是否需要在同一文件夹中运行R会话?或者有没有一种方法可以告诉R文件夹的路径在哪里?不严格地说,尽管本例假设了这一点以及
gswin32c
在您的可执行路径中这一事实。如果将第一行更改为
fnames
Processing: doctorate-1.pdf --> doctorate-1-withfonts.pdf
Processing: doctorate-2.pdf --> doctorate-2-withfonts.pdf
Processing: doctorate-3.pdf --> doctorate-3-withfonts.pdf
for fn in doctorate-*.pdf ; do
    ofn="$(basename ${fn} .pdf)-withfonts.pdf"
    echo "Processing: ${fn} --> ${ofn}"
    gswin32c -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress ^
             -dCompatibilityLevel=1.4 -dHaveTrueTypes=true -dSubsetFonts=true ^
             -dEmbedAllFonts=true -sOutputFile="${ofn}" ^
             -c ".setpdfwrite <</NeverEmbed [ ]>> setdistillerparams" ^
             -f "${fn}"
done