[DOCKER] [PHP] Histoire de la sortie de PDF avec TCPDF + FPDI

introduction

Comme le dit le titre J'ai essayé de produire un PDF en utilisant les bibliothèques ** TCPDF ** et ** FPDI **. Cette fois, je vais l'exécuter à partir de la ligne de commande.

Histoire principale

Environnement

Veuillez préparer un environnement dans lequel vous pouvez utiliser PHP et Composer comme vous le souhaitez.

Docker L'environnement Docker que j'ai utilisé cette fois est le suivant (partiellement omis).

yml:./docker-compose.yml


version: '3'
services:
 php:
   build: ./php
   volumes:
     - ./work:/home/work

./php/dockerfile


FROM php:7.3-fpm
COPY php.ini /usr/local/etc/php/

# Composer
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
  && php -r "if (hash_file('sha384', 'composer-setup.php') === '795f976fe0ebd8b75f26a6dd68f78fd3453ce79f32ecb33e7fd087d39bfeb978342fb73ac986cd4f54edd0dc902601dc') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" \
  && php composer-setup.php \
  && php -r "unlink('composer-setup.php');" \
  && mv composer.phar /usr/local/bin/composer

ini:./php/php.ini


date.timezone = "Asia/Tokyo"

Composer Lorsque le lancement est terminé, entrez dans le conteneur php et Installez la bibliothèque dans Composer.

En plus de la bibliothèque, la description du chargement automatique est également ajoutée.

/home/work/src/composer.json


{
    "require": {
        "setasign/fpdi": "^2.3",
        "tecnickcom/tcpdf": "^6.3"
    },

    "autoload": {
        "psr-4": {
            "Classes\\" : "classes/"
        }
    }
}

Une fois l'installation terminée, vous avez terminé.

# cd /home/work/src
# composer install

la mise en oeuvre

organisation des fichiers

# cd /home/work/

# ls /home/work/output/pdf/fileYYYYmmdd-HHiiss #Fichier de sortie PDF
# ls /home/work/src/resources/font/ipam.ttf #Emplacement de stockage des polices
# ls /home/work/src/resources/pdf/templete.pdf #Emplacement de stockage des modèles PDF
# ls /home/work/bin/make-pdf.php #Source à exécuter sur la ligne de commande
# ls /home/work/src/bootstrap.php #Fichier de démarrage(Omis)
# ls /home/work/src/classes/MyTcpdf.php #Classe d'utilisation TCPDF
# ls /home/work/src/classes/common/DynamicProperty.php #Classe dynamique(Omis)
# ls /home/work/src/classes/MyTcpdf/FontColor.php #Classe de couleur de police(Omis)

modèle

C'est un fichier de modèle PDF très simple.

image.png

La source

/home/work/bin/make-pdf.php


<?php

require_once __DIR__ . '/../src/bootstrap.php';

use Classes\MyTcpdf;
use Classes\MyTcpdf\FontColor;

//Sortie sans utiliser de modèles
$myTcpdf = new MyTcpdf();
$myTcpdf->addPage();
$myTcpdf->setText('Sortie sans utiliser de modèles', 10, 20, new FontColor(0, 255, 0));
$myTcpdf->outputPdfFile();

//Sortie à l'aide d'un modèle
$myTcpdfTmp = new MyTcpdf();
$myTcpdfTmp->addPageWithTemplete(1);
$myTcpdfTmp->setText('Sortie à l'aide d'un modèle', 10, 20, new FontColor(255, 0, 0));
$myTcpdfTmp->outputPdfFile();

/home/work/src/classes/MyTcpdf.php


<?php

namespace Classes;

use TCPDF_FONTS;
use setasign\Fpdi\Tcpdf\Fpdi;
use Classes\MyTcpdf\FontColor;

class MyTcpdf
{
    //Fichier de sortie
    const OUTPUT_FORMAT_CHAR = 'F';
    const OUTPUT_FILE_DIR = __DIR__.'/../../output/pdf/';
    const OUTPUT_FILE_NAME = 'file';

    // PDF
    const PDF_ORIENTATION = 'P';
    const PDF_UNIT = 'mm';
    const PDF_SIZE = 'A4';
    const PDF_TEMPLETE = __DIR__.'/../resources/pdf/templete.pdf';

    //Fichier de police
    const FONT_FILE_NAME = __DIR__.'/../resources/font/ipam.ttf';

