1

Ghostscript pswrite が出力でテキストをエンコードするのはなぜですか? 次の MWE を検討してください。

%!PS-Adobe-3.0 
%%Title: mwe.ps
%%Pages: 001
%%BoundingBox: 0 0 595 842
%%EndComments

%%Page: 1 1
%%PageBoundingBox: 0 0 595 842
0 0 1 setrgbcolor
0 0 595 842 rectfill
1 0 0 setrgbcolor
247 371 100 100 rectfill
/Times-Roman findfont
72 scalefont
setfont
newpath
247 300 moveto
(Chris) show
showpage

この MWE をファイルに保存して GSview で表示すると、青いページが表示され、その下に赤い四角と私の名前が表示されます。次のコマンドラインを使用して、Ghostscript 9.06 でこのファイルを実行します。

"c:\Program Files\gs\gs9.06\bin\gswin64c.exe" ^
  -dSAFER -dBATCH -dNOPAUSE ^
  -sDEVICE=pswrite -sPAPERSIZE=a4 -r72 -sOutputFile=mwe_gs.ps mwe.ps

以下の Ghostscript の出力を参照してください。誰かがここで何が起こっているのか説明してください。2 つの rectfill コマンドはまだ明らかですが、私のテキスト (Chris) はエンコードされており、もはや区別できません。

私のテキストを保持する代替の PostScript デバイスはありますか?

<snip>
%%Page: 1 1
%%PageBoundingBox: 0 0 595 842
%%BeginPageSetup
GS_pswrite_2_0_1001 begin
595 842 /a4 setpagesize
/pagesave save store 197 dict begin
1 1 scale
%%EndPageSetup
gsave mark
255 0 r6
0 0 595 842 rf
255 0 r3
247 371 100 100 rf
Q q
0 0 595 0 0 842 ^ Y
255 0 r3
249 299 43 50 /5D
$C
,6CW56m1G"ZORNkWR*rB:!c2;9rlWTH="2^^[(q"h>cG<omZ2l^=qC[XbO:8_[?kji-8^"N#3q*
jhL~>
,
289 300 41 49 /0P
$C
4r?0p$m<EkK3,0>s8W-!s8W-!s8W,u]<1irI=*p=<t0>_@<)>Is8K6,aTi'$~>
,
325 300 30 33 /5I
$C
49S"pc4+Rhs8W-!s8W)oqdD:saRZq[4+k%):]~>
,
349 300 24 49 /0T
$C
4q%Ms%;PqCs8W-!s8W%1_qkn/K?*sYFSGd:5Q~>
,
377 299 23 34 /5M
$C
-TQR7$&O'!K+D:XribR9;$mr4#sqUi.T@,dX=Y&Llg+F`d^HC#%$"]~>
,
cleartomark end end pagesave restore
 showpage
%%PageTrailer
%%Trailer
%%Pages: 1
%%EOF

注: これは奇妙なアクティビティに思えるかもしれませんが、Ghostscript を使用して、Matlab アプリケーションからのポストスクリプト出力を「クリーンアップ」するというアイデアを検討しています..

4

3 に答える 3

6

「テキスト」は、ベクター パスではなく画像に変換されました。これは pswrite デバイスの重大な制限であり、推奨されない理由の 1 つであり、代わりに ps2write デバイスを使用する必要があります。pswrite デバイスがまだ含まれている唯一の理由は、それを使用する epswrite のためです (これが、pswrite と epswrite の出力が同じに見える理由です)。ある時点で、eps2write デバイスが存在し、pswrite がビニングされます。

ps2write の出力は、デフォルトで圧縮されています。圧縮されていない出力が必要な場合は、コマンド ラインで -dCompressPages=false スイッチを使用します。

テキストの場所だけが必要な場合は、txtwrite デバイスを検討してください。これのデフォルトの実装では、入力のプレーン テキスト表現が作成されますが、代わりに、テキストの出所などを含む偽の XML を出力することができます。

于 2013-02-14T08:34:08.580 に答える
1

