2012-02-07 5 views
24

J'ai quelques fichiers de modèles PDF avec un contenu complexe et plusieurs régions/zones vides. Je dois être en mesure d'écrire du texte dans ces régions vides et enregistrer les fichiers PDF résultants dans un dossier.Comment modifier ou écrire sur un PDF existant avec Ruby?

J'ai cherché des réponses à cette question assez intensivement, mais je n'ai pas trouvé de réponses précises. L'une des meilleures solutions est PDF::Toolkit, mais il faudrait acheter Adobe Acrobat pour ajouter des attributs remplaçables aux documents PDF existants.

Le monde PHP est doté de FPDI qui peut être utilisé simplement pour ouvrir un fichier PDF et l'écrire/dessiner sur le contenu existant. Il y a un Ruby port of this library, mais le dernier commit a eu lieu au début de l'année 2009. De plus, ce projet ne semble pas très utilisé et soutenu.

La question est: Quelle est la meilleure façon Ruby d'éditer, d'écrire ou de dessiner sur des fichiers PDF existants?

Cette question ne semble pas avoir de réponse ici. Ces questions sont liées, mais pas vraiment la même chose:

Répondre

27

vous devez certainement vérifier Prawn gem, par lequel vous pouvez générer des fichiers PDF personnalisés. Vous pouvez réellement utiliser crevette pour écrire du texte dans des fichiers PDF existants en traitant le fichier PDF existant comme un modèle pour votre nouveau document Crevette.

Par exemple:

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 

Cela écrire un texte sur la première page de l'ancien pdf.

Voir plus ici: http://prawn.majesticseacreature.com/manual.pdf

+0

Oui, je l'ai considéré (et même inscrit dans ma question), mais l'édition de PDF existants est une exigence pour mon projet. Merci pour la réponse. –

+0

J'ai ce problème, une idée? http://stackoverflow.com/questions/12076299/my-text-is-written-in-a-bad-direction-when-i-use-a-template – Sebastien

+2

J'utilise exactement cette méthode pour ajouter du texte à des fichiers PDF existants . Pourquoi cette réponse ne fonctionne-t-elle pas pour vous? –

1

Le mieux que je peux penser est Rails-latex, il ne permet pas vous pouvez éditer les fichiers PDF existants mais cela vous permettra de configurer le template * .tex.erb que vous pouvez modifier dynamiquement et les compiler en PDF pour tapis (avec dvi et un certain nombre d'autres).

+0

Merci pour cette réponse, mais l'édition de fichiers PDF existants est une exigence dans mon cas. Pour la création de nouveaux PDF quelque chose comme crevette aurait travaillé pour moi ... –

1

PDFLib semble faire la chose que vous voulez et a des liaisons de rubis.

+0

Cela ressemble en effet à un excellent outil, mais comme il n'est pas open source (pas gratuit) - nous Je vais devoir considérer le prix. La version que nous pouvons utiliser est d'environ 2100 $ - c'est beaucoup de notre petit projet à petit budget. Aussi, cela ne peut probablement pas être considéré comme un "Rails-way", car il est si cher :) Je vais probablement aller de l'avant avec PDF :: Toolkit et l'utiliser pour remplir les valeurs des attributs PDF, au lieu de dessiner sur PDF. Mais merci pour cette réponse - j'apprécie vraiment! –

+0

Ouais, il est toujours difficile de mordre un gros prix au début. Acheté Prince XML pour faire des PDF il y a un certain temps, et cela semblait être beaucoup d'argent à l'époque, mais ça a payé. –

+0

J'utilise aussi Prince XML pour l'un de mes autres projets - ça marche, mais pas pour ce cas que j'essaie de résoudre malheureusement. –

14

Depuis Prawn a supprimé la fonction de modèle (il était plein de bugs) la meilleure façon que je l'ai trouvé est le suivant:

  1. Utilisez Prawn pour générer un PDF avec seulement les parties dynamiques que vous souhaitez ajouter .
  2. Utilisez PDF::Toolkit (qui enveloppe PDFtk) pour combiner le PDF crevettes avec l'original.

Irrégulier Exemple:

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

Je recommande prawn pour générer des PDF, puis en utilisant combine_pdf pour combiner deux fichiers PDF générés en un seul. Je l'utilise comme ça et ça marche très bien.

exemple court (du README) de la façon de combiner deux fichiers 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

merci de partager cela, fonctionne très bien pour notre cas d'utilisation. –

+0

J'ai trouvé que cela ne fonctionnait pas bien pour moi, parce que le fichier "logo" (pour moi, c'était un modèle global, que j'ajoutais juste un peu de texte) couvrirait tout ce que j'avais ajouté (en utilisant Prawn :: PDF, similaire à d'autres réponses). J'ai trouvé ceci pour le résoudre pour moi, cependant (en remplaçant ce qui est à l'intérieur du bloc sur la ligne 3 dans cette réponse): 'page.replace (company_logo.copy << page)' – lindes

1

D'après mes recherches, Crevette est l'un des meilleurs libre et des pierres précieuses que j'ai trouvé. La fonctionnalité de modèle ne fonctionne pas dans la version ultérieure. La dernière version que je pourrais trouver pour travailler avec des modèles est 1.0.0.rc2 - 1er mars 2013. Impossible de trouver une version plus récente qui fonctionne avec les modèles. Soyez donc attentif si vous utilisez des versions ultérieures. Vérifiez ci-dessous le fil pour plus d'informations.

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

PDFtk est un autre outil capable de manipulation de PDF et de travailler avec des modèles. Mais il mentionne les points suivants,

  • Cette bibliothèque est gratuite pour un usage personnel, mais nécessite une licence si elle est utilisée dans la production
  • Ceci est un outil de ligne de commande non-rubis

Pour plus d'informations S'il vous plaît se référer au lien ci-dessous http://adamalbrecht.com/2014/01/31/pre-filling-pdf-form-templates-in-ruby-on-rails-with-pdftk/

Questions connexes