[DOCKER] [PHP] Geschichte der Ausgabe von PDF mit TCPDF + FPDI

Einführung

Wie der Titel schon sagt Ich habe versucht, ein PDF mit den Bibliotheken ** TCPDF ** und ** FPDI ** auszugeben. Dieses Mal werde ich es über die Kommandozeile ausführen.

Hauptgeschichte

Umgebung

Bitte bereiten Sie eine Umgebung vor, in der PHP und Composer nach Belieben verwendet werden können.

Docker Die Docker-Umgebung, die ich dieses Mal verwendet habe, ist wie folgt (teilweise weggelassen).

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 Wenn der Start abgeschlossen ist, geben Sie den PHP-Container und ein Installieren Sie die Bibliothek in Composer.

Zusätzlich zur Bibliothek wird auch die Beschreibung des automatischen Ladens hinzugefügt.

/home/work/src/composer.json


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

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

Sobald die Installation abgeschlossen ist, sind Sie fertig.

# cd /home/work/src
# composer install

Implementierung

Dateiorganisation

# cd /home/work/

# ls /home/work/output/pdf/fileYYYYmmdd-HHiiss #PDF-Ausgabedatei
# ls /home/work/src/resources/font/ipam.ttf #Speicherort für Schriftarten
# ls /home/work/src/resources/pdf/templete.pdf #Speicherort der PDF-Vorlage
# ls /home/work/bin/make-pdf.php #Quelle, die in der Befehlszeile ausgeführt werden soll
# ls /home/work/src/bootstrap.php #Startdatei(Ausgelassen)
# ls /home/work/src/classes/MyTcpdf.php #TCPDF-Verwendungsklasse
# ls /home/work/src/classes/common/DynamicProperty.php #Dynamische Klasse(Ausgelassen)
# ls /home/work/src/classes/MyTcpdf/FontColor.php #Schriftfarbklasse(Ausgelassen)

Vorlage

Es ist eine sehr einfache PDF-Vorlagendatei.

image.png

Quelle

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


<?php

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

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

//Ausgabe ohne Verwendung von Vorlagen
$myTcpdf = new MyTcpdf();
$myTcpdf->addPage();
$myTcpdf->setText('Ausgabe ohne Verwendung von Vorlagen', 10, 20, new FontColor(0, 255, 0));
$myTcpdf->outputPdfFile();

//Ausgabe mit Vorlage
$myTcpdfTmp = new MyTcpdf();
$myTcpdfTmp->addPageWithTemplete(1);
$myTcpdfTmp->setText('Ausgabe mit Vorlage', 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
{
    //Ausgabedatei
    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';

    //Schriftdatei
    const FONT_FILE_NAME = __DIR__.'/../resources/font/ipam.ttf';

    /**
     *Konstrukteur
     */
    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);
    }

    /**
     *Stellen Sie das Ausgabezeichen ein
     * @param _Textzeichenfolge
     * @param _x X Koordinaten
     * @param _y Y Koordinaten
     * @param _h Höhe
     */
    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);
    }

    /**
     *Holen Sie sich die Schriftart zum Hinzufügen
     */
    private function getFont()
    {
        return TCPDF_FONTS::addTTFfont(self::FONT_FILE_NAME);
    }

    /**
     *Rufen Sie den Namen der Ausgabedatei ab
     * @Name der Zeichenfolgendatei zurückgeben
     */
    private function getOutputFilename()
    {
        return self::OUTPUT_FILE_DIR . self::OUTPUT_FILE_NAME . date("Ymd-His"). '.pdf';
    }

    /**
     *Seite hinzufügen
     */
    public function addPage()
    {
        $this->fpdi->AddPage();
    }

    /**
     *Fügen Sie eine vorlagenbasierte Seite hinzu
     */
    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);
    }

    /**
     *Ausgabe der PDF-Datei
     */
    public function outputPdfFile()
    {
        $this->fpdi->Output(
            $this->getOutputFilename(),
            self::OUTPUT_FORMAT_CHAR
        );
    }
}

Ausführungsbefehl

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

Ausführungsergebnis

Die Datei wurde wie folgt ausgegeben.

Keine Vorlage Mit Vorlage
image.png image.png

Am Ende

Da Sie Zeichen in der PDF-Vorlage ausgeben können, können Sie nur die erforderlichen Informationen ausgeben, ohne das Format zu ändern. Es kann für Dateien wie Arbeitspläne, Rechnungen und Quittungen verwendet werden, bei denen sich nur bestimmte Teile ändern.

Recommended Posts

[PHP] Geschichte der Ausgabe von PDF mit TCPDF + FPDI
Eine Geschichte über den Versuch, mit Mockito auszukommen
Eine Geschichte über die Reduzierung des Speicherverbrauchs auf 1/100 mit find_in_batches
Eine Geschichte über die Entwicklung von ROS namens Rosjava mit Java
Eine Geschichte, die bei NotSerializableException steckt
Eine verwirrte Geschichte über einen ternären Operator mit mehreren bedingten Ausdrücken
[Hinweis] Eine Geschichte über das Ändern von Java-Build-Tools mit VS-Code
Eine Geschichte über das Erreichen der League Of Legends-API mit JAVA
Eine Geschichte über die Schwierigkeit, ein Testframework an Java 6 auszurichten
Eine kleine süchtig machende Geschichte mit def initialize
Lesen Sie eine Zeichenfolge in einer PDF-Datei mit Java
Über das Erhalten einer Zehnerstelle mit "(zweistellige Ganzzahl) / 10% 10"
Eine Geschichte über die Java 11-Unterstützung für Webdienste
Eine Geschichte über das JDK in der Java 11-Ära
Eine sehr nützliche Geschichte über Rubys Struct-Klasse
Eine Geschichte über das Erstellen eines Builders, der den Builder erbt
Die Geschichte des Versuchs, JAVA File zu bedienen
Eine Geschichte voller Javas Standardeingabescanner
Die Geschichte eines neuen Ingenieurs, der einen leidenschaftlichen Programmierer liest
[Jackson] Eine Geschichte über das Konvertieren des Rückgabewerts des Big Decimal-Typs mit einem benutzerdefinierten Serializer.
Eine Geschichte über einen Fehler während der Migration in Docker PHP Laravel
Eine Geschichte über die Erstellung von PKIX-Pfaden schlug fehl, als versucht wurde, mit Jenkins eine Tomcat-Bereitstellung durchzuführen
Bei der Installation von npm auf Laravel Homestead ist beim Abgleichen des Prüfsummenwerts ein Fehler aufgetreten.