    /**
     *constructeur
     */
    public function __construct()
    {
        $this->fpdi = new Fpdi(self::PDF_ORIENTATION, self::PDF_UNIT, self::PDF_SIZE);
        $this->fpdi->SetMargins(0, 0, 0);
        $this->fpdi->SetFont($this->getFont(), '', 32);
    }

    /**
     *Définir le caractère de sortie
     * @param _chaîne de texte
     * @param _x coordonnées X
     * @param _y coordonnées Y
     * @param _h hauteur
     */
    public function setText(string $_text, int $_x, int $_y, FontColor $_fontColor, int $_h = 0)
    {
        $this->fpdi->SetTextColor($_fontColor->R, $_fontColor->G, $_fontColor->B);
        $this->fpdi->SetXY($_x, $_y);
        $this->fpdi->Write($_h, $_text);
    }

    /**
     *Obtenez la police à ajouter
     */
    private function getFont()
    {
        return TCPDF_FONTS::addTTFfont(self::FONT_FILE_NAME);
    }

    /**
     *Obtenez le nom du fichier de sortie
     * @retourne le nom du fichier de chaîne
     */
    private function getOutputFilename()
    {
        return self::OUTPUT_FILE_DIR . self::OUTPUT_FILE_NAME . date("Ymd-His"). '.pdf';
    }

    /**
     *Ajouter une page
     */
    public function addPage()
    {
        $this->fpdi->AddPage();
    }

    /**
     *Ajouter une page basée sur un modèle
     */
    public function addPageWithTemplete($_pageNum)
    {
        $this->fpdi->SetSourceFile(self::PDF_TEMPLETE);
        $page = $this->fpdi->importPage($_pageNum);
        $this->fpdi->AddPage();
        $this->fpdi->useTemplate($page, null, null, null, null, true);
    }

    /**
     *Sortie de fichier PDF
     */
    public function outputPdfFile()
    {
        $this->fpdi->Output(
            $this->getOutputFilename(),
            self::OUTPUT_FORMAT_CHAR
        );
    }
}

Commande d'exécution

php /home/work/bin/make-pdf.php

Résultat d'exécution

Le fichier a été produit comme suit.

Aucun modèle Avec modèle
image.png image.png

À la fin

Étant donné que vous pouvez imprimer des caractères sur le modèle PDF, vous ne pouvez produire que les informations nécessaires sans changer le format. Il peut être utilisé pour les fichiers tels que les horaires de travail, les factures et les reçus où seules des pièces spécifiques changent.

Recommended Posts

[PHP] Histoire de la sortie de PDF avec TCPDF + FPDI
Une histoire d'essayer de s'entendre avec Mockito
Une histoire sur la réduction de la consommation de mémoire à 1/100 avec find_in_batches
Une histoire sur le développement de ROS appelé rosjava avec java
Une histoire bloquée avec NotSerializableException
Une histoire confuse sur un opérateur ternaire avec plusieurs expressions conditionnelles
[Note] Une histoire sur la modification des outils de compilation Java avec VS Code
Une histoire sur l'utilisation de l'API League Of Legends avec JAVA
Une histoire sur la difficulté à aligner un cadre de test avec Java 6
Une petite histoire addictive avec def initialize
Lire une chaîne dans un fichier PDF avec Java
À propos de l'obtention d'un chiffre des dizaines avec "(entier à deux chiffres) / 10% 10"
Une histoire sur la prise en charge de Java 11 pour les services Web
Une histoire sur le JDK à l'ère de Java 11
Une histoire très utile sur la classe Struct de Ruby
Une histoire sur la création d'un Builder qui hérite du Builder
Histoire d'essayer de faire fonctionner le fichier JAVA
Une histoire emballée avec le scanner d'entrée standard de Java
L'histoire d'un nouvel ingénieur lisant un programmeur passionné
[Jackson] Une histoire sur la conversion de la valeur de retour du type BigDecimal avec un sérialiseur personnalisé.
Une histoire sur une erreur lors de la migration dans docker PHP Laravel
Une histoire sur la création de chemin PKIX a échoué lors de la tentative de déploiement sur Tomcat avec Jenkins
Lorsque j'ai installé npm sur Laravel Homestead, une erreur s'est produite lors de la correspondance avec la valeur de la somme de contrôle.