Phpspreadsheet(mPDF) PDF 한글 깨짐 현상 해결 방법
개요
PHP에서 엑셀 파일이나 PDF 문서를 다룰 때 사용하는 것이 Phpspreadsheet입니다. 이 Phpspreadsheet에서 PDF 문서를 생성할 때 [DomPDF], [mPDF], [TcPDF] 등을 사용할 수 있는데, 여기서는 [mPDF]로 문서를 생성할 때 한글이 깨지는 경우가 있는데 이 문제를 해결하는 방법을 정리해보겠습니다. (Phpspreadsheet는 PHPExcel의 업그레이드 버전입니다.)
한글 깨짐 테스트
아래와 같이 PDF로 저장할 데이터에 한글을 넣어서 테스트 해보겠습니다.
<?php
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$spreadsheet = new Spreadsheet();
$spreadsheet->getProperties()->setTitle("PhpSpreadsheet 테스트");
$activeWorksheet = $spreadsheet->getActiveSheet();
$activeWorksheet->setCellValue('A1', 'PhpSpreadsheet 테스트');
$activeWorksheet->getColumnDimension("A")->setWidth(25);
$activeWorksheet->setPrintGridlines(true);
$out_put_file_name = "PhpSpreadsheet-테스트.pdf";
header('Content-Type: application/pdf; charset=utf-8' );
header('Content-Disposition: attachment;filename="'.$out_put_file_name.'"');
header('Cache-Control: max-age=0');
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf($spreadsheet);
$writer->save('php://output');
exit;
?>
- PDF 파일을 다운로드 받아보면 아래와 같이 한글인 테스트 부분이 폰트가 깨져서 제대로 나오지 않는 것을 확인할 수 있습니다.
폰트(Font) 설정 수정
mPDF가 설치된 경로에 있는 [\vendor\mpdf\mpdf\src\Config\FontVariables.php
] 파일을 열어보면 아래와 같이 [fontdata] 항목에 [unbatang]이라는 폰트에 대한 설정이 있고, 이 폰트는 한국어용 폰트라는 것을 알 수 있습니다.
'fontdata' => [
"unbatang" => [/* Korean */
'R' => "UnBatang_0613.ttf",
]
]
한글 폰트 적용
Phpspreadsheet PDF 문서 생성 코드에 아래와 같이 위에서 확인했던 mPDF에 설정된 한글 폰트 이름을 지정해주면 됩니다.
<?php
$spreadsheet->getDefaultStyle()->getFont()->setName('unbatang');
$spreadsheet->getDefaultStyle()->getFont()->setSize(15);
?>
문제 해결
한글 폰트를 적용한 후에 PDF 파일을 생성해보면 아래와 같이 한글이 정상적으로 표시되는 것을 알 수 있습니다.
새로운 폰트 적용
이번에는 mPDF의 기본 폰트가 아닌 원하는 폰트를 적용하는 방법을 확인해보겠습니다.
여기서는 네이버에서 무료로 제공하고 있는 [나눔고딕(NanumGothic)] 폰트를 아래와 같이 [\vendor\mpdf\mpdf\ttfonts
] 폴더에 복사합니다.
- [\vendor\mpdf\mpdf\src\Config\FontVariables.php] 파일에 아래와 같이 [나눔고딕(NanumGothic)] 폰트 설정을 추가합니다.
- Phpspreadsheet PDF 문서 생성 코드에 아래와 같이 [나눔고딕(NanumGothic)] 폰트 설정을 지정합니다.
<?php
$spreadsheet->getDefaultStyle()->getFont()->setName('nanumGothic');
?>
- [나눔고딕(NanumGothic)] 폰트를 설정한 후에 PDF 파일을 생성해보면 아래와 같이 [나눔고딕(NanumGothic)] 폰트가 적용된 것을 확인할 수 있습니다.
참고 URL
-
Phpspreadsheet 공식 가이드
https://phpspreadsheet.readthedocs.io/ -
Composer 공식 홈페이지
https://getcomposer.org/ -
Composer 한글 메뉴얼
https://xpressengine.github.io/Composer-korean-docs/
문서 업데이트 내역
날짜 | 내용 |
---|---|
2023-12-23 | 문서 최초 생성 |