[nodejs] PDF파일 페이지 번호 없는 경우 페이지 자동으로 넣어주기 > javascript
javascript

[nodejs] PDF파일 페이지 번호 없는 경우 페이지 자동으로 넣어주기

조회 66회 댓글 0건

프로그래머가 아니라 일반인이면 PDF 페이지번호 추가해주는 사이트가 있으니 아래를 참고하시면 됩니다.

https://tools.pdf24.org/ko/add-page-numbers#s=1687481961009


여기선 nodejs와 pdf-lib 설치에 대해선 언급하지 않습니다.

아래는 간단한 소스 입니다.


PDF파일에 페이지 번호가 없어서 인쇄하는데 있어 페이지수가 적으면 문제가 안되지만 수십페이지만 되어도 읽을때 문제가 될 수 있습니다. 페이지가 바뀐다거나 아니면 인쇄할때 잘못되어 중간부터 인쇄할때 몇페이지 부터 인쇄해야 될지 찾는데 시간이 소요 될 수 있는 문제를 해결하려면 페이지번호가 들어가 있는것이 좋습니다.


  /**
   *  PDF페이지에 페이지 번호 없는 경우 페이지 번호 자동으로 넣어주기
   *    
   *
   */
  import { degrees, PDFDocument, rgb, StandardFonts } from 'pdf-lib';
  import fetch from "node-fetch";
  import fs from "fs";
  import os from "os";
  import { info } from 'console';
  // npm install --save @pdf-lib/fontkit
  import fontkit from '@pdf-lib/fontkit'

  (async () => {
    const _DIR_   = process.cwd();

    let pdf_file  = _DIR_ + '/pdf_sample.pdf';
    let is_file   = fs.existsSync(pdf_file);
    if ( is_file )
    {
      const existingPdfBytes  = fs.readFileSync(pdf_file);
      const pdfDoc            = await PDFDocument.load(existingPdfBytes)
      const totalPages        = pdfDoc.getPageCount()
      const pdfPages          = pdfDoc.getPages()
      const FONT_SIZE         = 10;

      for( var page = 1; page <= totalPages; page++ ) {
        let pdfPage         = pdfPages[page-1];
        let pdfPageWidth    = pdfPage.getSize()['width'];
        let pdfPageHeight   = pdfPage.getSize()['height'];

        let pageData    = page + ' / ' + totalPages;
        let leftPos     = pdfPageWidth - 100;
        let topPos      = 50;
        pdfPage.drawText(pageData, {
          'x'     : leftPos,
          'y'     : topPos,
          'size'  : FONT_SIZE,
          // 'font'  : customFont,
          'color' : rgb(0, 0, 0),
        });
      }

      const pdfBytes = await pdfDoc.save()

      var file = _DIR_ + '/ddd.pdf';
      if ( fs.existsSync(file) ) {
        fs.unlinkSync(file);
      }
      fs.writeFileSync(file, pdfBytes);
    }
  })();

 


프로그램이기 때문에 페이지번호 자동으로 넣어주기에서 필요하다면 페이지수 이외에 다른것도 넣을 수 있습니다.

여기는 빠져 있지만 회사의 로고의 이미지도 넣을 수 있겠습니다.

별도로 중간에 워터마트도 간략하게 넣을 수 있으니 샘플 사이트 보시면 됩니다.


혹시 PDF 파일 천페이지가 넘어서 메모리 문제가 생긴다면 아래를 참고하세요.

node --max-old-space-size=8192 pdf_page_insert.js

  • 페이스북으로 공유
  • 트위터로  공유
  • 구글플러스로 공유
전체 92건 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 버전에서 문제 없었습니다.* 사용한곳은 아래 입니다. 파일을 저장할때 유용합니다.  [no…
  • 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 백엔드의 PDF-LIB에서 폰트를 지정하지 않으면 오류가 발생 합니다.영문은 문제 되지 않지만 한글의 경우 오류를 만나게 됩니다.그렇기 때문에 커스텀 폰드를 지정해야 하는데 스탠다드폰트가 아닌 별도 폰트를 사용할 때 필요한 부분입니다.Error: WinAnsi cannot encode "한" 이러한 오류를 만나게 된다면 한글을 사용할 수 없는 폰트이기 때문입니다.    // https://pdf-lib.js.org/#examples  impor…
  • profile_image 특정 문자로 구분자를 줘서 문자열로 만들어주는 함수인데요PHP의 implode에 해당하는 기능입니다.배열의 경우는 간단하게 join 메소드를 사용하면 되는데요. 객체는 안되기 때문에 만들어진것입니다.  let aa = {    'bb1' : 345,    'cc'  : 23,    'ee'  : 'abc'  }  let bb = ['name','2',33,5,'age'];    /**   * 문자열 구분자로 합치기   *   * @param s…