2013-02-13 1 views
1

Pourquoi Ghostscript pswrite code-t-il mon texte dans sa sortie? Considérez la MWF suivante:Ghostscript postscript pswrite est un texte d'encodage

%!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 

Enregistrer ce MWe fichier et d'affichage en GSview affiche une page bleu avec carré rouge et mon nom en dessous. Maintenant, exécutez ce fichier via Ghostscript 9.06 avec la ligne de commande suivante:

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

sortie Voir Ghostscript ci-dessous. Quelqu'un peut-il s'il vous plaît expliquer ce qui se passe ici. Alors que les deux commandes rectfill sont toujours apparentes, mon texte (Chris) a été encodé et ne peut plus être distingué.

Existe-t-il un dispositif postscript alternatif qui conserverait mon texte s'il vous plaît?

<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>[email protected]<)>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#[email protected],dX=Y&Llg+F`d^HC#%$"]~> 
, 
cleartomark end end pagesave restore 
showpage 
%%PageTrailer 
%%Trailer 
%%Pages: 1 
%%EOF 

NOTE: Cela peut sembler une activité étrange, mais j'explore l'idée d'utiliser Ghostscript à la sortie postscript « nettoyer » de l'application Matlab ..

+0

Comme vous pouvez le voir, vous à peine obtenir une postface plus propre de tout automatisé outil pour cela, une fois que l'entrée est bruyante. La seule option là, je pense, car il n'y a aucun contrôle sur la façon dont matlabe crée ses fichiers, à swicth à une autre pile entièrement pour votre développement mathématique. Un open source vous donnerait le contrôle sur tous les niveaux de votre travail (y compris les algorithmes mathematicla eux-mêmes, qui sont fermés dans matlab) – jsbueno

Répondre

0

Le texte a été converti en tracés vectoriels. 249 299 43 50/5D commence la première lettre "C", puis 289 300 est le "h", 289 300 le "r" ....

Ce que pswrite a fait est d'éliminer le besoin d'une police, donc Alors que votre code original est utilisé/Times-Roman, le code distillé n'a pas besoin de police, mais dessine plutôt le texte en utilisant des vecteurs.

Je ne sais pas exactement ce que vous recherchez, mais vous pouvez essayer "ps2write" ou "epswrite" comme alternative à "pswrite". pswrite est utilisé pour écrire à la norme ps niveau 1 et ps2write écrit ps sortie niveau 2. Personne n'a plus besoin de ps niveau 1, donc le niveau 2 serait acceptable. L'epswrite écrira au postscript encapsulé (eps).

+0

epswrite semble produire une sortie presque identique à pswrite. ps2write est encore plus encodé. Je me bats pour créer un document PDF en utilisant LaTeX à partir de la sortie PostScript de Matlab. J'ai besoin d'analyser la sortie postscript pour trouver des «blocs» et créer des liens hypertexte. Actuellement, les points de référence post-scriptum ne sont pas issus d'un coin en bas à gauche, ce qui rend l'analyse et le calcul des cases autour des objets très compliqués. Je cherche des moyens de nettoyer la sortie Postscript Matlab pour faciliter mon analyse. – Chris

+0

Pour moi, la réponse la plus simple serait que postscript fasse le travail. En postscript, vous pouvez redéfinir les opérateurs. L'opérateur "show" pourrait sortir un fichier (cvs ou fixed fielded) avec un format d'enregistrement show, x, y, couleur, texte et rectfill pour sauvegarder rectangles rect, x1, y1, x2, y2, couleur postscript a un "pathbbox" opérateur qui va calculer un cadre de toute forme de chemin, donc plutôt que Ghostscript a également un pdfwrite, plutôt que d'avoir le texte juste donner 1 x/y, il pourrait définir la boîte le texte se trouve dans show, x1, y1, x2, y2 , couleur, texte –

+0

en plus de pswrite, il y a aussi un pdfwrite, qui produirait des pdf. Avec la technique décrite ci-dessus, il peut être possible de convertir le .ps en .pdf et d'avoir un fichier de données des emplacements. Le ghostscript, pswrite, epswrite, pdfwrite sont tous du code open source. Si vous vous sentez vraiment aventureux, vous pouvez modifier ghostscript pour faire exactement ce que votre ghostscript est un code moche et modifier le spectacle et le rectfill serait beaucoup plus facile. –

6

Le 'texte' a été converti en images, pas les chemins vectoriels. C'est une limitation sérieuse du périphérique pswrite, et l'une des raisons pour lesquelles il est obsolète, vous devriez utiliser le périphérique ps2write à la place. La seule raison pour laquelle le périphérique pswrite est toujours inclus est pour epswrite qui l'utilise (ce qui explique pourquoi la sortie pswrite et epswrite a la même apparence). À un certain moment, il y aura un périphérique eps2write et pswrite sera mis en binôme.

La sortie ps2write est, par défaut, compressée. Si vous voulez une sortie non compressée, utilisez le commutateur -dCompressPages = false sur la ligne de commande.

Si vous ne voulez que l'emplacement du texte, vous pouvez considérer le périphérique txtwrite. L'implémentation par défaut de ceci crée une représentation en texte brut de l'entrée, mais vous pouvez lui faire sortir un XML falsifié à la place qui inclut des choses comme l'origine du texte.

1

Voici un exemple simple de l'opérateur d'affichage en cours de redéfinition pour afficher des informations de position sur l'émission, en même temps que l'exécution de l'opération d'affichage standard. Avec ghostscript, vous pouvez exécuter plusieurs fichiers, de sorte que le fichier d'en-tête soit un préfixe de l'autre fichier, ce qui modifie le comportement standard.

Le spectacle redéfini aurait pu inclure le nom et la taille de la police. Les données pourraient avoir été écrites sur un fichier disque, plutôt que d'être transférées vers la console. Comme n'importe quel autre opérateur aurait pu être redéfini, comme rectfill, fill, stroke ... Comme l'opérateur original est également appelé, vous pouvez convertir un .ps en .pdf en utilisant un périphérique pdfwrite, tout en obtenant des informations de position.

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

sortie

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 

trash.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 
Questions connexes