2012-05-02 98 views
11

Me gustaría saber cómo eliminar márgenes blancos de un archivo PDF. Al igual que Adobe Acrobat X Pro. Entiendo que no funcionará con todos los archivos PDF.PDF - Eliminar márgenes blancos

Supongo que la forma de hacerlo es obtener los márgenes de texto, y luego recortar esos márgenes.

Se prefiere PyPdf.

iText encuentra márgenes del texto en base a este código:

public void addMarginRectangle(String src, String dest) 
    throws IOException, DocumentException { 
    PdfReader reader = new PdfReader(src); 
    PdfReaderContentParser parser = new PdfReaderContentParser(reader); 
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(RESULT)); 
    TextMarginFinder finder; 
    for (int i = 1; i <= reader.getNumberOfPages(); i++) { 
     finder = parser.processContent(i, new TextMarginFinder()); 
     PdfContentByte cb = stamper.getOverContent(i); 
     cb.rectangle(finder.getLlx(), finder.getLly(), 
      finder.getWidth(), finder.getHeight()); 
     cb.stroke(); 
    } 
    stamper.close(); 
} 

Respuesta

18

No estoy muy familiarizado con PyPDF, pero sé Ghostscript será capaz de hacer esto para usted. A continuación se presentan enlaces a otras respuestas a las preguntas similares:

  1. Convert PDF 2 sides per page to 1 side per page (SuperUser.com)
  2. Freeware to split a pdf's pages down the middle? (SuperUser.com)
  3. Cropping a PDF using Ghostscript 9.01 (StackOverflow.com)

La tercera respuesta es probablemente lo que te hizo decir 'Entiendo que no funcionará con todos los archivos PDF'. Utiliza el pdfmark comando para tratar de configurar el /CropBox en los objetos de la página PDF.

El método de las dos primeras respuestas probablemente tendrá éxito donde el tercero falle. Este método utiliza un fragmento de comando PostScript de <</PageOffset [NNN MMM]>> setpagedevice para desplazar y colocar las páginas PDF en un tamaño de medio (más pequeño) definido por el parámetro -gNNNNxMMMM (que define el ancho y alto del dispositivo en píxeles).

Si usted entiende el concepto detrás de las dos primeras respuestas, usted podrá fácilmente adaptar el método utilizado allí para márgenes de los cultivos en los 4 bordes de una página PDF:

Un ejemplo de comando para recortar una carta PDF de tamaño (8.5x11in == 612x792pt) por medio de una pulgada (== 36pt) en cada uno de los 4 bordes (comando es para Windows):

gswin32c.exe^
    -o cropped.pdf^
    -sDEVICE=pdfwrite^
    -g5400x7200^
    -c "<</PageOffset [-36 -36]>> setpagedevice"^
    -f input.pdf 

será 7.5x10in El tamaño de página resultante (== 540x720pt) Para hacer lo mismo en Linux o Mac, utilice:

gs \ 
    -o cropped.pdf \ 
    -sDEVICE=pdfwrite \ 
    -g5400x7200 \ 
    -c "<</PageOffset [-36 -36]>> setpagedevice" \ 
    -f input.pdf 

Actualización: Cómo determinar 'márgenes' con Ghostscript

Un comentario solicitó determinación 'automático' de los márgenes blancos. Puedes usar Ghostscript también para esto. Su dispositivo bbox puede determinar el área cubierta por la tinta (virtual) en cada página (y por lo tanto, indirectamente, el espacio en blanco para cada borde del lienzo).

Este es el comando:

gs \ 
    -q -dBATCH -dNOPAUSE \ 
    -sDEVICE=bbox \ 
    input.pdf 

de salida (ejemplo):

%%BoundingBox: 57 29 562 764 
%%HiResBoundingBox: 57.265030 29.347046 560.245045 763.649977 
%%BoundingBox: 57 28 562 667 
%%HiResBoundingBox: 57.265030 28.347046 560.245045 666.295011 

