fix:TCPDF 폰트를 PDF 인스턴스에 전체 경로로 등록하여 font definition 오류 해결

- addTTFfont()는 storage에 캐시만 생성하고 SetFont() 시 K_PATH_FONTS(vendor)에서 찾아 실패
- registerKoreanFont()로 분리: 캐시 생성 + $pdf->AddFont() 전체 경로 등록
- mergeSignatures(), generatePreview() 양쪽에 적용
This commit is contained in:
2026-02-26 15:37:24 +09:00
parent 23e6b1d5d1
commit 70ff4ab40e

View File

@@ -13,27 +13,38 @@ class PdfSignatureService
private ?string $koreanFontName = null;
/**
* Pretendard 한글 폰트를 등록하고 폰트 이름을 반환한다.
* PDF 문서와 동일한 폰트로 필드 텍스트를 렌더링하여 일관성을 유지한다.
* PDF 인스턴스에 Pretendard 한글 폰트를 등록한다.
* 폰트 캐시를 storage에 생성하고, PDF 인스턴스에 전체 경로로 등록하여
* vendor 디렉토리 쓰기 권한 문제를 방지한다.
*/
private function getKoreanFont(): string
private function registerKoreanFont(Fpdi $pdf): void
{
if ($this->koreanFontName) {
return $this->koreanFontName;
$fontPath = storage_path('fonts/Pretendard-Regular.ttf');
if (! file_exists($fontPath)) {
return;
}
// 1순위: 프로젝트 내장 Pretendard (로컬/서버 공통)
$fontPath = storage_path('fonts/Pretendard-Regular.ttf');
$fontCacheDir = storage_path('app/private/fonts');
$fontDefFile = $fontCacheDir.'/pretendard.php';
if (file_exists($fontPath)) {
// 폰트 캐시를 storage에 저장 (vendor 디렉토리 쓰기 권한 문제 방지)
$fontCacheDir = storage_path('app/private/fonts');
// 폰트 캐시 파일이 없으면 생성
if (! file_exists($fontDefFile)) {
if (! is_dir($fontCacheDir)) {
mkdir($fontCacheDir, 0775, true);
}
$this->koreanFontName = \TCPDF_FONTS::addTTFfont($fontPath, 'TrueTypeUnicode', '', 96, $fontCacheDir.'/');
\TCPDF_FONTS::addTTFfont($fontPath, 'TrueTypeUnicode', '', 96, $fontCacheDir.'/');
}
// PDF 인스턴스에 전체 경로로 폰트 등록 (K_PATH_FONTS 의존 제거)
$pdf->AddFont('pretendard', '', $fontDefFile);
$this->koreanFontName = 'pretendard';
}
/**
* 등록된 한글 폰트 이름을 반환한다.
*/
private function getKoreanFont(): string
{
return $this->koreanFontName ?: 'helvetica';
}
@@ -53,6 +64,7 @@ public function mergeSignatures(EsignContract $contract): string
$pdf = new Fpdi;
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$this->registerKoreanFont($pdf);
$pageCount = $pdf->setSourceFile($originalPath);
@@ -123,6 +135,7 @@ public function generatePreview(EsignContract $contract): string
$pdf = new Fpdi;
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$this->registerKoreanFont($pdf);
$pageCount = $pdf->setSourceFile($originalPath);