PDF Export mit Rails und LaTeX

Für ein Praktikum an der Uni sollte ich mir überlegen, wie man am besten mit Rails einen PDF-Export realisiert. Ich habe mich im Endeffekt für die Kombination von LaTeX und dem Gem rails-latex entschieden. Wieso und wie die Implementierung aussieht liest du weiter unten.

Grundlegendes

Es gibt eigentlich drei Arten wie man mit Rails relativ einfach PDF’s generiert. Alle haben ihre Vor- und Nachteile, deshalb musst du selbst entscheiden, ob meine Lösung auch in deinem Fall die beste ist.

HTML zu PDF–Konverter

Die gibt es, die gibt es auch für Rails. Die Vorteile liegen auf der Hand:

  • Du kannst HTML, also ist es einfach zu schreiben
  • Du musst dich nirgendwo einarbeiten

Doch die Nachteile überwiegen:

  • Diese Konverter sind meistens ziemlich langsam
  • Man kann wenige PDF-Spezielle Sachen machen (z.B. Kopf– und Fußzeilen)

Prawn oder ein anderer In–Ruby–PDF–Generator

Du schreibst Rails–Code direkt in deiner Anwendung und lässt dir von dem Gem einfach das PDF generieren.

Vorteile:

  • Man muss keine externen Programme aufrufen
  • Man kann den Code in Ruby schreiben und muss nichts neues lernen

Nachteile:

  • Der PDF-Generierungscode ist meistens ziemlich schlecht überschaubar
  • Anpassungen sind relativ schwer vorzunehmen
  • Nicht wiederverwendbar für andere Dokumente

LaTeX

Du generierst mit Rail LaTeX-Code, jagst diesen durch den LaTeX–Parser und bietest die PDF zum Download an.

Vorteile:

  • Portabler Code
  • LaTeX kann auch jemand schreiben, der vom Programmieren sonst keine Ahnung hat
  • Viele Anpassungsmöglichkeiten (Du kannst auch gleich eine Präsentation schreiben)

Nachteile:

  • LaTeX muss installiert sein und LaTeX ist groß…

Umsetzung

Am entspannten ist es wohl, wenn man den Gem rails-latex benutzt. Füge es in das Gemfile hinzu:

gem rails-latex

Danach natürlich mit bundle install installieren.

Damit Rails weiß, wie es PDF-Anfragen handhabhaben soll, musst du noch in der config/initializers/mime_types.rb den Mimetype setzen:

Mime::Type.register "application/pdf", :pdf, ['text/pdf'], ['pdf']

Der Rest ist ziemlich simpel gestalten:

Wenn du einen Link auf eine PDF-Datei setzen willst, tust du dies folgendermaßen:

<%= link_to "print", story_path(@story,:format => :pdf) %>

Weiterhin solltest du dir passende Views anfertigen:

  • app/views/layouts/application.pdf.erbtex
  • app/views/[view]/[seite].pdf.erb

Dort kannst du ganz normalen LaTeX–Code mit Embedded Ruby schreiben.

Wenn du willst, dass pdflatex 2 mal läuft kannst du das in der application.pdf.erbtex einstellen:

<% @latex_config={:parse_twice => true} %>

 Fehlerbehebung

Der PDF-Viewer zeigt nichts an, oder sagt, das PDF ist ungültig? Schau doch mal nach, was der Server antwortet.

Bei mir kam lange Zeit ein 406 Not Acceptable Fehler. Der Grund daran liegt an den respond_to – Blöcken in den Controllern. Warum genau weiß ich nicht, schau doch einfach in die Dokumentation und sag mir Bescheid 😉

Das zu beheben war ganz einfach: Lösche die Blöcke, die sind überflüssig.

Lesenswertes