以下は、標準の show 操作を実行するとともに、show に関する位置情報を表示するように再定義された show オペレーターの簡単な例です。Ghostscript を使用すると、複数のファイルを実行できるため、ヘッダー ファイルが他のファイルのプレフィックスになり、標準の動作が変更されます。

再定義されたショーには、フォント名とサイズが含まれていた可能性があります。データは、コンソールにダンプされるのではなく、ディスク ファイルに書き込まれた可能性があります。rectfill、fill、stroke など、他の演算子も再定義できます。元の演算子も呼び出されるため、位置情報を取得しながら、pdfwrite デバイスを使用して .ps を .pdf に変換できます。

gswin32c.exe -dBATCH -dNOPAUSE  header.ps trash.ps
gswin32c.exe -sDEVICE=pdfwrite -dCompressPages=false -sOutputFile=test.pdf header.ps trash.ps

出力

currentpoint  x:247.0 y:300.0  pathbbox 249.015,298.992 400.066,349.184   text:Chris  currentrgbcolor:1.0,0.0,0.0( )
currentpoint  x:50.0 y:90.0  pathbbox 50.8682,89.2852 181.327,139.184   text:Fred  currentrgbcolor:1.0,0.0,0.0( )
currentpoint  x:150.0 y:200.0  pathbbox 150.867,184.298 304.154,247.673   text:Mary  currentrgbcolor:1.0,0.0,0.0( )
currentpoint  x:300.0 y:350.0  pathbbox 300.867,348.993 598.79,398.681   text:Mr. Green  currentrgbcolor:0.0,1.0,0.0( )
currentpoint  x:100.0 y:400.0  pathbbox 100.866,399.202 358.547,449.183   text:Mr. Blue  currentrgbcolor:0.0,0.0,1.0( )

Header.ps

/mydict 5 dict def
mydict begin
/show 
    {
    (currentpoint ) print 
    currentpoint exch 10 string cvs ( x:) print print  10 string cvs ( y:) print print
    gsave dup false charpath flattenpath 

    (  pathbbox ) print 
    pathbbox  
    4 -1 roll 10 string cvs print (,) print 
    3 -1 roll 10 string cvs print ( ) print 
    2 -1 roll 10 string cvs print (,) print 
    10 string cvs print ( ) print 
    grestore
    (  text:) 10 string cvs print   
    dup print ( ) print
    ( currentrgbcolor:) print 
    currentrgbcolor
    3 -1 roll 10 string cvs print (,) print
    2 -1 roll 10 string cvs print (,) print
    10 string cvs print ( ) ==
    systemdict /show get exec
} def

ゴミ箱.ps

%!PS-Adobe-3.0 
%%Title: mwe.ps
%%Pages: 001
%%BoundingBox: 0 0 595 842
%%EndComments
%%Page: 1 1
%%PageBoundingBox: 0 0 595 842
0 0 1 setrgbcolor
0 0 595 842 rectfill
1 0 0 setrgbcolor
247 371 100 100 rectfill
/Times-Roman findfont
72 scalefont
setfont
newpath
247 300 moveto (Chris) show
50 90 moveto (Fred) show
150 200 moveto (Mary) show
0 1 0 setrgbcolor
300 350 moveto (Mr. Green) show
0 0 1 setrgbcolor
100 400 moveto (Mr. Blue) show
showpage
于 2013-02-15T05:30:55.017 に答える
0

テキストがベクター パスに変換されました。249 299 43 50 /5D は最初の文字「C」で始まり、289 300 は「h」、289 300 は「r」です。

pswrite によってフォントが不要になったので、元のコードでは /Times-Roman を使用していましたが、抽出されたコードではフォントは必要なく、ベクトルを使用してテキストを描画します。

何を求めているのか正確にはわかりませんが、「pswrite」の代わりに「ps2write」または「epswrite」を試すことができます。pswrite は ps レベル 1 標準への書き込みに使用され、ps2write は ps レベル 2 出力を書き込みます。ps レベル 1 を必要とする人はもういないので、レベル 2 は受け入れられます。epswrite は、カプセル化された PostScript (eps) に書き込みます。

于 2013-02-13T15:48:38.620 に答える