본문으로 건너뛰기

HTML → PDF

HTML 한 장을 PDF 로. 이미 떠 있는 Chromium 에 붙어 인쇄하고(의존성 없음), 모든 단계에 시간 상한, 밖으로 나가는 요청 차단, HTML·PDF 크기 상한을 둔다. Node 전용

npm install @duolabs-deux/unit-html-pdf

직접 넣어 보기

HTML

주석 <!--fake:timeout--> · <!--fake:down--> · <!--fake:huge--> 로 실패를 재현한다

종이
printToPDF 인자
{
  "paperWidth": 8.2677,
  "paperHeight": 11.6929,
  "landscape": false,
  "marginTop": 0.7874,
  "marginRight": 0.7874,
  "marginBottom": 0.7874,
  "marginLeft": 0.7874,
  "printBackground": true,
  "scale": 1,
  "preferCSSPageSize": false,
  "displayHeaderFooter": true,
  "headerTemplate": "(빈 조각)",
  "footerTemplate": "(쪽 번호 조각)"
}
만들기

환경변수

이름설명
PDF_CDP_URL필수Chromium DevTools 주소. 예: http://<IP>:9222. 서비스 이름 대신 IP 로 준다

어댑터

id종류설명
cdp실제Chromium DevTools Protocol. 별도로 띄운 Chromium(headless)에 WebSocket 으로 붙는다
fake가짜Chromium 없이 결정적으로 한 쪽짜리 PDF 를 낸다. HTML 주석으로 실패를 재현한다

실패와 소비 앱이 할 일

종류언제할 일
invalid-inputHTML 이 비었거나 너무 클 때, 옵션이 틀렸을 때, PDF 가 상한을 넘을 때쪽을 나누거나 그림을 줄인다. 다시 보내도 같다
upstream-downChromium 에 붙지 못했거나 연결이 끊겼을 때Chromium 서비스가 떠 있는지 본다
timeout붙기·글꼴과 그림 들어오기·인쇄 중 하나가 상한을 넘었을 때, 호출자가 취소했을 때잠시 뒤 다시 하거나 HTML 을 가볍게 한다
unexpectedChromium 이 명령을 거절했거나 PDF 가 아닌 것을 줬을 때Chromium 버전을 확인한다

한도

  • Node 22 이상(전역 WebSocket)에서만 돈다. 브라우저 화면에서는 fake 와 옵션 계산만 쓴다
  • 한글은 Chromium 이 도는 곳에 한글 글꼴이 깔려 있어야 나온다. 없으면 네모로 찍힌다
  • 밖으로 나가는 요청은 기본으로 막힌다. 글꼴·그림은 data: URL 로 넣거나 allowUrl 로 허락한다
  • 머리말·꼬리말 조각에는 본문 CSS 와 외부 리소스가 닿지 않는다

명세