[go: up one dir, main page]

Go를 쓰면 PDF가 나온다.

gpdf는 표준 라이브러리만으로 동작하는 Go PDF 라이브러리입니다. 12열 그리드로 페이지를 짜고, 한국어·일본어·중국어 폰트를 임베드하며, 한 페이지를 약 13 µs에 렌더링합니다.

$go get github.com/gpdf-dev/gpdf
동작 방식
invoice.go
doc := template.New(template.WithPageSize(document.A4))
page := doc.AddPage()

page.AutoRow(func(r *template.RowBuilder) {
    r.Col(6, func(c *template.ColBuilder) {
        c.Text("ACME Corporation", template.FontSize(24),
            template.Bold(), template.TextColor(navy))
    })
    r.Col(6, func(c *template.ColBuilder) {
        c.Text("INVOICE", template.FontSize(28),
            template.Bold(), template.AlignRight())
    })
})

page.AutoRow(func(r *template.RowBuilder) {
    r.Col(12, func(c *template.ColBuilder) {
        c.Table(header, items,
            template.ColumnWidths(40, 15, 20, 25),
            template.TableStripe(pdf.RGBHex(0xF5F5F5)),
        )
    })
})

data, err := doc.Generate()
invoice.pdfPDF 열기
gpdf로 생성한 청구서 PDF: 회사 헤더, 청구 대상, 줄무늬 품목 표, 합계

순수 Go, 그것뿐.

go.mod에는 Go 자체만 있습니다. cgo도, 헤드리스 브라우저도, 서비스 옆에 둘 네이티브 바이너리도 필요 없습니다.

익숙한 레이아웃.

행과 12열 그리드가 페이지에 흘러 들어갑니다. 표는 페이지를 넘어 나뉘고 글은 자동으로 줄바꿈됩니다.

어떤 문자든 임베드.

TrueType 폰트는 사용한 글리프만 서브셋으로 넣어, 한중일 문자가 어느 서버에서나 똑같이 보입니다.

벤치마크

요청 안에서 생성할 수 있는 속도.

같은 4개의 문서를 gpdf, go-pdf/fpdf, signintech/gopdf, maroto v2로 만들었습니다. 문서당 시간과 메모리, 낮을수록 좋습니다.

단일 페이지
제목과 문단이 있는 A4 한 페이지
gpdf
x
13 µs
fpdf
x
132 µs
gopdf
x
423 µs
maroto v2
x
237 µs
10–33배 빠름시간
표 (4×10)
헤더 행이 있는 스타일 표
gpdf
x
108 µs
fpdf
x
241 µs
gopdf
x
835 µs
maroto v2
x
8,600 µs
2–80배 빠름시간
100페이지
같은 페이지를 100번 반복
gpdf
x
683 µs
fpdf
x
11,700 µs
gopdf
x
8,600 µs
maroto v2
x
19,800 µs
13–29배 빠름시간
복합 문서
제목, 표, 텍스트가 섞인 문서
gpdf
x
133 µs
fpdf
x
254 µs
gopdf
x
997 µs
maroto v2
x
10,400 µs
2–78배 빠름시간
단일 페이지 메모리
한 페이지를 만드는 동안 할당된 양
gpdf
x
16 KB
fpdf
x
1,200 KB
gopdf
x
1,800 KB
maroto v2
x
61 KB
메모리 4–113배 적음메모리
100페이지 메모리
100페이지를 만드는 동안 할당된 양
gpdf
x
909 KB
fpdf
x
121,000 KB
gopdf
x
83,000 KB
maroto v2
x
4,000 KB
메모리 4–133배 적음메모리

5회 실행의 중앙값, 각 100회 반복. Apple M1, Go 1.25. 벤치마크 코드는 gpdf 저장소에 있습니다.

벤치마크 코드 보기

Go 네이티브 아키텍처

Go로 만들었다. 따로 돌릴 것은 없다.

Go용 PDF 구성의 상당수는 언어 밖에 기댑니다. 사이드카의 헤드리스 브라우저, HTTP로 호출하는 HTML→PDF 서비스, 네이티브 라이브러리 바인딩. 모두 배포하고 패치하고 모니터링할 런타임이 하나 더 늘어납니다.

gpdf는 첫 줄부터 Go로 작성되었습니다. 여러분의 바이너리에 컴파일되어 Go가 도는 곳이면 어디서나 동작하고, 의존성 트리는 표준 라이브러리뿐이라 보안팀이 추가로 감사할 것이 없습니다.

go get 한 번, 바이너리 하나. 개발과 운영에서 같은 출력.

흔한 구성

여러분의 Go 앱

HTTP 호출 또는 cgo 바인딩