El dispositivo bbox hace que cada página PDF en la memoria (sin necesidad de escribir cualquier salida en el disco) y luego imprime el BoundingBox y información de HiResBoundingBox a stderr. Usted puede modificar esta orden como para hacer que los resultados sean más fácil de analizar:

gs \ 
    -q -dBATCH -dNOPAUSE \ 
    -sDEVICE=bbox \ 
    input.pdf \ 
    2>&1 \ 
    | grep -v HiResBoundingBox 

de salida (ejemplo):

%%BoundingBox: 57 29 562 764 
%%BoundingBox: 57 28 561 667 

Esto te diría ...

  • .. .que la esquina inferior izquierda del rectángulo de contenido de Page 1 esté en las coordenadas [57 29] con la esquina superior derecha en [562 741]
  • ... que la esquina inferior izquierda del rectángulo contenido de Página 2 es en las coordenadas [57 28] con la esquina superior derecha está en [561 667]

Esto significa:

  • Página 1 usa un espacio en blanco de 57 pt en el borde izquierdo (72pt == 1in == 25,4mm).
  • Page 1 utiliza un espacio en blanco de 29 pt en el borde inferior.
  • Page 2 utiliza un espacio en blanco de 57 pt en el borde izquierdo.
  • Page 2 utiliza un espacio en blanco de 28 pt en el borde inferior.

Como puede ver en este sencillo ejemplo, el espacio en blanco no es exactamente el mismo para cada página. Dependiendo de sus necesidades (es probable que desee el mismo tamaño para cada página de un PDF de varias páginas, ¿no?), Debe determinar cuáles son los márgenes mínimos para cada borde en todas las páginas del documento.

Ahora, ¿qué pasa con los espacios en blanco derecho y superior? Para calcular eso, necesita saber el tamaño de página original para cada página. La forma más simple de determinar esto: la utilidad pdfinfo. Comando de ejemplo para un 5 página PDF:

pdfinfo \ 
    -f 1 \ 
    -l 5 \ 
    input.pdf \ 
| grep "Page " 

de salida (ejemplo):

Page 1 size: 612 x 792 pts (letter) 
Page 2 size: 612 x 792 pts (letter) 
Page 3 size: 595 x 842 pts (A4) 
Page 4 size: 842 x 1191 pts (A3) 
Page 5 size: 612 x 792 pts (letter) 

Esto le ayudará a determinar el tamaño del lienzo requerida y el requerido (máximo) márgenes blancos de los bordes superior e correctas de cada una de sus nuevas páginas de PDF.

Por supuesto, todos estos cálculos se pueden programar.

Pero si sus archivos PDF son todas de un tamaño de página uniq, o si se trata de documentos de 1 página, todo es mucho más fácil que hacer ...

+1

¿Por qué no utilizar itext? – jacktrades

+0

¿Cómo puede saber automáticamente dónde están los márgenes blancos? – jacktrades

+2

@jacktrades: Por supuesto puede usar iText, si lo desea. Sentirse libre. Sin embargo, para iText necesitas escribir un programa Java usando la API iText para hacerlo. Con Ghostscript puede permanecer en la esfera de la programación de scripts, que prefiero en casos como este ... –

8

Trate pdfcrop. Necesita ghostscript.

+0

Funciona, pero genera un archivo de 1 GB de un archivo de 3 MB ... – jacktrades

+2

Sobre el "archivo grande" problema, en los comentarios de [esta publicación del blog] (http://alexsleat.co.uk/2011/01/25/using-pdfcrop-to-remove-white-margins-ubuntu/) sugieren utilizar 'pdfcrop - -xetex --resolución 72 [otras-opciones] input.pdf output.pdf' para resolverlo –

+1

Libre, rápido, automática y correctamente identifica los márgenes, preinstalado. Justo lo que necesitaba. – fuenfundachtzig

1

Encontré esto y funciona increíblemente bien (es muy simple de usar). http://www.pdfscissors.com/

+0

incuestionablemente. hizo el trabajo en 2 minutos herramienta increíble. – Thupten

+1

no es ideal para grandes archivos PDF. java se queda sin memoria. :( – Thupten

+2

el sitio ya no existe – SpamBot

Cuestiones relacionadas