Superposer deux fichiers postscript (approche par ligne de commande)?

Je suis conscient que des questions similaires ont été répondues ici avant:

  • postscript – superposer un fichier pdf ou ps sur un autre – Stack Overflow
  • superposition – Superposition ou fusion de plusieurs fichiers .ps – Dépassement de la stack

… cependant, comme ils ne répondent pas directement à mon problème spécifique, j’essaierai de demander à nouveau.

J’aimerais savoir comment superposer deux fichiers postscript: un – un logo:

  • logo.ps

… sur l’autre – un arrière-plan graphique:

  • tmp-Front.ps

…. en utilisant une approche en ligne de commande sous Linux.

Il est important ici que le fond graphique conserve le plus possible son contenu original. Par conséquent, je serais probablement plus heureux si je pouvais concaténer les deux contenus originaux du fichier postscript sans les modifier (voir ci-dessous) – mais à part ça, j’aimerais savoir comment des outils en ligne de commande comme ghostscript pourraient être utilisés à cette fin.

Le problème – logo en haut de la carte imprimée .ps

Voici le problème plus en détail – je veux append un logo sur une impression de carte de circuit imprimé. J’utilise kicad pour développer l’impression PCB; une fois cela fait, j’exporte un document postscript avec les calques individuels. D’habitude, je veux avoir la couche de cuivre avant “miroir”; J’ai souvent expérimenté le chargement de la sortie .ps dans, disons, inkscape , puis j’essaie d’y faire un miroir. Utiliser inkscape était également pratique, car on pouvait facilement y append un logo (et ensuite mettre en miroir l’impression et le logo).

Cependant, utiliser inkscape pour traiter la sortie postscript est une opération intensive ( car il faut un certain temps à inkscape pour charger, faire de la mise en miroir et sauvegarder ). Les dimensions peuvent être légèrement modifiées dans le fichier de sortie par inkscape ( et cela fait une grande différence lorsque la cible imprime des pistes de moins d’un millimètre ).

Ainsi, étant donné que la kicad “Plot” de kicad a une option pour la mise en miroir, il est bien sûr beaucoup mieux pour moi de ” kicad ” la copie directement à partir de la kicad “Plot” de kicad ; la sortie est encore un fichier postscript. tmp-Front.ps est un exemple d’un tel fichier postscript (en miroir). Notez que généralement, la partie “cuivre” est remplie de noir – et je voudrais essentiellement avoir un logo blanc sur le dessus.

Maintenant, puisque cette impression est déjà “en miroir” – si je veux append un logo par-dessus, il vaut mieux que le logo soit également mis en miroir. Donc, je inkscape ; et:

  • append un texte pour le logo;
  • configurer via les propriétés du document:
    • que la taille du document correspond à la taille du logo, et
    • que le document doit avoir un fond noir
  • Puis changez le texte du logo pour qu’il soit blanc.
  • faire Object / Flip Horizontal sur le texte du logo; et alors
  • faire Fichier / Enregistrer une copie;
    • choisissez PostScipt (* .ps) comme sortie;
    • dans la boîte de dialog, choisissez PostScript niveau 2 et
    • sélectionnez “Convertir le texte en chemins” avant d’exporter.

Voici comment logo.ps lié ci-dessus a été généré ( notez que – pour ce type de petits logos: sans “text to path”, le fichier .ps (avec les fonts) peut atteindre 20 Ko, contre 5 Ko pour les chemins d’access. seulement ).

Un problème, cependant, est que PostScript ne supporte pas vraiment quelque chose comme une couleur “d’arrière-plan de document” – apparemment vous devez définir vous-même un rectangle rempli:

  • Adobe Forums: Comment faire pour modifier l’arrière-plan de la page de fichier ps en transparent ;
  • Re: L’exportation de canevas vers PostScript perd la couleur d’arrière-plan ;

… donc si vous ouvrez logo.ps , vous ne verrez rien – car il contient des lettres blanches sur fond blanc.

Les spectateurs

