conversion en PDF côté serveur

Le problème exposé dans ce sujet a été résolu.

Bonjour à tous,

Situation

  • Actuellement je dispose d'un document word plutôt complexe. Les donnés à présenter sont nombreuses et il est facile de casser la présentation, ou de ne pas pouvoir faire rentrer toutes les informations désirés dans les tableaux proposés.
  • Ce document est utilisé et rempli régulièrement par de nombreuses personnes qui n'ont aucune raison d'être experte en informatique.
  • Je developpe une application web (avec Laravel) et une des fonctionnalités serait d'intégrer le remplissage du document sur l'appli.

Solution envisagé

  • Permettre a l'utilisateur de remplir les données sur un formulaire simple en ligne
  • Insérer ces données dans un template en LaTeX
  • Générer un PDF pour l'utilisateur
  • Bonus: interpréter des mises en forme simple dans le formulaire (Gras,Couleur du texte,Listes…)

Questions

  • La solution semble t'elle viable?
  • Il y a t'il d'autres manières de faire?
  • Avez vous des pistes pour générer un PDF depuis du LaTeX? J'ai trouvé deux trois trucs sur le net, mais je suppose que c'est utilisé sur ZDS et peut être pourrais t'on me présenter une solution différente.

Merci d'avances pour tout vos conseils!

Pq faire compliqué quand on peux faire simple. Mais je suppose que si on utilise souvent LaTeX plutôt que du HTML pour des documents il doit y avoir un intérêt non? Je ne suis pas un expert en LaTeX (mais je compte bien me former dans un futur plus ou moins lointain) mais quel est donc cet avantage??

  • La solution semble t'elle viable?

Oui et non. LaTeX n'est pas forcément fait pour ça, et les tableaux sont souvent peu agréables à gérer. Notamment, si la longueur de ton tableau dépasse l'espace disponible sur une page, le résultat peut être assez douteux; il faudrait donc pouvoir garantir que le texte passe bien comme tu t'y attends, ce qui n'est pas forcément très facile à faire. De plus, il faut faire attention aux diverses injections de codes, ce n'est pas une moindre affaire, et je ne suis pas sûr que je le risquerais.

De plus, formater du LaTeX de façon à ce que le rendu soit relativement esthétique n'est pas une partie de plaisir, surtout si tu n'as aucune expérience avec.

La solution que je te proposerais (et que j'adopte dans des projets où j'ai besoin de générer des rapports sur des données), c'est d'écrire à la main l'outil de génération du PDF en te basant sur tes besoins précis, en utilisant par exemple le "module" PHP dédié. Cela va te demander un peu de réflexion quant à la conception, mais tu arriveras probablement à un résultat plus plaisant à la fin, et moins sujet aux bugs.

  • Il y a t'il d'autres manières de faire?

Cf. au dessus

  • Avez vous des pistes pour générer un PDF depuis du LaTeX? J'ai trouvé deux trois trucs sur le net, mais je suppose que c'est utilisé sur ZDS et peut être pourrais t'on me présenter une solution différente.

LaTeX est conçu pour générer des PDF (enfin. presque), la solution naïve serait d'avoir quelque chose comme

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?php
class LaTeXGenerator {
    private $datas;
    protected function process($datas);
    protected function clean();

    public function __construct($datas) {
        $this->process($datas);
        $this->clean();
    }
    public function generateTemplate() {
       $rtr = <<<EOL
           \documentclass[report]
           \title{${datas['title']}}
       ........
       EOL;
       foreach(....) { ... }
       return $rtr;
    }
}
class PDFCompile {
    private $tmpfile;
    private $tmpfname;
    private $template;
    
    protected function getLaTeXFname() {
        return $this->tmpfname + ".tex";
    }
    protected function getPDFFname() {
        return $this->tmpfname + ".pdf";
    } 

    public function __construct($template) { 
        $this->tmpfname = tempnam(sys_get_temp_dir(), "latex_");
        $this->tmpfile = fopen(getLaTeXFname(), "w");
        $this->process();
    public function __destruct() {
        @fclose($this->tmpfile);
    }

    public function getPDF() {
        return file_get_contents($this->getPDFFname());
    }
    public function process() {
        fwrite($this->tmpfile, $this->template);
        fclose($this->tmpfile);
        exec("pdflatex " + $fname, $rtr, $rcode); // dangereux !
        return $rcode;
    }
}

$gen = new LaTeXGenerator($_POST);
$template = $gen->generateTemplate();
$pdf = new PDFGenerator($template);

if ($pdf->process() === 0) {
   header('Content-type: application/pdf');
   $pdf->getPDF();
} else {
   echo "erreur";
}

Note que ce PHP est particulièrement hideux et dangereux (et je ne sais même pas s'il fonctionne). Je t'en supplie, n'utilise pas cela dans la vraie vie. Mais tu as l'idée: on génère un fichier temporaire contentant notre fichier LaTeX, puis l'on exécute un compilateur LaTeX sur celui-ci, de source à ce que l'on obtienne un PDF contenant la sortie que l'on espère.

Mais à nouveau, et je me répète, je te déconseille vivement de procéder ainsi dans un environnement que tu ne contrôles pas parfaitement. Le compilateur LaTeX peut, si les paramètres ne sont pas bien gérés, exécuter des commandes sur le serveur, ce qui peut avoir des conséquences catastrophiques (je pense par exemple à \write18). De la même façon, certaines syntaxes sont potentiellement dangereuses si elles ne sont pas contrôlées de façon très stricte, ce qui n'est en tout cas pas une tâche facile à réaliser.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte