2012-10-01 44 views
5

Quiero recortar el área principal de un archivo PS o PDF para crear un archivo EPS sin espacio en blanco. Los comandos de ghostrcipt, ps2pdf, epstools pueden recortar el dibujo principal del archivo del documento.Cómo ajustar BoundingBox de un archivo EPS?

El problema es que solo recortan en su forma original, pero quiero crear un archivo EPS con BoundingBox 0 0 x y; recortado y movido a la esquina inferior izquierda.

La diferencia es cuando queremos insertar el archivo EPS resultante dentro de un documento PS. Al tener BoundingBox x0 y0 x y, el documento PS inserta el archivo EPS en el punto x0 y0, en lugar de donde estamos.

Ejemplo:

Consideremos un simple archivo PS como

%! 
/Times-Roman findfont 
11 scalefont setfont 

72 700 moveto 
(This is a test)show 

si la conversión a EPS con un comando como

ps2eps test.ps test.eps 

Producirá

%!PS-Adobe-2.0 EPSF-2.0 
%%BoundingBox: 72 700 127 708 
%%HiResBoundingBox: 72.000000 700.000000 127.000000 707.500000 
%%EndComments 
% EPSF created by ps2eps 1.68 
%%BeginProlog 
save 
countdictstack 
mark 
newpath 
/showpage {} def 
/setpagedevice {pop} def 
%%EndProlog 
%%Page 1 1 
/Times-Roman findfont 
11 scalefont setfont 
72 700 moveto 
(This is a test)show 
%%Trailer 
cleartomark 
countdictstack 
exch sub { end } repeat 
restore 
%%EOF 

Se recortó en sus coordenadas originales, y el resultado BoundingBox es 72 700 127 708. Ahora, si intenta insertar este archivo EPS dentro de un documento PS, intenta anidar en esta coordenada.

Será útil si se crea un archivo EPS con BoundingBox: 0 0 55 8. Por supuesto, todas las coordenadas de dibujo (aquí moveto) se deben modificar con esta nueva referencia.

NOTA: Como dije, mi propósito al fijar el punto de referencia BoundingBox es hacer que sea importable dentro del documento PS. Por lo tanto, una respuesta alternativa a esta pregunta es: cómo insertar un archivo EPS dentro del documento PS independientemente de su BoundingBox.

Por ejemplo, cómo insertar este archivo EPS en la ubicación 200 200 255 208 de un documento PS. Trato de insertar las EPS con el siguiente código, pero no va a funcionar a menos que el BoundingBox se inicia desde 0 0:

200 200 translate 
save 
/showpage {} bind def 
(test.eps)run 
restore 
+0

Por favor, publique (un enlace a) un archivo EPS de muestra que desea ver modificado. –

+0

@KurtPfeifle El caso es general, pero describí mi problema con ejemplos. – Googlebot

Respuesta

2

¿Qué pasa simplemente ONU -translating?

-72 -700 translate 

De cualquier en la propia EPS, o en la sección de preparación antes de la inclusión?


AWKward!

El siguiente texto mecanografiado ilustra un script awk que realiza las modificaciones deseadas a los eps, guiados por los comentarios DSC (¡como solía hacer Mamá!).

La ventaja es: si se puede garantizar que la entrada de EPS se ajusta lo suficiente como para DSC para proporcionar estos marcadores, este enfoque será órdenes de magnitud más rápido que pasa el archivo a través Ghostscript.

La simplicidad es a la vez la ventaja y la limitación de este programa. Analiza los comentarios de DSC, extrae los valores del comentario de BoundingBox, suprime HiResBoundingBox y agrega comillas PostScript 'traducir' y 'rectclip' justo después del comentario de la página. Esto debería producir los resultados correctos siempre que el EPS realmente sea de buena fe. Pero el enfoque de ghostscript en la otra respuesta producirá resultados en los archivos de entrada con una conformidad de DSC menos confiable (porque no está tomando atajos, trata DSC como comentarios y los ignora por completo).

Estrictamente hablando, el 'rectclip' no debería ser necesario, pero la pregunta pide que la salida sea "recortada".

592(1)11:27 AM:~ 0> cat epscrop.awk 
/%%BoundingBox: ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*)/{x=$2;y=$3;w=$4-x;h=$5-y;print $1,0,0,w,h} 
!/%%BoundingBox:/&&!/%%HiRes/{print} 
/%%Page /{print -x,-y,"translate"; print 0,0,w,h,"rectclip"} 


593(1)11:27 AM:~ 0> awk -f epscrop.awk etest.eps 
%!PS-Adobe-2.0 EPSF-2.0 
%%BoundingBox: 0 0 55 8 
%%EndComments 
% EPSF created by ps2eps 1.68 
%%BeginProlog 
save 
countdictstack 
mark 
newpath 
/showpage {} def 
/setpagedevice {pop} def 
%%EndProlog 
%%Page 1 1 
-72 -700 translate 
0 0 55 8 rectclip 
/Times-Roman findfont 
11 scalefont setfont 
72 700 moveto 
(This is a test)show 
%%Trailer 
cleartomark 
countdictstack 
exch sub { end } repeat 
restore 
%%EOF 
+0

El problema es que no conozco BoundingBox de cada archivo EPS. Quiero decir que tendré que verificarlo para cada archivo EPS. Espero encontrar un enfoque general. – Googlebot

+1

El enfoque general es leer los comentarios de %% BoundingBox y configurar correctamente el CTM antes de insertar el EPS. También es una práctica común incluir un clip en el BoundinBox (aunque esto no debería ser necesario) y redefinir el showpage a una operación nula, aunque esto tampoco debería ser requerido en un EPS apropiado. Sin embargo, muchos archivos 'EPS' no son realmente compatibles. El punto básico es que el consumidor de EPS debe leer y actuar según los comentarios. – KenS

+0

@Ali: vea mis comandos de Ghostscript para un 'enfoque general'. –

3

para convertirlo en un EPS con el estilo BoundingBox desea, me gustaría utilizar Ghostscript y dejar que las EPS hacer una ida y vuelta: EPS => => PDF EPS.

El truco es asegurarse de que el PDF utiliza un tamaño de medio que es el mismo que el ancho y la altura del BoundingBox agregando el parámetro -dEPSCrop.

Estos dos comandos crean sus 'EPS y sin espacios en blanco':

1er paso: EPS convertir a PDF:

gs     \ 
    -o so#12682621.pdf \ 
    -sDEVICE=pdfwrite \ 
    -dEPSCrop   \ 
    so#12682621.eps 

segundo paso: convertir PDF de vuelta a EPS:

gs        \ 
    -o so#12682621.roundtripped.eps \ 
    -sDEVICE=epswrite    \ 
    so#12682621.pdf 

Para probar el fideli dad de su EPS resultantes, se podría usar ImageMagick de compare para mostrar las diferencias, de píxel en rojo, como un archivo PNG:

compare      \ 
    -density 600    \ 
    12682621.roundtripped.eps \ 
    12682621.eps    \ 
    -compose src    \ 
    12682621.png 

que se traduce en: enter image description here

Se dará cuenta de que hay algunas diferencias de píxeles. Están causados ​​por el valor de 707.500000 del %%HiResBoundingBox, lo que lleva a un error de redondeo más adelante (PNG no puede tener 'medio píxel').

Cuestiones relacionadas