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-input | HTML 이 비었거나 너무 클 때, 옵션이 틀렸을 때, PDF 가 상한을 넘을 때 | 쪽을 나누거나 그림을 줄인다. 다시 보내도 같다 |
upstream-down | Chromium 에 붙지 못했거나 연결이 끊겼을 때 | Chromium 서비스가 떠 있는지 본다 |
timeout | 붙기·글꼴과 그림 들어오기·인쇄 중 하나가 상한을 넘었을 때, 호출자가 취소했을 때 | 잠시 뒤 다시 하거나 HTML 을 가볍게 한다 |
unexpected | Chromium 이 명령을 거절했거나 PDF 가 아닌 것을 줬을 때 | Chromium 버전을 확인한다 |
한도
- Node 22 이상(전역 WebSocket)에서만 돈다. 브라우저 화면에서는 fake 와 옵션 계산만 쓴다
- 한글은 Chromium 이 도는 곳에 한글 글꼴이 깔려 있어야 나온다. 없으면 네모로 찍힌다
- 밖으로 나가는 요청은 기본으로 막힌다. 글꼴·그림은 data: URL 로 넣거나 allowUrl 로 허락한다
- 머리말·꼬리말 조각에는 본문 CSS 와 외부 리소스가 닿지 않는다