PHP로 xlsx 파일을 PDF로 변환하면 Libre Office밖에 없어요.

10680 단어 PHPLibreOffice
Joolen Advent Calendar 2019 이틀째 보도입니다.
전날 보도는 @motuo씨의 EC-CUBE4 계열(Symfony)의 트위터를Ajax(jQuery)로 Validation해 봤다.입니다.
캘린더 URL 여기 있습니다.
Joolen Advent Calendar 2019

이마


최근에는 PHP를 사용하여 xlsx 파일을 PDF로 변환하는 업무가 있습니다.
다양한 시도의 결과로 Libre Office는 안정되었다.
그 이유를 실제 바뀐 결과와 함께 쓰다.

컨디션

  • macOS Mojave
  • PHP7.2
  • Composer 1.9.1
  • PDF 변환 방법 선택


    원래 PHP는 xlsx를 PDF로 변환할 수 있습니까?
    이 의문에서 다양한 인터넷 바다를 헤엄쳐 다음과 같은 정보를 얻었다.
  • PhpSpreadsheet과 Domapdf 등을 이용하여 변환
  • LibreOffice 설치, PHP에서 명령 호출
  • 일단 해보자!

    1. PhpSpreadsheet과 Domapdf 등으로 전환


    우선 PHP가 Excel 파일을 가지고 노는 유명한 PhpSpreadsheet을 사용해 보자.
    PhpSpreadsheet은 Domapdf를 제외한 mPDF와 TCPDF도 대응하기 때문에 모두 시도합니다.

    필요한 라이브러리 설치


    작업 목록은 이런 느낌입니다.
    .
    ├── composer.json
    ├── composer.lock
    ├── src
    └── storage
        ├── excel
        └── pdf
    
    compooser에 다양한 프로그램 라이브러리 설치
    $ composer require phpoffice/phpspreadsheet
    $ composer require dompdf/dompdf
    $ composer require mpdf/mpdf
    $ composer require tecnickcom/tcpdf
    
    composer.json 확인
    composer.json
    {
        (中略)
        "require": {
            "phpoffice/phpspreadsheet": "^1.9",
            "dompdf/dompdf": "^0.8.3",
            "mpdf/mpdf": "^8.0"
            "tecnickcom/tcpdf": "^6.3",
        }
    }
    
    OK!!

    샘플 Excel 파일 생성하기


    내 수중에 EXCEL이 없기 때문에 Google 전자 표로 아래의 물품 인도서를 만들었다

    이 파일을 storage/excel에 저장합니다.
    .
    ├── composer.json
    ├── composer.lock
    ├── src
    └── storage
        ├── excel
        │   └── delivery-note.xlsx <- 作成したエクセルファイル
        └── pdf
    

    코드를 쓰다


    src/xlsx-to-pdf.php
    <?php
    require __DIR__ . '/../vendor/autoload.php';
    
    use PhpOffice\PhpSpreadsheet\IOFactory;
    
    $orderNote = __DIR__ . '/../storage/excel/order-note.xlsx';
    echo "load: $orderNote", PHP_EOL;
    
    $reader = IOFactory::createReader('Xlsx');
    $spreadsheet = $reader->load($orderNote);
    
    // Dompdfを使用してエクスポート
    outputPdf($spreadsheet, 'Dompdf');
    
    // mPDFを使用してエクスポート
    outputPdf($spreadsheet, 'Mpdf');
    
    // TCPDFを使用してエクスポート
    outputPdf($spreadsheet, 'Tcpdf');
    
    function outputPdf($spreadsheet, $writerType) {
        $writer = IOFactory::createWriter($spreadsheet, ucfirst(strtolower($writerType)));
        $writer->save(__DIR__ . '/../storage/pdf/' . strtolower($writerType) . '.pdf');
    }
    
    실행 후 PDF 파일이 추가되었습니다.
    안을 보세요.

    Dompdf



    mPDF



    TCPDF




    TCPDF의 놀라운 화이트.
    Domapdf 및 mPDF에서 디코딩 및 인쇄 설정이 발생할 수 있습니다.내 격선의 일부가 사라진 것 같아...
    이후 코드가 깨지지 않도록 글꼴을 넣으려고 했으나 제대로 완성하지 못했다.
    혹시 아시는 분 있으면 알려주세요...

    2. LibreOffice 설치, PHP에서 명령 호출


    LibreOffice는 무료로 사용할 수 있는 사무용 소프트웨어입니다.
    명령줄에서도 다양한 조작이 가능하기 때문에 xlsx를 PDF로 변환합니다.

    LibreOffice 설치


    다음 URL에서 설치합니다.
    https://ja.libreoffice.org/download/download/
    Linux의 경우yum과 appt-get에 있습니다.

    코드를 쓰다


    방금 쓴 코드에 LibreOffice를 사용하여 변환하는 처리를 추가합니다.
    src/xlsx-to-pdf.php
    <?php
    require __DIR__ . '/../vendor/autoload.php';
    
    use PhpOffice\PhpSpreadsheet\IOFactory;
    
    $orderNote = __DIR__ . '/../storage/excel/order-note.xlsx';
    echo "load: $orderNote", PHP_EOL;
    
    (中略)
    
    // LibreOfficeを使用してエクスポート
    $soffice = '/Applications/LibreOffice.app/Contents/MacOS/soffice';
    $command = "$soffice --headless --convert-to pdf --outdir " . __DIR__ . "/../storage/pdf $orderNote";
    echo $command, PHP_EOL;
    exec($command);
    
    실행해 보세요.

    괜찮은데 자동적으로 높이를 조절하는 것은 소용이 없어요.
    LibreOffice는 시스템 글꼴을 사용하는 것처럼 Linux의 일본어도 어렵지 않다.
    PhpSpreadsheet 및 LibreOffice를 사용한 PDF 변환의 결과는 다음과 같습니다.

    총결산

  • LibreOffice는 높이의 자동 조정에 주의하면 된다
  • 일본어화할 수 있다면 PhpSpreadsheet도 사용할 수 있을 것 같다
  • 원래 PHP로 xlsx를 PDF로 변환하는 것은 적합하지 않았다
  • 어떻게든 하려면 Libre Office가 제일 가볍고 예뻐요
  • 그게 다야.
    내일은 @hwatry씨의 TS 초보자의 입문입니다.

    좋은 웹페이지 즐겨찾기