헤드리스 브라우저 · JVM · 네이티브 라이브러리

배포하고 패치하고 모니터링할 런타임이 또 하나.

gpdf

여러분의 Go 앱

go get

github.com/gpdf-dev/gpdf

바이너리 하나 · 표준 라이브러리만 · cgo 없음

실행 환경

LinuxmacOSWindowsDockerServerless

CJK 우선

한국어·일본어·중국어를 쓴 그대로.

많은 PDF 라이브러리가 CJK를 뒷전으로 둡니다. gpdf는 처음부터 CJK를 전제로 만들었습니다.

  • 어떤 TrueType 폰트든 임베드할 수 있고, 파일에는 사용한 글리프만 기록됩니다.

  • 한국어, 일본어, 중국어, 라틴 문자를 한 문단이나 표에 섞을 수 있습니다.

  • 두부(□)도, 글자 깨짐도 없고, 서버에 설치된 폰트에 좌우되지 않습니다.

폰트 가이드 읽기
Noto Sans JP 서브셋을 임베드해 gpdf로 렌더링한 일본어한국어·일본어·중국어가 섞인 gpdf 표

日本語 · 中文 · 한국어

레이아웃 그 이상.

보존, 보안, 후처리도 같은 모듈에 들어 있습니다. 그래도 의존성은 Go 표준 라이브러리뿐입니다.

PDF/A

XMP 메타데이터를 갖춘 PDF/A-1b·PDF/A-2b. 수십 년 동안 읽혀야 하는 문서에.

AES-256 암호화

소유자·사용자 비밀번호와 인쇄·복사·편집 권한 제어.

디지털 서명

완성된 PDF에 RFC 3161 타임스탬프가 있는 PKCS#7 서명을 적용합니다.

머리글과 바닥글

모든 페이지에 반복되는 머리글, 바닥글, 페이지 번호.

QR 코드와 바코드

QR과 Code 128을 네이티브로 생성하고 PNG·JPEG 이미지와 함께 배치합니다.

병합과 분할

Go 안에서 PDF를 합치거나 페이지 범위를 꺼냅니다.

그 밖에도…

기존 PDF에 오버레이를 찍고, 입력된 AcroForm 필드를 정적 콘텐츠로 평탄화합니다.

예제 둘러보기

gpdf와 다른 선택지

PDF 라이브러리 선택은 기능만으로 정해지지 않는다.

무엇을 배포하고, 무엇에 비용을 내고, 무엇을 계속 패치해야 하는가.

gpdf상용 Go SDKHTML→PDF (헤드리스 브라우저)
라이선스MIT, 상업적 사용 무료유료 라이선스 또는 종량 키오픈소스지만 브라우저는 직접 운영
의존성Go 표준 라이브러리만벤더 모듈모든 이미지에 브라우저
배포Go 바이너리 안에Go 바이너리 + 라이선스 키사이드카 또는 별도 서비스
CJK 텍스트기본 지원, 서브셋 임베드폰트 설정에 따라이미지 안의 폰트에 따라
단일 페이지약 13 µs제품마다 다름요청마다 브라우저 렌더링

go get부터 운영까지.

스택에 맞는 진입점을 고르세요. 세 가지 모두 같은 렌더링 엔진을 거칩니다.

한 줄 설치

go get github.com/gpdf-dev/gpdf. Go 1.22 이상에서 동작합니다.

Builder API

유창하고 타입 안전한 Go: PageBuilder → RowBuilder → ColBuilder.

JSON 스키마

문서를 JSON으로 기술해 어떤 서비스나 언어에서든 보낼 수 있습니다.

Go 템플릿

text/template으로 JSON 스키마를 구동해 하나의 소스로 수천 개의 문서를.

바로 쓰는 템플릿

복사해서 고쳐 쓰는 청구서, 영수증, 견적서.

실행 가능한 예제

모든 예제는 실제 PDF를 렌더링하는 테스트입니다. 표부터 서명까지.

골든 파일 테스트

릴리스마다 모든 예제를 저장된 PDF와 바이트 단위로 비교합니다.

표준 적합성 검사

생성된 파일을 CI에서 PDF 사양에 맞춰 검증합니다.

Go 1.22~1.26

CI는 지원하는 모든 Go 버전에서 레이스 감지기를 켜고 전체 테스트를 실행합니다.

FAQ

출시 전에 자주 묻는 질문

gpdf는 외부 의존성 없이 순수 Go로 작성된 MIT 라이선스 PDF 생성 라이브러리입니다. 12열 그리드로 페이지를 배치하고 한중일을 포함한 TrueType 폰트를 임베드합니다.

오늘 첫 PDF를 만드세요.

go get 한 번, 그리고 Go 몇 줄.