Adobe ColdFusion(https://www.adobe.com/kr/products/coldfusion-family.html)의 경우 CFML를 작성하여 동적으로 PDF를 생성할때 필요한 서체를 사전에 Administrator환경에서 서버상의 Font 목록을 조회하고 등록하여 쓸 수 있는 있t습니다. 물론 서체가 없는 경우 기본 시스템서체를 활용하여 보여줍니다만 한글서체가 서버에 설치되어 있지 않다면 제대로 표현이 불가능합니다. 마찬가지로 Railo(현재는 Lucee로 Fork)에서도 비슷한 기능을 관리자 기능에서 제공했으나 Lucee(https://lucee.org)에서는 해당기능이 빠져버렸고 PDF엔진 자체도 최근 변경이 되어 fonts.jar 파일에 폰트를 추가하는 방법으로는 해결이 안됩니다. (Lucee 5.3 이후)
Lucee(https://docs.lucee.org/guides/cookbooks/Flyingsaucer.html) 5.3 이후 버전에서는 Flying Saucer PDF엔진(https://github.com/flyingsaucerproject/flyingsaucer)을 사용하게됨으로서 PDF내에서 한글폰트 및 여러 오픈소스 또는 구매한 상용폰트를 서버의 관리자 사전 등록하지 않고도 사용할 수 있게 되었습니다. 이전의 경우 위에서 설명드렸듯이 서버상에 ttf 등의 서체를 저장하고 Adobe ColdFusion Server나 Lucee(구버전)의 Administrator 환경에서 해당 ttf가 있는 Path를 사전에 등록해 줘야 했지만 Flying Saucer PDF Engine에서는 그럴 필요없이 웹개발자가 웹루트에 ttf를 업로드해놓고 마치 HTML의 CSS의 font-face처럼 동적으로 로드할 수 있게 되었습니다. (대부분 서버관리자와 개발자는 별개이고 서버관리자는 절대로 개발자에게 ColdFusion Administrator 접속권한을 주지 않을테니까 이는 매우 중요합니다.)
웹루트 경로에 fonts라는 디렉토리를 만들고 그 안에 사용할 ttf 서체들을 올리시면 됩니다. 아래처럼요.
위 그림의 fonts 디렉토리 안에는 아래의 서체파일들이 들어 있습니다.
Java나 PHP 또는 ColdFusion과 같은 동적 웹언에서는 PDF를 생성한다는 것이 대개는 Database에서 불러온 데이터를 HTML로 표현하고 이를 다시 PDF로 변환하는 과정이기 때문에 실제로 CSS의 버전이나 지원하는 HTML의 버전이 최근의 것을 지원할 수록 더 좋은 엔진이다 할 수 있습니다. (CSS의 다양한 기법을 더 활용할 수 있어 정교한 PDF를 생성할 수 있으니까요)
가령 PHP의 TCPDF(https://tcpdf.org/)의 경우 HTML Table태그내의 td 영역내에서 세로정렬을 지원하지 않습니다. 따라서 예쁜? PDF문서를 렌더링하기 어렵습니다.
각설하고, 본론으로 돌아와서 이야기하자면 ColdFusion에서는 <cfdocument></cfdocument> 태그 사이에 HTML 코드를 넣으면 그 코드를 PDF로 자동변환하여 출력해줍니다. 다음의 코드에서 CSS부분의 @font-face과 같이 각 폰트마다 선언해주고 사용하시면 됩니다. 첨부파일(PDF)을 보시면 아래 코드가 실행된 결과가 보입니다. <cfdocument>의 속성으로 코드에 나타는 부분 marginbottom 등은 Adobe ColdFusion의 Tag 설명서(https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-tags/tags-d-e/cfdocument.html)를 보시면 쉽게 알 수 있습니다. 단 영어.
<cfprocessingdirective pageencoding="utf-8">
<cfcontent type="application/pdf">
<cfheader name="Content-Disposition" value="inline; filename=./test.pdf">
<cfdocument format="PDF" marginbottom="1" marginleft="1" marginright="1" margintop="1" orientation="portrait" overwrite="true" unit="cm" localurl="true" fontembed="true" pagetype="a4">
<!-- 실제로 PDF에 나타날 HTML블럭 시작 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
<!--
@font-face {
font-family: NanumGothic; /* 폰트이름지정 */
src: url('./fonts/NanumGothic.ttf'); /* 폰트경로지정 */
-fs-pdf-font-embed: embed;
-fs-pdf-font-encoding: Identity-H;
}
@font-face {
font-family: NanumMyeongjo; /* 폰트이름지정 */
src: url('./fonts/NanumMyeongjo.ttf'); /* 폰트경로지정 */
-fs-pdf-font-embed: embed;
-fs-pdf-font-encoding: Identity-H;
}
@font-face {
font-family: NanumPen; /* 폰트이름지정 */
src: url('./fonts/NanumPen.ttf'); /* 폰트경로지정 */
-fs-pdf-font-embed: embed;
-fs-pdf-font-encoding: Identity-H;
}
@font-face {
font-family: NanumBarunGothic; /* 폰트이름지정 */
src: url('./fonts/NanumBarunGothic.ttf'); /* 폰트경로지정 */
-fs-pdf-font-embed: embed;
-fs-pdf-font-encoding: Identity-H;
}
body {
width: 100%;
font-size: 16px;
color:#000;
line-height:180%;
}
img {border: 0 none;}
table {
width: 100%;
border: 0.5px solid #000;
border-collapse: collapse;
}
th, td {
border: 0.5px solid #000;
padding: 10px;
word-break:break-all;
}
.nm { font-family: 'NanumMyeongjo', serif; } /* 지정폰트명 */
.ng { font-family: 'NanumGothic', serif; } /* 지정폰트명 */
.np { font-family: 'NanumPen', serif; } /* 지정폰트명 */
.nb { font-family: 'NanumBarunGothic', serif; } /* 지정폰트명 */
-->
</style>
</head>
<body>
<table>
<tr>
<td align="center" class="nm">
나랏말싸미 듕귁에 달아 문짜와로 서르사맛디 아니할쎼<br>
내 이런 젼차로 어린 뷕셩이 니르고져 홇베이셔도<br>
마참내 제 쁫을 시러펴디 몯핧노미 하노라<br>
내 이를 위하야 어엿비너겨 새로 스물여듧짜랄 맹가노니<br>
해야 수비니겨 날로 쑤매 뻔한킈 하고져 할 따라미니라<br>
</td>
</tr>
<tr>
<td align="center" class="ng">
나랏말싸미 듕귁에 달아 문짜와로 서르사맛디 아니할쎼<br>
내 이런 젼차로 어린 뷕셩이 니르고져 홇베이셔도<br>
마참내 제 쁫을 시러펴디 몯핧노미 하노라<br>
내 이를 위하야 어엿비너겨 새로 스물여듧짜랄 맹가노니<br>
해야 수비니겨 날로 쑤매 뻔한킈 하고져 할 따라미니라<br>
</td>
</tr>
<tr>
<td align="center" class="np">
나랏말싸미 듕귁에 달아 문짜와로 서르사맛디 아니할쎼<br>
내 이런 젼차로 어린 뷕셩이 니르고져 홇베이셔도<br>
마참내 제 쁫을 시러펴디 몯핧노미 하노라<br>
내 이를 위하야 어엿비너겨 새로 스물여듧짜랄 맹가노니<br>
해야 수비니겨 날로 쑤매 뻔한킈 하고져 할 따라미니라<br>
</td>
</tr>
<tr>
<td align="center" class="nb">
나랏말싸미 듕귁에 달아 문짜와로 서르사맛디 아니할쎼<br>
내 이런 젼차로 어린 뷕셩이 니르고져 홇베이셔도<br>
마참내 제 쁫을 시러펴디 몯핧노미 하노라<br>
내 이를 위하야 어엿비너겨 새로 스물여듧짜랄 맹가노니<br>
해야 수비니겨 날로 쑤매 뻔한킈 하고져 할 따라미니라<br>
</td>
</tr>
</table>
</body>
</html>
<!-- 실제로 PDF에 나타날 HTML블럭 끝 -->
</cfdocument>
'ColdFusion' 카테고리의 다른 글
[ColdFusion Security] LOG4J 이슈 (0) | 2022.01.06 |
---|---|
[ColdFusion Security] Lucee 5.3.7.47 관리자 화면 접속 불가 (0) | 2021.12.18 |
Adobe ColdFusion Pre-Release Program Closure (0) | 2021.04.17 |
ColdFusion에서의 QR코드 생성, 그리고 Image Masking (0) | 2019.11.29 |
Lucee Server에서 Remote address가 127.0.0.1로만 반환될 때 (2) | 2019.09.03 |
JSP와 ColdFusion의 Session 공유 (0) | 2019.08.26 |
ColdFusion에서 만들어 보는 동적 음성 Captcha (0) | 2019.08.26 |
CFFTP 연결 후 디렉토리 및 파일명의 한글이 깨져 보일 때 (0) | 2019.08.25 |