web-dev-qa-db-fra.com

Comment éditer ou écrire sur des PDF avec Ruby existants?

J'ai quelques PDF fichiers de modèle avec un contenu complexe et plusieurs régions/zones vides. Je dois pouvoir écrire du texte dans ces régions vides et enregistrer les PDF résultants dans un dossier.

J'ai recherché les réponses à cette question de manière assez intensive, mais je n'ai pas trouvé de réponses définitives. L'une des meilleures solutions est PDF :: Toolkit , mais cela nécessiterait l'achat d'Adobe Acrobat pour ajouter des attributs remplaçables aux documents PDF PDF existants).

Le monde PHP est doté de FPDI qui peut être utilisé pour ouvrir simplement un PDF = fichier et écrire/dessiner dessus sur le contenu existant. Il y a port Ruby de cette bibliothèque , mais le dernier commit pour cela est arrivé début 2009. De plus, ce projet ne ressemble pas à il est largement utilisé et pris en charge.

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

Cette question ne semble pas non plus avoir de réponse ici. Ces questions sont liées, mais pas vraiment les mêmes:

37
Alex Kovshovik

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

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 va écrire du texte sur la première page de l'ancien pdf.

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

31
Said Kaldybaev

Depuis Prawn a supprimé la fonctionnalité de modèle (elle était pleine de bugs), la manière la plus simple que j'ai trouvée est la suivante:

  1. Utilisez Crevette pour générer un PDF avec UNIQUEMENT les parties dynamiques que vous souhaitez ajouter.
  2. Utilisez PDF :: Toolkit (qui enveloppe PDFtk ) pour combiner la crevette PDF avec l'original.

Exemple approximatif:

require 'prawn'
require 'pdf/toolkit'

template_filename = 'some/dir/Awesome-Graphics.pdf'
prawn_filename = 'temp.pdf'
output_filename = 'output.pdf'

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

PDF::Toolkit.pdftk(prawn_filename, "background", template_filename, "output", output_filename)
21
Marc L

Je recommande crevette pour générer des PDF et ensuite utiliser combine_pdf pour combiner deux PDF générés ensemble en un seul. Je l'utilise comme ça et ça marche très bien.

Petit exemple (extrait du README) de la façon de combiner deux 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"
18
Paweł Gościcki

Vous n'avez pas besoin d'utiliser une combinaison de gemmes, vous pouvez utiliser une seule gemme!

Travailler avec des PDF est vraiment difficile dans Ruby/Rails (donc je l'ai découvert!)

C'est ainsi que j'ai pu ajouter du texte dynamiquement à un PDF dans Rails.

ajoutez cette gemme à votre gem gem file combine_pdf

puis vous pouvez utiliser du code comme celui-ci:

# get the record from the database to add dynamically to the pdf
user = User.last

# get the existing pdf
pdf = CombinePDF.load "#{Rails.root}/public/pdf/existing_pdf.pdf"

# create a textbox and add it to the existing pdf on page 2
pdf.pages[1].textbox "#{user.first_name} #{user.last_name}", height: 20, width: 70, y: 596, x: 72

# output the new pdf which now contains your dynamic data
pdf.save "#{Rails.root}/public/pdf/output#{Time.now.to_s}.pdf"

Vous pouvez trouver des détails sur la méthode textbox ici: https://www.rubydoc.info/gems/combine_pdf/0.2.5/CombinePDF/Page_Methods#textbox-instance_method

J'ai passé des jours sur ce travail à travers un certain nombre de joyaux différents: prawnwicked_pdfpdfkitfillable_pdf

Mais c'était de loin la solution la plus simple pour moi en 2019.

J'espère que cela fait gagner beaucoup de temps à quelqu'un afin qu'il n'ait pas à passer par tous les essais et erreurs que j'ai dû faire avec les PDF !!

1
Sami Birnbaum

Le mieux que je puisse penser est Rails-latex , cela ne vous permet pas de modifier les fichiers PDF PDF existants mais cela vous permettrait de configurer le modèle * .tex .erb que vous pouvez modifier dynamiquement et les compiler au format PDF (avec dvi et plusieurs autres).

1
rudolph9

PDFLib semble faire ce que vous voulez et possède des liaisons Ruby.

1
Joel Meador

Selon mes recherches, la crevette est l'une des meilleures gemmes gratuites que j'ai trouvées. La fonctionnalité de modèle ne fonctionne pas dans la version ultérieure. La dernière version que j'ai pu trouver pour travailler avec des modèles est 1.0.0.rc2 - 1er mars 2013. Impossible de trouver une version ultérieure qui fonctionne avec des modèles. Soyez donc attentif si vous utilisez des versions ultérieures. Consultez le fil ci-dessous pour plus d'informations.

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

PDFtk est un autre outil capable pour la manipulation PDF et pour 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 en production
  • Ceci est un outil en ligne de commande non Ruby

Pour plus d'informations, veuillez consulter le lien ci-dessous http://adamalbrecht.com/2014/01/31/pre-filling-pdf-form-templates-in-Ruby-on-Rails-with-pdftk/ =

0
SajithP