Si dans logo.ps , la ligne 1 g est remplacée par 0.5 g ; le logo devient gris (et visible), et ici il est rendu sous evince , le visualiseur brut de gs et gv :

view-logo.png

Voici la même comparaison pour tmp-Front.ps :

view-tmp-Front.png

Notamment, le visualiseur de ghostscript brut ignore l’orientation de la boîte englobante et de la page – et encore plus problématique, si vous utilisez Ubuntu Gnome sur un netbook, la barre du haut et du bas peut couper un peu la fenêtre du visualiseur ghostscript le coin inférieur gauche est invisible; et comme ” … le visualiseur de ghostscript brut gs … n’a pas d’interface utilisateur réelle “, une fenêtre gs qui a démarré avec le logo rogné ne peut pas être définie pour s’afficher ensuite.

Concaténation du contenu du fichier .ps pour la superposition

En regardant ces références:

  • Ghostscript superposant des fichiers postscript concaténés – comp.lang.postscript
  • Re: Fusionner les fichiers postscript – comp.lang.postscript ;
  • Se débarrasser de la pagethrow sur la fusion – Mombu the Programming Forum

… Je suppose que, en principe, il devrait être possible de concaténer le contenu de deux fichiers postscript; et s’il n’y a qu’une seule commande showpage dans le fichier fusionné – alors, en principe, on devrait obtenir une superposition (?!) des deux. Cependant, j’ai essayé cela et je ne peux pas vraiment le faire fonctionner.

Si cela est possible, je voudrais simplement copier / coller le contenu du fichier postscript (et éviter ainsi tout problème avec les dimensions / tailles / résolutions du document) – et éventuellement utiliser la commande de translate Postscript (voir Modification de Postscript dans Gnuplot ) pour ajuster la position du logo. L’ouverture des fichiers .ps «superposés» (fusionnés) dans la evince affichage rafraîchirait l’affichage du document chaque fois que les parameters de translate sont modifiés dans un éditeur de texte. Il devrait donc être relativement facile de gérer le positionnement du logo.

Cependant, je peux aussi prévoir des problèmes ici: pour l’un, le graphique ( tmp-Front.ps ) contient:

 %%BoundingBox: 0 0 596 843 %%DocumentMedia: A4 595 842 0 () () ... 0.0072 0.0072 scale ... 30085 54415 moveto ... 

… tandis que logo.ps contient:

 %%BoundingBox: 0 0 31 13 ... %%DocumentMedia: 11x4mm 31 13 0 () () ... 25.539 9.536 m(oveto) ... ... 

… il y a donc deux différences principales:

  • La taille du document n’est pas la même pour les fichiers
  • L’échelle (ou plutôt la résolution / le système de coordonnées) n’est pas la même, ni

Comme je ne pouvais pas obtenir la concaténation du contenu des fichiers pour travailler – je ne suis pas vraiment sûr que ces différences aient une influence sur la superposition … J’espère certainement qu’elles sont rendues de manière indépendante; et la translate aiderait simplement à définir correctement leur position relative 🙂

Alors, comment pourrais-je faire si je voulais réaliser une superposition en concaténant le contenu des fichiers postscript? Et si c’est trop gênant – comment pourrais-je utiliser un outil tel que ghostscript (ou tout autre), afin de mettre en place une superposition?

Merci d’avance pour toutes les réponses,
À votre santé!


Pour référence, voici des copies des fichiers postscript mentionnés (car ils ne sont pas trop gros):

