[nodeJS] PDF-LIB 한글폰트 사용(Error: WinAnsi cannot encode ) > javascript
javascript

[nodeJS] PDF-LIB 한글폰트 사용(Error: WinAnsi cannot encode )

조회 196회 댓글 0건

백엔드의 PDF-LIB에서 폰트를 지정하지 않으면 오류가 발생 합니다.

영문은 문제 되지 않지만 한글의 경우 오류를 만나게 됩니다.

그렇기 때문에 커스텀 폰드를 지정해야 하는데 스탠다드폰트가 아닌 별도 폰트를 사용할 때 필요한 부분입니다.


Error: WinAnsi cannot encode "한" 

이러한 오류를 만나게 된다면 한글을 사용할 수 없는 폰트이기 때문입니다.


 
  import { PDFDocument, StandardFonts, rgb } from 'pdf-lib'

  // Cannot import fontkit from @pdf-lib/fontkit
  // Error [ERR_MODULE_NOT_FOUND]: Cannot find package '@pdf-lib/fontkit' imported from
  import fontkit from '@pdf-lib/fontkit'
  import fs from "fs";

  async function createPdf()
  {
    const pdfDoc    = await PDFDocument.create();

    // Error: WinAnsi cannot encode "한"
    const fontfile  = '/www/fonts/NanumGothic.ttf';
    if ( fs.existsSync(fontfile) )
    {
      const fontBytes = fs.readFileSync(fontfile);
      let customFont;
      if (fontBytes) {
        pdfDoc.registerFontkit(fontkit);
        await pdfDoc.embedFont(fontBytes);
        customFont = await pdfDoc.embedFont(fontBytes);
      }  

      const page = pdfDoc.addPage()
      const { width, height } = page.getSize()
      const fontSize = 20
      page.drawText('Creating PDFs in JavaScript is awesome! - 한글', {
        x: 50,
        y: height - 4 * fontSize,
        size: fontSize,
        font: customFont,
        color: rgb(20, 30.53, 0.71),
      });
    }
    const pdfBytes = await pdfDoc.save()

    let file = '/www/pdf/result/test1.pdf';
    if ( fs.existsSync(file) ) {
      fs.unlinkSync(file);
    }
    fs.writeFileSync(file, pdfBytes);
    let aStats    = fs.statSync(file)
    let filesize  = aStats.size;
    console.log('write pdf file: ', file);

  }
 


f08f4a3d7c3248096854e2720bc04fa9_1673643507_4988.png
 

텍스트를 지정하고 병합된 결과를 PDF 파일로 저장하는 예제 입니다.

높은 버전의 PDF 파일까지 지원이 되기 때문에 사용할만한 PDF 라이브러리 중 하나 입니다.


● 참고자료

  https://pdf-lib.js.org/#examples

  https://pdf-lib.js.org/docs/api/classes/pdffont

  https://pdf-lib.js.org/docs/api/interfaces/embedfontoptions#index

  https://pdf-lib.js.org/docs/api/classes/pdfdocument#registerfontkit

  https://www.npmjs.com/package/@pdf-lib/fontkit

  https://github.com/Hopding/pdf-lib/issues/548



  • 페이스북으로 공유
  • 트위터로  공유
  • 구글플러스로 공유
전체 91건 1 페이지
  • profile_image chat GPT API를 통해서 물어본것에 대한 테스트 인데요.잘 되네요.별도의 모듈설치 없이 그냥 실행 되었습니다. 제가 전에 다른것 하면서 설치 되었는지는 확인 안해 봤습니다.  // zlib 모듈을 불러온다.  const zlib = require('zlib');  const fs = require('fs');  // 압축할 문자열  const str = '압축할 문자열';  // gzip으로 압축한다.  zlib.gzip(str, (er…
  • profile_image 파일저장이나 또는 가져올때등 상대경로로 호출 하는 경우도 있지만때론 전체 경로를 알아야 되는 경우가 있습니다.그럴때 현재 디렉토리 기준으로 처리하면 좋은때 이럴때 사용 합니다.  // 현재 디렉토리   const _DIR_   = process.cwd();  php의 __DIR__ 과 같은 역활 입니다.확인 결과 위 예제는 잘 되는 것입니다. 현재 V16 버전에서 문제 없었습니다.버전 업그레이드가 심해서 안되는것 들이 종종 입니다.요즘 언어들 …
  • profile_image 현재 nodejs 실행중인 유저를 알아내기 위한 것입니다.같은 프로그램을 쉘에서 실행하기도 하고 웹서버를 통해서 실행하기도 합니다.그런 경우 파일을 쓰게 되면 문제가 발생합니다.  import os from "os";  let osUser  = os.userInfo().username;  if ( osUser  == 'root' ) {    console.log('루트 유저: ', osUser);  }  else {    console.log(…
  • profile_image 아작스로 서버에 전송하는 기능까지 테스트 된것입니다.jQuery 버전에 따라서 ajax 전송하는 방식이 약간 다른 부분이 있으니 버전 참고하세요.본인이 현재 사용하는것과 여기 샘플의 버전이 비슷하면 문제가 되지 않을듯 싶습니다.<!DOCTYPE html><html lang="ko"><head>  <meta charset="UTF-8">  <meta http-equiv="X-UA-Compatible…
  • profile_image 특정 문자로 구분자를 줘서 문자열로 만들어주는 함수인데요PHP의 implode에 해당하는 기능입니다.배열의 경우는 간단하게 join 메소드를 사용하면 되는데요. 객체는 안되기 때문에 만들어진것입니다.  let aa = {    'bb1' : 345,    'cc'  : 23,    'ee'  : 'abc'  }  let bb = ['name','2',33,5,'age'];    /**   * 문자열 구분자로 합치기   *   * @param s…
  • profile_image 파일명에서 파일의 확장자만 필요한 경우 사용합니다.자바스크립트 이긴 하지만 nodejs에서 사용해도 동일합니다.블라우저의 자바스크립트에서 사용하는 함수를 백엔드의 노드에서 사용해도 문제 없습니다.  /**   * 파일 확장자   *   * @param string file   *   * @return [type]   *   */  function file_ext( file ) {    let fileExt  = file.split(".").po…