2012-02-07 27 views
24

Tengo un par de archivos de plantilla PDF con contenido complejo y varias regiones/áreas en blanco en ellos. Necesito poder escribir texto en esas regiones en blanco y guardar los PDF resultantes en una carpeta.¿Cómo editar o escribir en un PDF existente con Ruby?

Busqué en Google las respuestas a esta pregunta bastante intensamente, pero no encontré respuestas definitivas. Una de las mejores soluciones es PDF::Toolkit, pero requeriría la compra de Adobe Acrobat para agregar atributos reemplazables a los documentos PDF existentes.

El mundo PHP está bendecido con FPDI que se puede utilizar para simplemente abrir un archivo PDF y escribir/dibujar sobre el contenido existente. Hay un Ruby port of this library, pero el último compromiso se produjo a comienzos de 2009. Además, ese proyecto no parece que sea ampliamente utilizado y compatible.

La pregunta es: ¿Cuál es la mejor manera de Ruby de editar, escribir o dibujar en archivos PDF existentes?

Esta pregunta tampoco parece ser respondida aquí. Estas preguntas están relacionadas, pero realmente no es el mismo:

Respuesta

27

definitivamente tiene que consultar Prawn gema, mediante el cual puede generar cualquier archivo pdf personalizado. En realidad, puede utilizar gambas para escribir en texto en archivos PDF existentes tratando el PDF existente como una plantilla para su nuevo documento de Gambas.

Por ejemplo:

filename = "#{Prawn::DATADIR}/pdfs/multipage_template.pdf" 
Prawn::Document.generate("full_template.pdf", :template => filename) do 
    text "THis content is written on the first page of the template", :align => :center 
end 

Esto escribirá el texto en la primera página del viejo pdf.

Ver más aquí: http://prawn.majesticseacreature.com/manual.pdf

+0

Sí, lo he considerado (e incluso incluido en mi pregunta), pero la edición de archivos PDF existentes es un requisito para mi proyecto. Gracias por la respuesta. –

+0

Tengo este problema, ¿alguna idea? http://stackoverflow.com/questions/12076299/my-text-is-written-in-a-bad-direction-when-i-use-a-template – Sebastien

+2

Utilizo exactamente este método para agregar textos extensamente a archivos PDF existentes . ¿Por qué esta respuesta no funciona para ti? –

1

Lo mejor que puedo pensar es Rails-latex, que no permite editar archivos PDF existentes, pero le permitiría configurar la plantilla * .tex.erb que puede modificar dinámicamente y compilar en PDF para mat (junto con dvi y un número de otros).

+0

Gracias por esta respuesta, pero la edición de archivos PDF existentes es un requisito en mi caso. Para crear nuevos archivos PDF algo como gambas podría haber funcionado para mí ... –

1

PDFLib parece hacer lo que quiere y tiene atascamientos de rubí.

+0

Esto parece una gran herramienta, pero como no es de código abierto (no gratis) - Tendrás que considerar el precio. La versión que podemos usar es de aproximadamente $ 2100; este es mucho de nuestro pequeño proyecto de bajo presupuesto. También esto probablemente no podría considerarse una "vía de carriles", ya que es muy caro :) Probablemente seguiré adelante con PDF :: Toolkit y lo usaré para completar los valores de atributos de PDF, en lugar de dibujar en PDF. Pero gracias por esta respuesta, ¡realmente lo aprecio! –

+0

Sí, siempre es difícil morder un costo tan grande al principio. Comprar Prince XML para hacer archivos PDF hace un tiempo, y parecía mucho dinero en el momento, pero ha dado sus frutos. –

+0

También uso Prince XML para uno de mis otros proyectos, funciona, pero no para este caso, estoy tratando de abordar desafortunadamente. –

14

Desde Prawn ha eliminado la función de plantilla (que estaba lleno de bichos) la manera más fácil que he encontrado es la siguiente:

  1. Uso Prawn para generar un PDF con sólo las partes dinámicas que desea añadir .
  2. Utilice PDF::Toolkit (que ajusta PDFtk) para combinar el PDF de Gamba con el original.

Rough Ejemplo:

require 'prawn' 
require 'pdf/toolkit' 

template_file = 'some/dir/Awesome-Graphics.pdf' 
prawn_file = 'temp.pdf' 
output_file = 'output.pdf' 

Prawn::Document.generate(prawn_file) do 
    # Generate whatever you want here. 
    text_box "This is some new text!", :at => [100, 300] 
end 

PDF::Toolkit.pdftk(prawn_file, "background", template_file, "output", output_file) 
12

recomiendo prawn para la generación de archivos PDF y luego usando combine_pdf para combinar dos archivos PDF generados juntos en una sola. Lo uso así y funciona bien.

ejemplo corto (desde el README) de cómo combinar dos archivos PDF:

company_logo = CombinePDF.load("company_logo.pdf").pages[0] 
pdf = CombinePDF.load "content_file.pdf" 
pdf.pages.each { |page| page << company_logo } # notice the << operator is on a page and not a PDF object. 
pdf.save "content_with_logo.pdf" 
+0

gracias por compartir esto, funciona muy bien para nuestro caso de uso. –

+0

Descubrí que esto no me funcionaba bien, porque el archivo "logo" (para mí, era una plantilla general, a la que le estaba agregando un poco de texto) cubriría todo lo que había agregado (utilizando Prawn :: PDF, similar a algunas otras respuestas). Sin embargo, encontré esto para resolverlo para mí (reemplazando lo que está dentro del bloque en la línea 3 en esta respuesta): 'page.replace (company_logo.copy << page)' – lindes

1

Según mi investigación, gambas es uno de los mejores libre y gemas que he encontrado. La funcionalidad de la plantilla no funciona en la versión posterior. La última versión que pude encontrar para trabajar con plantillas es 1.0.0.rc2 - 1 de marzo de 2013. No pude encontrar ninguna versión posterior que funcione con plantillas. Así que ten cuidado si estás usando versiones posteriores a esta. Verifique el hilo a continuación para obtener más información.

https://groups.google.com/forum/#!searchin/prawn-ruby/prawn $ 20templates/gambas-rubí/RYGPImNcR0I/7mxtnrEDHeQJ

PDFtk es otra herramienta capaz para la manipulación de PDF y trabajar con plantillas. Pero menciona siguientes puntos,

  • Esta biblioteca es gratuito para uso personal, pero requiere una licencia si se utiliza en la producción
  • Esta es una herramienta de línea de comandos no rubí

Para obtener más información Consulte el siguiente enlace http://adamalbrecht.com/2014/01/31/pre-filling-pdf-form-templates-in-ruby-on-rails-with-pdftk/

Cuestiones relacionadas