tmp-Front.ps :

 %!PS-Adobe-3.0 %%Creator: PCBNEW-PS %%CreationDate: Thu Mar 22 09:50:52 2012 %%Title: /tmp-Front.ps %%Pages: 1 %%PageOrder: Ascend %%BoundingBox: 0 0 596 843 %%DocumentMedia: A4 595 842 0 () () %%Orientation: Landscape %%EndComments %%Page: 1 1 /line { newpath moveto lineto stroke } bind def /cir0 { newpath 0 360 arc stroke } bind def /cir1 { newpath 0 360 arc gsave fill grestore stroke } bind def /cir2 { newpath 0 360 arc gsave fill grestore stroke } bind def /arc0 { newpath arc stroke } bind def /arc1 { newpath 4 index 4 index moveto arc closepath gsave fill grestore stroke } bind def /arc2 { newpath 4 index 4 index moveto arc closepath gsave fill grestore stroke } bind def /poly0 { stroke } bind def /poly1 { closepath gsave fill grestore stroke } bind def /poly2 { closepath gsave fill grestore stroke } bind def /rect0 { rectstroke } bind def /rect1 { rectfill } bind def /rect2 { rectfill } bind def /linemode0 { 0 setlinecap 0 setlinejoin 0 setlinewidth } bind def /linemode1 { 1 setlinecap 1 setlinejoin } bind def /dashedline { [50 50] 0 setdash } bind def /solidline { [] 0 setdash } bind def gsave 0.0072 0.0072 scale linemode1 82670 0 translate 90 rotate 60 setlinewidth 60 setlinewidth newpath 30085 54415 moveto 30085 52585 lineto 31915 52585 lineto 31915 54415 lineto 30085 54415 lineto poly1 newpath 87950 54930 moveto 32094 54930 lineto 32094 54474 lineto 32094 54415 lineto 32094 52525 lineto 32071 52470 lineto 32029 52428 lineto 31974 52406 lineto 31915 52406 lineto 30025 52406 lineto 29970 52429 lineto 29928 52471 lineto 29906 52526 lineto 29906 52585 lineto 29906 54475 lineto 29929 54530 lineto 29971 54572 lineto 30026 54594 lineto 30085 54594 lineto 31975 54594 lineto 32030 54571 lineto 32072 54529 lineto 32094 54474 lineto 32094 54930 lineto 28300 54930 lineto 28300 17800 lineto 87950 17800 lineto 87950 54930 lineto poly1 100 setlinewidth newpath 87950 54930 moveto 32094 54930 lineto 32094 54474 lineto 32094 54415 lineto 32094 52525 lineto 32071 52470 lineto 32029 52428 lineto 31974 52406 lineto 31915 52406 lineto 30025 52406 lineto 29970 52429 lineto 29928 52471 lineto 29906 52526 lineto 29906 52585 lineto 29906 54475 lineto 29929 54530 lineto 29971 54572 lineto 30026 54594 lineto 30085 54594 lineto 31975 54594 lineto 32030 54571 lineto 32072 54529 lineto 32094 54474 lineto 32094 54930 lineto 28300 54930 lineto 28300 17800 lineto 87950 17800 lineto 87950 54930 lineto poly0 1 1 1 setrgbcolor 60 setlinewidth 31000 53500 170 cir1 0 0 0 setrgbcolor showpage grestore %%EOF 

