Go for it!

はてブロドメインで仮運用中。

PHPExcel 1.7.2でPDFに日本語混ぜると化ける

お仕事ネタ。

PHPExcelは、PHPからExcelファイルを生成するためのライブラリ。Excel5 / Excel 2003 (XML) / Excel 2007 / PDFなどのファイルが吐ける。Excel5 / PDFを吐きたかったので調査した。

「PHPExcelを使ってPHPでExcelファイルを出力する」を参考に試してみると、かなり簡単に日本語を含むExcelファイルが生成できた。

ほんじゃPDFは?ってことで、出力部分を切り替えて出力。こんなかんじ。

[code lang=“php”] $writer = PHPExcel_IOFactory::createWriter($xl, ‘PDF’); $writer->save("output.pdf"); [/code]

出てきたPDFを確認すると…ダメ。

[gyazo id=‘b2a827d7629d519c29de27eb5b7d4ace’]

ぐーぐる様にお伺いを立てると同じ現象にヒットしている人を発見。フォント名がハードコードされているため、標準状態では非日本語なフォントが選択されてしまう。

PHPExcel_IOFactoryによって生成されるwriterオブジェクトからフォント名を指定出来るよう、PHPExcel/Classes/PHPExcel/Writer/PDF.phpを改造。

[code lang=“php”] — PDF.php-orig 2010-02-24 16:17:02.000000000 +0900 +++ PDF.php 2010-02-24 16:25:58.000000000 +0900 @@ -75,6 +75,13 @@ private $_tempDir = ‘’;

/**
    • Font
  • *
    • @var string
  • */
  • private $_font = ‘freesans’; +
  • /**
    • Create a new PHPExcel_Writer_PDF *
    • @param PHPExcel $phpExcel PHPExcel object @@ -88,6 +95,15 @@ /**
    • Save PHPExcel to file *
    • @param string $fontName
  • */
  • public function setFont($fontName) {
  • $this->_font = $fontName;
    
  • } +
  • /**
    • Save PHPExcel to file
  • *
    • @param string $pFileName
    • @throws Exception */ @@ -134,11 +150,7 @@ $pdf->AddPage();

      // Set the appropriate font

  • $pdf->SetFont('freesans');
    
  • //$pdf->SetFont('arialunicid0-chinese-simplified');
    
  • //$pdf->SetFont('arialunicid0-chinese-traditional');
    
  • //$pdf->SetFont('arialunicid0-korean');
    
  • //$pdf->SetFont('arialunicid0-japanese');
    
  • $pdf->SetFont($this->_font);
    $pdf->writeHTML($html);
    
    // Document info
    

    [/code]

以下のようにフォント名(ここではarialunicid0-japanese)を指定して出力出来るようにしたところ文字化けせずに動くようになった。

[code lang=“php”] $writer = PHPExcel_IOFactory::createWriter($xl, ‘PDF’); $writer->setFont(‘arialunicid0-japanese’); $writer->save("output.pdf"); [/code]

ほらね。

[gyazo id=‘07fbf90a0f59ff15868b715ac422489d’]

[ad#text_wide]