簡體   English   中英

Ghostscript無法轉換某些PDF

[英]Ghostscript fails to convert some PDFs

背景

我使用Ghostscript已有一段時間,將PDF轉換為PNG和GIF。

我正在通過PHP中的exec命令在RHEL6 Unix上執行此操作:

exec("/usr/bin/gs -dNOPAUSE -dBATCH -dQUIET -sDEVICE=png256 -sOutputFile=\"".$out."\" ".$in, $return);

$ out和$ in解析為PDF輸入和PNG輸出的路徑。

但是,某些PDF似乎不再轉換,從而產生以下錯誤:

Error: /invalidaccess in --run--
Operand stack:
--dict:8/17(L)-- F2 85.117 --dict:6/6(L)-- --dict:6/6(L)-- CenturyGothic --dict:11/12(ro)(G)-- --nostringval-- CIDFontObject --dict:6/6(L)-- --dict:6/6(L)-- 14280 --dict:6/6(L)-- --nostringval-- PDFCIDFontName CenturyGothic
Execution stack:
%interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push 1862 1 3 %oparray_pop 1861 1 3 %oparray_pop 1845 1 3 %oparray_pop --nostringval-- --nostringval-- 2 1 2 --nostringval-- %for_pos_int_continue --nostringval-- --nostringval-- --nostringval-- --nostringval-- %array_continue --nostringval-- false 1 %stopped_push --nostringval-- %loop_continue --nostringval-- --nostringval-- --nostringval-- --nostringval-- --nostringval-- --nostringval-- %array_continue --nostringval-- --nostringval-- --nostringval-- --nostringval-- --nostringval--
Dictionary stack:
--dict:1149/1684(ro)(G)-- --dict:1/20(G)-- --dict:75/200(L)-- --dict:75/200(L)-- --dict:106/127(ro)(G)-- --dict:286/300(ro)(G)-- --dict:22/25(L)-- --dict:4/6(L)-- --dict:21/40(L)-- --dict:1/1(ro)(G)--
Current allocation mode is local

我的Ghostscript版本是:

GPL Ghostscript 9.16 (2015-03-30)
Copyright (C) 2015 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: bbox
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 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 plib plibc plibg
   plibk plibm 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 xcf xes
   xpswrite
Search path:
   %rom%Resource/Init/ : %rom%lib/ :
   /usr/local/share/ghostscript/9.16/Resource/Init :
   /usr/local/share/ghostscript/9.16/lib :
   /usr/local/share/ghostscript/9.16/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
Initialization files are compiled into the executable.

經過大量搜索和調試后,我認為這與客戶端提供的原始PDF中嵌入的CID字體有關:

名稱類型emb sub uni對象ID

CenturyGothic TrueType是否否11 0

CenturyGothic CID TrueType是否是26 0

Arial-BoldMT CID TrueType是否是195 0

Arial-BoldMT TrueType是否否198 0

Arial-Black TrueType是是否586 0

因此,我重新制作了PDF,它的工作原理很像。 盡管嵌入字體是不同的,即使我所做的只是在Illustrator中打開文件並重新保存:

名稱類型emb sub uni對象ID

CDXNGM + CenturyGothic TrueType是是否94 0

CDXNGM + Arial-BoldMT TrueType是是否95 0

CDXNGM + Arial-Black TrueType是是否96 0

檔案

失敗的文件: https : //www.dropbox.com/s/54hbdgtewplkrk0/failing.pdf? dl =0

工作文件: https : //www.dropbox.com/s/x9uwbyjytjer1zy/working.pdf?dl=0

問題

  1. 我不確定為什么原始文件沒有使用嵌入的CID字體,或者只是好像似乎根本不需要它而忽略了它?

  2. 為什么Ghostscript不產生字體錯誤而是無效訪問錯誤?

  3. 有沒有一種方法可以在轉換之前通過PHP或通過exec去除CID字體?

  4. 有沒有一種方法可以讓Ghostscript忽略字體問題,而盡其所能呢?

  5. 我有什么辦法可以對ghostscript進行輸出?

非常感謝任何幫助,謝謝。

使用當前的源代碼,9.18版本 9.16版本(均從源代碼構建),您的“失敗”文件對我而言效果很好。

這使我懷疑這是包裝問題。 各種Linux發行版軟件包GS本身,並且這些軟件包並不總是反映原始代碼。 打包程序有時會添加自己的補丁程序,或更改Ghostscript的構建方式。 特別是,它們通常要求使用系統共享庫,而不是我們隨Ghostscript一起提供的已知可用版本。 在這種情況下,可能會使用例如不同版本的FreeType。

我建議您獲取Ghostscript源碼,自己構建它,然后進行測試。 如果可行,那么您可以向任何維護Red Hat軟件包的人投訴(但是請確保您使用的是最新軟件包,我似乎還記得,Red Hat通常是最新的,並且您使用的版本已超過一年了。日期)。

因此,回答您的問題:

  1. 需要所有字體。
  2. Ghostscript正在產生一個無效的訪問錯誤(很可能是因為),它試圖更改已定義為“只讀”的字體字典的內容。 雖然這也是一個字體錯誤,但您得到的卻是最低級別的錯誤。
  3. 刪除字體不是一個好的解決方案。 首先,因為生成的圖像將具有通常不正確的替換字體,其次,因為它很難做到。
  4. 對於PDF輸入,如果Ghostscript可以忽略該錯誤並繼續,則通常會這樣。 這是一個致命錯誤。
  5. 是的,從源代碼構建Ghostscript。 即使這種方法行不通,我們也會為您提供更好的幫助。 如果從規范來源進行構建后仍無法正常工作,請打開錯誤報告。

我真的不值得就CIDFonts的優缺點進行長時間的辯論,但這並不是問題的真正根源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM