fix: [hr] DomPDF setOptions 제거 — chroot 덮어쓰기로 인한 폰트 등록 실패 수정
- setOptions()가 config의 chroot(base_path)를 new Options()로 전체 교체 → vendor 기본값으로 리셋 - resource_path 폰트 경로가 chroot 밖으로 판정되어 registerFont() false 반환 - setOptions 제거 → config/dompdf.php 설정(font_dir, font_cache, chroot) 그대로 사용 - storage 수동 복사도 제거 → DomPDF가 내부적으로 font_dir에 복사 + .ufm 생성 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -879,12 +879,7 @@ public function sendPayslip(int $id): ?array
|
||||
// PDF 생성 (한글 폰트를 동일 인스턴스에 등록)
|
||||
$month = str_pad($payslipData['pay_month'], 2, '0', STR_PAD_LEFT);
|
||||
$pdf = Pdf::loadView('emails.payslip', ['payslipData' => $payslipData])
|
||||
->setPaper('a4')
|
||||
->setOptions([
|
||||
'font_dir' => storage_path('fonts'),
|
||||
'font_cache' => storage_path('fonts'),
|
||||
'enable_font_subsetting' => true,
|
||||
]);
|
||||
->setPaper('a4');
|
||||
$this->registerKoreanFont($pdf);
|
||||
$pdfContent = $pdf->output();
|
||||
$fileName = "{$payslipData['pay_year']}년{$month}월_급여명세서_{$payslipData['employee_name']}.pdf";
|
||||
@@ -905,47 +900,34 @@ public function sendPayslip(int $id): ?array
|
||||
|
||||
/**
|
||||
* PDF 인스턴스에 한글(Pretendard) 폰트 등록
|
||||
*
|
||||
* - render() 전에 동일 DomPDF 인스턴스에 등록해야 적용됨
|
||||
* - 폰트 원본은 resources/fonts/에 프로젝트와 함께 배포
|
||||
* - resource_path() 원본을 직접 전달 (storage symlink는 chroot 밖이라 차단됨)
|
||||
* - DomPDF가 내부적으로 font_dir에 복사 + .ufm 메트릭 생성
|
||||
*/
|
||||
private function registerKoreanFont(\Barryvdh\DomPDF\PDF $pdf): void
|
||||
{
|
||||
$fontDir = storage_path('fonts');
|
||||
if (! is_dir($fontDir)) {
|
||||
mkdir($fontDir, 0755, true);
|
||||
}
|
||||
|
||||
// 프로젝트에 포함된 폰트 (Git으로 배포됨)
|
||||
$fontSources = [
|
||||
'normal' => resource_path('fonts/Pretendard-Regular.ttf'),
|
||||
'bold' => resource_path('fonts/Pretendard-Bold.ttf'),
|
||||
];
|
||||
|
||||
if (! file_exists($fontSources['normal'])) {
|
||||
$normalFont = resource_path('fonts/Pretendard-Regular.ttf');
|
||||
if (! file_exists($normalFont)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// storage/fonts/에 복사
|
||||
foreach ($fontSources as $weight => $src) {
|
||||
$dst = $fontDir.'/'.basename($src);
|
||||
if (! file_exists($dst)) {
|
||||
copy($src, $dst);
|
||||
}
|
||||
}
|
||||
|
||||
// 동일 DomPDF 인스턴스에 폰트 등록 (핵심: $pdf->getDomPDF())
|
||||
$dompdf = $pdf->getDomPDF();
|
||||
$fm = $dompdf->getFontMetrics();
|
||||
|
||||
$fm->registerFont(
|
||||
['family' => 'pretendard', 'style' => 'normal', 'weight' => 'normal'],
|
||||
$fontDir.'/Pretendard-Regular.ttf'
|
||||
$normalFont
|
||||
);
|
||||
if (file_exists($fontDir.'/Pretendard-Bold.ttf')) {
|
||||
|
||||
$boldFont = resource_path('fonts/Pretendard-Bold.ttf');
|
||||
if (file_exists($boldFont)) {
|
||||
$fm->registerFont(
|
||||
['family' => 'pretendard', 'style' => 'normal', 'weight' => 'bold'],
|
||||
$fontDir.'/Pretendard-Bold.ttf'
|
||||
$boldFont
|
||||
);
|
||||
}
|
||||
|
||||
$fm->saveFontFamilies();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user