如何让GhostScript全局加载TTF字体?

时间:2014-12-09 15:51:24

标签: pdf fonts ghostscript imagemagick-convert

我正在使用PHP的Imagick将PDF转换为JPEG。某些PDF具有未嵌入PDF的自定义TTF字体,因此我需要将其安装在我的文件系统上。我相信GhostScript实际上是在转换,所以我花了大部分时间来尝试加载字体。

当我运行gs -help时,我得到:

GPL Ghostscript 9.15 (2014-09-22)
Copyright (C) 2014 Artifex Software, Inc.  All rights reserved.
Usage: gs [switches] [file1.ps file2.ps ...]
Most frequently used switches: (you can use # in place of =)
 -dNOPAUSE           no pause after page   | -q       `quiet', fewer messages
 -g<width>x<height>  page size in pixels   | -r<res>  pixels/inch resolution
 -sDEVICE=<devname>  select device         | -dBATCH  exit after last file
 -sOutputFile=<file> select output file: - for stdout, |command for pipe,
                                     embed %d or %ld for page #
Input formats: PostScript PostScriptLevel1 PostScriptLevel2 PostScriptLevel3 PDF
Default output device: x11alpha
Available devices:
   alc1900 alc2000 alc4000 alc4100 alc8500 alc8600 alc9100 ap3250 appledmp
   atx23 atx24 atx38 bbox bit bitcmyk bitrgb bitrgbtags bj10e bj10v bj10vh
   bj200 bjc600 bjc800 bjc880j bjccmyk bjccolor bjcgray bjcmono bmp16 bmp16m
   bmp256 bmp32b bmpgray bmpmono bmpsep1 bmpsep8 ccr cdeskjet cdj1600 cdj500
   cdj550 cdj670 cdj850 cdj880 cdj890 cdj970 cdjcolor cdjmono cdnj500 cfax
   chp2200 cif cljet5 cljet5c cljet5pr coslw2p coslwxl cp50 cups declj250
   deskjet devicen dfaxhigh dfaxlow dj505j djet500 djet500c dl2100 dnj650c
   epl2050 epl2050p epl2120 epl2500 epl2750 epl5800 epl5900 epl6100 epl6200
   eplcolor eplmono eps2write eps9high eps9mid epson epsonc escp escpage
   faxg3 faxg32d faxg4 fmlbp fmpr fpng fs600 gdi hl1240 hl1250 hl7x0
   hpdj1120c hpdj310 hpdj320 hpdj340 hpdj400 hpdj500 hpdj500c hpdj510
   hpdj520 hpdj540 hpdj550c hpdj560c hpdj600 hpdj660c hpdj670c hpdj680c
   hpdj690c hpdj850c hpdj855c hpdj870c hpdj890c hpdjplus hpdjportable ibmpro
   ijs imagen inferno ink_cov inkcov itk24i itk38 iwhi iwlo iwlq jetp3852
   jj100 jpeg jpegcmyk jpeggray la50 la70 la75 la75plus laserjet lbp310
   lbp320 lbp8 lex2050 lex3200 lex5700 lex7000 lips2p lips3 lips4 lips4v
   lj250 lj3100sw lj4dith lj4dithp lj5gray lj5mono ljet2p ljet3 ljet3d ljet4
   ljet4d ljet4pjl ljetplus ln03 lp1800 lp1900 lp2000 lp2200 lp2400 lp2500
   lp2563 lp3000c lp7500 lp7700 lp7900 lp8000 lp8000c lp8100 lp8200c lp8300c
   lp8300f lp8400f lp8500c lp8600 lp8600f lp8700 lp8800c lp8900 lp9000b
   lp9000c lp9100 lp9200b lp9200c lp9300 lp9400 lp9500c lp9600 lp9600s
   lp9800c lps4500 lps6500 lq850 lxm3200 lxm5700m m8510 mag16 mag256
   md1xMono md2k md50Eco md50Mono md5k mgr4 mgr8 mgrgray2 mgrgray4 mgrgray8
   mgrmono miff24 mj500c mj6000c mj700v2c mj8000c ml600 necp6 npdl nullpage
   oce9050 oki182 oki4w okiibm oprp opvp paintjet pam pamcmyk32 pamcmyk4 pbm
   pbmraw pcl3 pcx16 pcx24b pcx256 pcx2up pcxcmyk pcxgray pcxmono pdfwrite
   pgm pgmraw pgnm pgnmraw photoex picty180 pj pjetxl pjxl pjxl300 pkm
   pkmraw pksm pksmraw plan plan9bm planc plang plank planm png16 png16m
   png256 png48 pngalpha pnggray pngmono pnm pnmraw ppm ppmraw pr1000
   pr1000_4 pr150 pr201 ps2write psdcmyk psdcmykog psdrgb pxlcolor pxlmono
   r4081 rinkj rpdl samsunggdi sgirgb sj48 spotcmyk st800 stcolor sunhmono
   t4693d2 t4693d4 t4693d8 tek4696 tiff12nc tiff24nc tiff32nc tiff48nc
   tiff64nc tiffcrle tiffg3 tiffg32d tiffg4 tiffgray tifflzw tiffpack
   tiffscaled tiffsep tiffsep1 txtwrite uniprint x11 x11alpha x11cmyk
   x11cmyk2 x11cmyk4 x11cmyk8 x11gray2 x11gray4 x11mono x11rg16x x11rg32x
   xcf xes xpswrite
Search path:
   %rom%Resource/Init/ : %rom%lib/ :
   /usr/local/share/ghostscript/9.15/Resource/Init :
   /usr/local/share/ghostscript/9.15/lib :
   /usr/local/share/ghostscript/9.15/Resource/Font :
   /usr/local/share/ghostscript/fonts :
   /usr/local/share/fonts/default/ghostscript :
   /usr/local/share/fonts/default/Type1 :
   /usr/local/share/fonts/default/TrueType : /usr/lib/DPS/outline/base :
   /usr/openwin/lib/X11/fonts/Type1 : /usr/openwin/lib/X11/fonts/TrueType :
   /usr/share/cups/fonts
Ghostscript is also using fontconfig to search for font files
Initialization files are compiled into the executable.
For more information, see /usr/local/share/ghostscript/9.15/doc/Use.htm.
Please report bugs to bugs.ghostscript.com.

从这里,我可以在我的搜索路径中看到/ usr / local / share / fonts / default / TrueType。我将GLFONT.TTF上传到该文件夹​​。然后我在文件/GLFont[tab](GLFONT.TTF)[tab];的底部添加了/usr/share/ghostscript/8.70/Resource/Init/Fontmap.GS以下内容。我相信这是fontmap文件的正确语法。

当我运行commad gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=png16m -sOutputFile=test.jpg www/product_images/test.pdf时,我得到以下输出:

GPL Ghostscript 9.15 (2014-09-22)
Copyright (C) 2014 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 1.
Page 1
Substituting font Times-Roman for GLFont.
Loading NimbusRomNo9L-Regu font from %rom%Resource/Font/NimbusRomNo9L-Regu... 4499544 2930395 9030496 7679326 3 done.`

因此,您可以看到无法识别字体。但是,当我使用gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=png16m -sOutputFile=test.jpg -sFONTPATH=/usr/local/share/fonts/default/TrueType www/product_images/test.pdf指定我的字体目录时,会找到以下字体:

GPL Ghostscript 9.15 (2014-09-22)
Copyright (C) 2014 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 1.
Page 1
Scanning /usr/local/share/fonts/default/TrueType for fonts... 1 files, 1 scanned, 1 new fonts.
Loading GLFont font from /usr/local/share/fonts/default/TrueType/GLFONT.TTF... 4509572 2891739 9232600 7842698 3 done.

有关如何调试字体未从fontmap全局加载的原因的任何想法吗?

2 个答案:

答案 0 :(得分:1)

你显然编辑了Ghostscript 8.70的字体地图,根据你提供的路径判断( /usr/share/ghostscript/8.70/Resource/Init/Fontmap.GS )。

但是从 stdout 输出中,您使用的是Ghostscript 9.15。

现在可能已经设置了你的环境,以便Ghostscript读取8.70 fontmap.GS,但我猜它不会(gs -help的输出可能在这里有用) 。

此外,您尚未在fontmap.GS文件中指定TTF的完整路径。您可能也想尝试一下。当然,发布gs -help的实际输出也很有用。

答案 1 :(得分:0)

您可以使用环境变量 GS_FONTPATH

设置 TTF 文件夹的路径

您也可以通过命令行开关指定 TTF 路径 -sFONTPATH=

例如在我的 Windows 机器上,我创建了一个系统范围的环境变量, GS_FONTPATH=C:\Windows\Fonts

参考:How to Use Ghostscript - Font lookup