297 votes

Générer des fichiers PDF avec JavaScript

J'essaie de convertir des données XML en fichiers PDF à partir d'une page Web et j'espérais pouvoir le faire entièrement en JavaScript. Je dois être en mesure de dessiner du texte, des images et des formes simples. J'aimerais pouvoir le faire entièrement dans le navigateur.

502voto

James Hall Points 2020

Je viens d'écrire une bibliothèque appelée jsPDF qui génère des PDF en utilisant uniquement Javascript. Il est encore très jeune, et j'ajouterai bientôt des fonctionnalités et des corrections de bogues. J'ai aussi quelques idées de contournement pour les navigateurs qui ne supportent pas les URIs de données. Il est sous une licence MIT libérale.

Je suis tombée sur cette question avant de commencer à l'écrire et j'ai pensé revenir pour vous en faire part :)

Générer des PDF en Javascript

Exemple de création d'un fichier PDF "Hello World".

// Default export is a4 paper, portrait, using milimeters for units
var doc = new jsPDF()

doc.text('Hello world!', 10, 10)
doc.save('a4.pdf')

<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.5/jspdf.debug.js"></script>

14 votes

Ai-je partiellement inspiré jsPDF ? J'ai appris l'existence de jsPDF le jour où vous l'avez annoncé. C'est génial jusqu'à présent. J'ai fini par opter pour Prawn car c'est facilement la meilleure bibliothèque de génération de PDF qui existe pour mes besoins. J'aimerais toujours faire tout mon travail dans le navigateur car je ne suis pas sûr d'avoir Ruby sur le système sur lequel je suis en train de déployer. J'observe jsPDF de très près. J'aimerais bien aider, mais mon temps est très limité. Cela pourrait changer à l'avenir.

10 votes

Vous l'avez inspiré en quelque sorte :), je cherchais sur internet pour voir s'il existait déjà et j'ai vu que certaines personnes le trouveraient utile. Fais-moi savoir si tu veux donner un coup de main. Je suis @MrRio sur twitter.

0 votes

Ne permet pas d'intégrer des images, pour autant que je sache.

152voto

mg1075 Points 6113

Une autre bibliothèque javascript qui mérite d'être mentionnée est pdfmake .

La prise en charge du navigateur ne semble pas être aussi forte que celle de jsPDF, et il ne semble pas y avoir d'option pour les formes, mais les options de formatage du texte sont plus avancées que les options actuellement disponibles dans jsPDF.

10 votes

Cette réponse devrait être beaucoup plus votée, pdfmake est tellement plus robuste que jspdf. Cependant, il faut noter qu'il s'agit d'un wrapper autour de la bibliothèque PDFKit.

4 votes

Autre remarque, jspdf n'a pas de support utf-8 et pdfmake a un support utf-8 seulement pour les polices par défaut.

0 votes

"pdfmake.min.js - 0.1.22 - il y a 9 heures" Il n'est pas mort, mis à jour ce jour.

69voto

devongovett Points 1557

Je maintiens PDFKit qui fait aussi fonctionner pdfmake (déjà mentionné ici). Elle fonctionne à la fois dans Node et dans le navigateur, et supporte un tas de choses que les autres bibliothèques ne supportent pas :

  • Intégration de polices sous-ensembles, avec prise en charge de l'unicode.
  • Beaucoup de fonctionnalités avancées de mise en page (colonnes, saut de page, saut de ligne unicode complet, texte riche de base, etc.)
  • Je travaille sur encore plus de polices pour la typographie avancée (ligatures OpenType/AAT, substitution contextuelle, etc.). Prochainement : voir la branche fontkit si vous êtes intéressés.
  • Plus de trucs graphiques : gradients, etc.
  • Construit avec des outils modernes comme browserify et streams. Utilisable à la fois dans le navigateur et dans le nœud.

Vérifiez http://pdfkit.org/ pour un tutoriel complet afin de voir par vous-même ce que PDFKit peut faire. Et pour avoir un exemple des types de documents qui peuvent être produits, regardez les documents au format PDF. généré à partir de certains fichiers Markdown en utilisant PDFKit lui-même : http://pdfkit.org/docs/guide.pdf .

Vous pouvez également l'essayer de manière interactive dans le navigateur ici : http://pdfkit.org/demo/browser.html .

0 votes

Ne s'agit-il pas d'une bibliothèque côté serveur ? Je pense que la discussion porte sur la bibliothèque js côté client.

12 votes

PDFKit fonctionne à la fois dans Node et dans le navigateur comme mentionné dans la réponse. Voir le lien vers une démo du navigateur.

0 votes

Est-ce que cela compresse les images ? Je travaille sur une application web qui fonctionne de manière similaire à camscanner et je cherche à créer des PDF via javascript pour tirer parti de la compression et du format multi-pages.

12voto

Kpym Points 1447

Un autre projet intéressant est texlive.js .

Il vous permet de compiler (La)TeX en PDF dans le navigateur.

2 votes

L'exemple "hello world" a un bon rendu mais prend environ 30 secondes pour se terminer.

4voto

Dev Sebastian Points 131

Pour les amateurs de réactions, il existe une autre grande ressource pour la génération de PDF : React-PDF

Il est idéal pour créer des fichiers PDF en React et même permettre à l'utilisateur de les télécharger du côté client lui-même, sans serveur !

Voici un petit exemple de React-PDF pour créer un fichier PDF à 2 sections.

import React from 'react';
import { Page, Text, View, Document, StyleSheet } from '@react-pdf/renderer';

// Create styles
const styles = StyleSheet.create({
  page: {
    flexDirection: 'row',
    backgroundColor: '#E4E4E4'
  },
  section: {
    margin: 10,
    padding: 10,
    flexGrow: 1
  }
});

// Create Document Component
const MyDocument = () => (
  <Document>
    <Page size="A4" style={styles.page}>
      <View style={styles.section}>
        <Text>Section #1</Text>
      </View>
      <View style={styles.section}>
        <Text>Section #2</Text>
      </View>
    </Page>
  </Document>
);

Cela produira un document PDF d'une seule page. À l'intérieur, deux blocs différents, chacun d'eux rendant un texte différent. Ce ne sont pas les seules primitives valides que vous pouvez utiliser. Vous pouvez vous référer à l'outil Composants o Exemples pour plus d'informations.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X