logo.ps :

 %!PS-Adobe-3.0 %%Creator: cairo 1.10.2 (http://cairographics.org) %%CreationDate: Thu Mar 22 10:07:46 2012 %%Pages: 1 %%BoundingBox: 0 0 31 13 %%DocumentData: Clean7Bit %%LanguageLevel: 2 %%DocumentMedia: 11x4mm 31 13 0 () () %%EndComments %%BeginProlog /languagelevel where { pop languagelevel } { 1 } ifelse 2 lt { /Helvetica findfont 12 scalefont setfont 50 500 moveto (This print job requires a PostScript Language Level 2 printer.) show showpage quit } if /q { gsave } bind def /Q { grestore } bind def /cm { 6 array astore concat } bind def /w { setlinewidth } bind def /J { setlinecap } bind def /j { setlinejoin } bind def /M { setmiterlimit } bind def /d { setdash } bind def /m { moveto } bind def /l { lineto } bind def /c { curveto } bind def /h { closepath } bind def /re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto 0 exch rlineto 0 rlineto closepath } bind def /S { stroke } bind def /f { fill } bind def /f* { eofill } bind def /n { newpath } bind def /W { clip } bind def /W* { eoclip } bind def /BT { } bind def /ET { } bind def /pdfmark where { pop globaldict /?pdfmark /exec load put } { globaldict begin /?pdfmark /pop load def /pdfmark /cleartomark load def end } ifelse /BDC { mark 3 1 roll /BDC pdfmark } bind def /EMC { mark /EMC pdfmark } bind def /cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def /Tj { show currentpoint cairo_store_point } bind def /TJ { { dup type /ssortingngtype eq { show } { -0.001 mul 0 cairo_font_masortingx dtransform rmoveto } ifelse } forall currentpoint cairo_store_point } bind def /cairo_selectfont { cairo_font_masortingx aload pop pop pop 0 0 6 array astore cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def /Tf { pop /cairo_font exch def /cairo_font_masortingx where { pop cairo_selectfont } if } bind def /Td { masortingx translate cairo_font_masortingx masortingx concatmasortingx dup /cairo_font_masortingx exch def dup 4 get exch 5 get cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def /Tm { 2 copy 8 2 roll 6 array astore /cairo_font_masortingx exch def cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def /g { setgray } bind def /rg { setrgbcolor } bind def /d1 { setcachedevice } bind def %%EndProlog %%Page: 1 1 %%BeginPageSetup %%PageMedia: 11x4mm %%PageBoundingBox: 0 0 31 13 %%EndPageSetup q 0 0 31 13 rectclip q 1 g 25.539 9.536 m 25.539 7.567 l 27.227 7.567 l 27.227 3.817 l 27.227 3.055 27.211 2.606 27.18 2.473 c 27.152 2.348 27.078 2.243 26.961 2.161 c 26.848 2.087 26.707 2.052 26.539 2.052 c 26.324 2.052 25.992 2.13 25.555 2.286 c 25.336 0.364 l 25.922 0.118 26.574 -0.011 27.289 -0.011 c 27.738 -0.011 28.145 0.063 28.508 0.208 c 28.863 0.36 29.125 0.559 29.289 0.802 c 29.457 1.04 29.574 1.364 29.633 1.77 c 29.688 2.048 29.711 2.63 29.711 3.505 c 29.711 7.567 l 30.852 7.567 l 30.852 9.536 l 29.711 9.536 l 29.711 11.395 l 27.227 12.833 l 27.227 9.536 lh 18.535 3.177 m 16.082 2.77 l 16.395 1.864 16.898 1.169 17.582 0.692 c 18.262 0.223 19.117 -0.011 20.145 -0.011 c 21.77 -0.011 22.969 0.52 23.738 1.583 c 24.355 2.434 24.66 3.509 24.66 4.802 c 24.66 6.352 24.262 7.567 23.457 8.442 c 22.648 9.313 21.621 9.755 20.379 9.755 c 18.996 9.755 17.902 9.294 17.098 8.38 c 16.297 7.462 15.914 6.055 15.941 4.161 c 22.129 4.161 l 22.121 3.43 21.926 2.86 21.551 2.458 c 21.168 2.052 20.688 1.848 20.113 1.848 c 19.73 1.848 19.406 1.95 19.145 2.161 c 18.875 2.368 18.672 2.708 18.535 3.177 ch 18.395 5.677 m 18.418 6.391 18.605 6.934 18.957 7.302 c 19.312 7.673 19.742 7.864 20.238 7.864 c 20.781 7.864 21.227 7.665 21.566 7.27 c 21.922 6.884 22.098 6.352 22.098 5.677 ch 15.02 2.864 m 12.535 3.255 l 12.434 2.774 12.219 2.407 11.895 2.161 c 11.574 1.911 11.125 1.786 10.551 1.786 c 9.906 1.786 9.422 1.899 9.098 2.13 c 8.891 2.294 8.785 2.512 8.785 2.786 c 8.785 2.97 8.844 3.13 8.957 3.255 c 9.082 3.368 9.359 3.477 9.785 3.583 c 11.777 4.016 13.039 4.419 13.566 4.786 c 14.309 5.282 14.676 5.989 14.676 6.895 c 14.676 7.696 14.359 8.372 13.723 8.927 c 13.078 9.477 12.09 9.755 10.754 9.755 c 9.477 9.755 8.527 9.544 7.91 9.13 c 7.289 8.712 6.855 8.095 6.613 7.286 c 8.941 6.848 l 9.047 7.212 9.242 7.489 9.52 7.677 c 9.793 7.872 10.188 7.973 10.707 7.973 c 11.355 7.973 11.82 7.884 12.098 7.708 c 12.285 7.571 12.379 7.403 12.379 7.208 c 12.379 7.028 12.297 6.876 12.129 6.755 c 11.914 6.587 11.145 6.352 9.832 6.052 c 8.523 5.759 7.598 5.391 7.066 4.958 c 6.559 4.52 6.301 3.907 6.301 3.13 c 6.301 2.274 6.664 1.532 7.379 0.911 c 8.09 0.294 9.148 -0.011 10.551 -0.011 c 11.824 -0.011 12.828 0.247 13.566 0.77 c 14.309 1.29 14.793 1.989 15.02 2.864 ch 0.066 9.536 m 0.066 7.567 l 1.754 7.567 l 1.754 3.817 l 1.754 3.055 1.738 2.606 1.707 2.473 c 1.68 2.348 1.605 2.243 1.488 2.161 c 1.375 2.087 1.234 2.052 1.066 2.052 c 0.852 2.052 0.52 2.13 0.082 2.286 c -0.137 0.364 l 0.449 0.118 1.102 -0.011 1.816 -0.011 c 2.266 -0.011 2.672 0.063 3.035 0.208 c 3.391 0.36 3.652 0.559 3.816 0.802 c 3.984 1.04 4.102 1.364 4.16 1.77 c 4.215 2.048 4.238 2.63 4.238 3.505 c 4.238 7.567 l 5.379 7.567 l 5.379 9.536 l 4.238 9.536 l 4.238 11.395 l 1.754 12.833 l 1.754 9.536 lh 0.066 9.536 mf QQ showpage %%Trailer %%EOF 

EDIT: Re: la réponse de luser droog ; si j’essaye d’ouvrir combo.ps comme écrit dans evince , je reçois:

 $ evince combo.ps invalidfileaccess -9 

Ceci est probablement lié à # 414002 – gs -dSAFER: / invalidfileaccess avec l’opérateur “run” – Les journaux de rapport de bogue Debian … Si j’essaie d’append l’en-tête PostScript ” %! ” Au début, j’obtiens:

 $ nano combo.ps # added %! at start $ evince combo.ps undefined -21 undefined -21 

J’ai aussi essayé de faire fonctionner ps2ps – c’est ce qui ressort:

 $ ps2ps combo.ps comboB.ps Error: /undefined in --load-- Operand stack: Oldshowpage Execution stack: %interp_exit .runexec2 --nossortingngval-- --nossortingngval-- --nossortingngval-- 2 %stopped_push --nossortingngval-- --nossortingngval-- --nossortingngval-- false 1 %stopped_push 1910 1 3 %oparray_pop 1909 1 3 %oparray_pop 1893 1 3 %oparray_pop 1787 1 3 %oparray_pop --nossortingngval-- %errorexec_pop .runexec2 --nossortingngval-- --nossortingngval-- --nossortingngval-- 2 %stopped_push --nossortingngval-- Dictionary stack: --dict:1159/1684(ro)(G)-- --dict:0/20(G)-- --dict:77/200(L)-- Current allocation mode is local Current file position is 30 GPL Ghostscript 9.02: Unrecoverable error, exit code 1 

Une approche similaire à celle de KenS consisterait à placer le code “composition” dans un seul fichier et à appeler les fichiers composants avec l’opérateur d’ run . Cela revient à la même chose mais avec un peu moins de travail à la shell. Une limitation est que l’option -dSAFER (qui est activée par défaut dans la plupart des installations Distiller) désactive l’opérateur d’ run .

combo.ps:

 /Oldshowpage /showpage load def /showpage {} def gsave (tmp-Front.ps) run grestore %additional scaling and translation to place the graphic? (logo.ps) run Oldshowpage 

Afin de “concaténer” les deux fichiers, vous devez désactiver l’opérateur “showpage”, sinon les deux fichiers émettront leurs pages séparément. Mais vous devez conserver la définition d’origine pour pouvoir émettre le document final. Somethign liek:

 /Oldshowpage showpage load def /showpage {} def ... file1 ... ... file2 ... Oldshowpage 

Donc, si vous avez sauvegardé les redéfinitions dans un fichier, et l’exécution finale dans un autre fichier, vous risquez de cat 'prolog.ps file1.ps file2.ps epilog.ps'

Aucun de vos fichiers n’exécute une requête média (vous pouvez ignorer les lignes %%, ce sont uniquement des commentaires).

Cependant, comme vous le dites à juste titre, vous ne voulez pas que la mise à l’échelle et les transformations persistent entre les travaux. Donc, vous devez enregistrer et restaurer l’état graphique. Donc, dans ce cas, vous voulez également un fichier «intermédiaire».

Donc, prolog.ps contient:

 /Oldshowpage showpage load def /showpage {} def gsave 

middle.ps contient

 grestore 

et epilog.ps contient

 Oldshowpage 

chat tous les 5 fichiers ensemble et il devrait fonctionner. Cela fait quelque chose de sensible pour moi, mais je devrais peut-être mentionner que votre logo.ps produit une page vide pour moi avec Ghostscript et avec Adobe Distiller.

Ok, voici ce qui fonctionne pour moi, grâce à la réponse de @luserdroog , avec des fichiers inchangés, et “directement” dans evince .

Tout d’abord, tmp-Front.ps , logo.ps et @luserdroog combo.ps (modded ci-dessous) dans un répertoire. Le premier problème est que si evince rencontre %%EOF , il arrêtera d’parsingr tout ce qui va suivre. Donc, nous voulons d’abord nous débarrasser de ces directives dans tmp-Front.ps et logo.ps :

 sed -i 's/%%EOF/% %EOF/' logo.ps sed -i 's/%%EOF/% %EOF/' tmp-Front.ps 

Deuxièmement, si evince ne rencontre pas %%Orientation et directives similaires au tout début, alors il ne montrera pas le document dans le paysage (comme le tmp-Front.ps original est). Ainsi, nous devrions extraire ces directives de tmp-Front.ps et les append au début de combo.ps – et enregistrer tout cela en tant que nouveau fichier, combopg.ps :

 cat <(echo '%!') <(grep '%%Pages\|%%PageOrder\|%%BoundingBox\|%%DocumentMedia\|%%Orientation' tmp-Front.ps) <(echo) combo.ps > combopg.ps 

Ici, j’utilise la modification suivante de combo.ps :

 /Oldshowpage /showpage load def /showpage {} def gsave (tmp-Front.ps) run grestore %additional scaling and translation to place the graphic? 1 1 scale 300 300 translate 0 0 moveto (logo.ps) run Oldshowpage 

Enfin, comme evince ne reconnaît pas la directive run , j’utilise cette modification de psinc , psinc.pl pour “inclure” le contenu des fichiers:

 cat combopg.ps | perl ./psinc.pl > combopgout.ps 

Maintenant, vous pouvez enfin ouvrir combopgout.ps dans combopgout.ps – et simultanément dans un éditeur de texte, où vous pouvez rechercher la ligne 300 300 translate ; éditer ces arguments dans l’éditeur de texte et enregistrer le fichier provoquera le rechargement du fichier .ps et affichera la position la plus récente – il semblerait que ceci soit le cas par défaut:

combopgout.ps.png

(Notez que le logo est pivoté selon l’orientation paysage)

Eh bien, je suppose que cela le résout – merci pour les réponses !!