GO에서 PDF 보고서 생성
좋습니다. 이제 GO에서 PDF를 생성 중입니다!
PDF 문서를 프로그래밍 방식으로 생성하는 것은 애플리케이션에서 중요한 기능일 수 있습니다. 여기서 우리는 Go 프로그래밍 언어(Golang)에서 PDF 파일을 생성하는 데 사용할 수 있는 라이브러리에 대한 간단한 검토와 예제를 살펴보겠습니다.
예를 들어, 간단한 문서 생성이나 복잡하고 기능이 풍부한 PDF 생성과 같은 상황에 따라 적합한 솔루션이 다를 수 있습니다.
예, 이 이미지는 AI로 생성되었으며, 사용된 모델은 Flux1.Dev입니다.
라이브러리 및 도구
gofpdf
GoPdf는 PDF를 생성하는 데 사용할 수 있는 간단한 라이브러리입니다.
텍스트, 이미지, 도형, 표, 여러 페이지를 처리할 수 있습니다.
간단한 작업부터 중간 복잡도의 PDF 생성 작업에 적합합니다.
유지자: Jung Kurt (중단되었지만 여전히 사용되고 있음).
제한: 업데이트가 없지만, 기존 사용은 계속되고 있습니다.
예시:
package main
import (
"github.com/jung-kurt/gofpdf"
)
func main() {
pdf := gofpdf.New("P", "mm", "A4", "")
pdf.AddPage()
pdf.SetFont("Arial", "B", 16)
pdf.Cell(40, 10, "Hello World!")
err := pdf.OutputFileAndClose("hello.pdf")
if err != nil {
panic(err)
}
}
gopdf
유지자: signintech (활발하게 유지되고 있음).
Go 프로그래밍 언어에서 이 목적에 적합한 뛰어난 라이브러리 중 하나는 SignInTech에서 개발한 gopdf입니다. 이 라이브러리는 외부 의존성이나 C 라이브러리에 의존하지 않고도 PDF를 프로그래밍 방식으로 생성할 수 있는 간단한 방법을 제공합니다.
gopdf는 PDF 문서를 생성하기 위해 특별히 설계된 순수 Go 라이브러리입니다. 이 라이브러리는 주로 PDF 생성에 집중된 간단하고 효율적인 API를 제공하여 기본 작업에 쉽게 사용할 수 있도록 하며, 더 복잡한 작업에 필요한 유연성을 유지합니다.
주요 기능:
- 순수 Go 구현: 외부 의존성 또는 C 라이브러리가 필요하지 않습니다.
- 간단한 API: PDF를 생성하기 위한 사용이 쉬운 함수를 제공합니다.
- 효율적인 성능: 빠르고 효율적인 PDF 생성을 위해 최적화되었습니다.
사용 예시
gopdf가 어떻게 사용될 수 있는지 보여주기 위해 간단한 예시로, 간단한 PDF 문서를 생성하는 방법을 살펴보겠습니다:
package main
import (
"github.com/signintech/gopdf"
)
func main() {
// 새 PDF 인스턴스 생성
pdf := gopdf.New()
// 페이지 크기 및 여백 설정
pdf.SetPageSize(gopdf.PageSizeA4)
pdf.AddPage()
// PDF에 텍스트 추가
pdf.SetFont("Arial", "", 12)
pdf.Write(50, 50, "Hello, World!")
// PDF를 파일로 저장
err := pdf.SaveToFile("example.pdf")
if err != nil {
panic(err)
}
}
이 예시는 새 PDF 문서를 생성하고, 텍스트를 추가한 후 파일로 저장하는 방법을 보여줍니다.
gopdf 고급 기능:
- 이미지 추가: AddImage 메서드를 사용하여 PDF 문서에 이미지를 삽입할 수 있습니다.
- 도형 그리기: 라이브러리는 선, 사각형, 기타 도형을 그리는 기능을 제공합니다.
- PDF 보호: PDF에 암호 보호를 설정하여 접근을 제한할 수 있습니다.
pdfcpu
- 유지자: PDFCPU 팀 (https://github.com/pdfcpu/pdfcpu).
- 사용 사례: 대규모 PDF 조작 및 분석.
Go에서 PDF 조작에 사용할 수 있는 또 다른 강력한 라이브러리 중 하나는 pdfcpu입니다. 이 라이브러리는 API와 명령줄 인터페이스(CLI)를 통해 PDF 파일을 생성, 수정, 검사하는 데 포괄적인 기능 세트를 제공합니다. 아래에서는 pdfcpu의 설명, 사용 예시 및 주요 기능에 대해 다룹니다.
pdfcpu는 암호화를 지원하고, 다양한 PDF 문서 측면을 처리하기 위한 강력한 도구를 제공하는 Go 기반 PDF 처리 라이브러리입니다. 이 라이브러리는 모든 PDF 버전과 호환되며, PDF 2.0 (ISO-32000-2)에 대한 기본 지원과 지속적인 개선이 이루어지고 있습니다. 이 라이브러리는 간단한 사용 사례부터 복잡한 사용 사례까지 모두 다룰 수 있도록 포괄적인 PDF 처리 기능을 제공합니다.
주요 기능
- 암호화 지원: pdfcpu는 암호화를 지원하여 개발자가 PDF 문서를 효과적으로 보호할 수 있습니다.
- API 및 CLI: 프로그래밍 접근을 위한 API와 빠른 작업을 위한 명령줄 인터페이스(CLI)를 제공합니다.
- 배치 처리: 풍부한 명령줄을 통해 배치 처리를 강력하게 지원하여 여러 파일을 한 번에 처리할 수 있습니다.
- 호환성: 모든 PDF 버전과 호환되며, PDF 2.0에 대한 기본 지원과 지속적인 개선이 이루어지고 있습니다.
pdfcpu를 사용하려면 Go의 패키지 관리 시스템을 사용하여 설치해야 합니다:
go get github.com/pdfcpu/pdfcpu
기본 명령줄 작업
pdfcpu는 다양한 작업에 대한 다양한 명령을 제공합니다. 다음은 몇 가지 예시입니다:
이미지에서 PDF 생성
다음 명령을 사용하여 하나 이상의 이미지 파일을 PDF 파일로 변환할 수 있습니다:
pdfcpu img2pdf out.pdf image1.jpg image2.png
이 명령은 각 이미지가 별도의 페이지에 렌더링된 PDF를 생성합니다.
여러 PDF 파일을 하나의 문서로 병합하려면 merge 명령을 사용합니다:
pdfcpu merge output.pdf file1.pdf file2.pdf
pdfcpu 사용 예시
더 복잡한 작업을 위해 pdfcpu가 제공하는 API를 사용할 수 있습니다. 다음은 Go 코드를 사용하여 새 PDF를 생성하고 텍스트를 추가하는 방법의 예시입니다:
package main
import (
"github.com/pdfcpu/pdfcpu"
"log"
)
func main() {
// 새 PDF 문서 생성
doc := pdfcpu.NewPDF(0, 0)
defer doc.Close()
// 문서에 페이지 추가
page := doc.AddPage()
page.SetMediaBox(pdfcpu.MediaBox{
LLX: 0,
LLY: 0,
URX: 612,
URY: 792,
})
// 페이지에 텍스트 추가
content := "Hello, World!"
font := pdfcpu.NewFont("Helvetica", "")
page.AddText(content, font, 12, 100, 750)
// 문서 저장
err := doc.Save("output.pdf")
if err != nil {
log.Fatal(err)
}
}
이 예시는 pdfcpu의 API를 사용하여 새 PDF를 생성하고, 페이지를 추가하고, 텍스트를 페이지에 쓰는 방법을 보여줍니다.
Maroto
- 유지자: go-playground 팀 (https://github.com/go-playground/maroto).
- 사용 사례: 디자인 중심 접근을 선호하는 개발자(Bootstrap과 유사).
- Bootstrap에서 영감을 받아, HTML/CSS와 유사한 선언형 스타일로 쉽게 사용할 수 있도록 설계되었습니다.
- gofpdf 위에 구축되어 있으며, 생성 과정을 간소화하면서도 강력한 커스터마이징 옵션을 유지합니다.
Maroto는 또 다른 Go 라이브러리로, PDF를 생성하는 데 사용되지만, 하위 레벨의 세부 사항을 추상화하여 프로세스를 간소화하는 데 초점을 맞추고 있습니다. 이 라이브러리는 gofpdf 라이브러리 위에 구축되어 있으며, 문서 생성을 위한 사용자 친화적인 API를 제공합니다.
Maroto 사용 예시
Maroto를 사용하여 간단한 PDF를 생성하는 방법을 보여주는 예시입니다:
package main
import (
"github.com/andreyhoffmann1103/maroto"
)
func main() {
// 지정된 크기의 새 PDF 문서 생성
m := maroto.NewPDF(595, 842) // A4 크기(포인트 단위)
// 첫 번째 페이지에 텍스트 추가
m.AddText("Hello, Maroto!", 0, 0)
// PDF를 파일로 저장
err := m.OutputFileAndClose("example.pdf")
if err != nil {
panic(err)
}
}
이 예시는 Maroto를 사용하여 새 PDF 문서를 생성하고, 페이지에 텍스트를 추가하는 방법을 보여줍니다.
UniPDF
UniPDF은 Golang (Go)에서 PDF 파일을 생성하고 처리하는 데 사용할 수 있는 또 다른 강력하고 포괄적인 라이브러리입니다.
PDF 문서를 생성, 수정, 콘텐츠를 추출하는 데 필요한 다양한 기능을 제공하여 개발자들에게 인기를 얻고 있습니다.
- 유지자: UnidocLib (https://unidoc.io).
- 사용 사례: 고급 PDF 처리 (암호화, 병합, 스크립팅).
- PDF 생성 및 처리에 강력한 라이브러리 (순수 Go).
- 상호작용 요소(링크, 북마크, 병합/분할, 암호화 등)를 포함한 광범위한 기능 제공.
- PDF 객체(사전, 스트림)를 읽고 쓰는 데 대한 포괄적인 API 제공.
- 강력한 PDF 생성 기능이 필요한 애플리케이션에 적합.
UniPDF 설치
UniPDF을 사용하려면 라이브러리를 설치해야 합니다. 다음 단계를 따르세요:
# 새 디렉토리 생성:
mkdir go-pdf-generator cd go-pdf-generator
# Go 모듈 초기화:
go mod init go-pdf-generator
# UniPDF 라이브러리 설치:
go get github.com/unidoc/unipdf/v3
이렇게 하면 프로젝트를 설정하고 필요한 의존성을 설치할 수 있습니다.
기본 사용 예시
다음은 UniPDF을 사용하여 PDF 문서를 생성하는 간단한 예시입니다:
package main
import (
"github.com/unidoc/unipdf/v3/core"
"github.com/unidoc/unipdf/v3/model"
"github.com/unidoc/unipdf/v3/creator"
)
func main() {
// 새 PDF 문서 생성
pdf := creator.New()
// PDF에 페이지 추가
page := pdf.NewPage()
// 페이지의 콘텐츠 스트림 설정
contentStream := model.NewContentStream()
page.SetContents(contentStream)
// 페이지에 텍스트 추가
text := "Hello, UniPDF!"
font := creator.NewStandardFont(creator.FontHelvetica)
textObject := model.NewText(text, font, 12)
contentStream.Add(textObject)
// PDF 문서 저장
err := pdf.WriteToFile("example.pdf")
if err != nil {
panic(err)
}
}
이 예시는 새 PDF 문서를 생성하고, 페이지를 추가하고, 텍스트를 쓰는 방법을 보여줍니다. 결과 파일 example.pdf에는 “Hello, UniPDF!“라는 텍스트가 포함됩니다.
wkhtmltopdf Wrapper
- https://github.com/SebastiaanKlippert/go-wkhtmltopdf
- 의존성:
wkhtmltopdf
를brew
또는apt-get
을 통해 설치해야 합니다. - 사용 사례: 동적 HTML 콘텐츠(예: 영수증, 보고서)에서 PDF 생성.
기능:
- Go의
html/template
로 렌더링된 HTML 템플릿을 PDF로 변환합니다. - 여백, 페이지 방향, 헤더/푸터를 사용자 정의할 수 있습니다.
- 문서 디자인에 복잡한 HTML/CSS 스타일링이 포함된 경우에 적합합니다.
- HTML 콘텐츠를 PDF 형식으로 변환하기 위해 wkhtmltopdf를 백엔드로 사용합니다.
go-wkhtmltopdf 사용 예시
import (
"bytes"
"github.com/SebastiaanKlippert/go-wkhtmltopdf"
"html/template"
)
type PDFService struct {}
func NewPDFService() *PDFService {
return &PDFService{}
}
func (p PDFService) GeneratePDF(data interface{}) ([]byte, error) {
var templ *template.Template
var err error
if templ, err = template.ParseFiles("pdf-template.html"); err != nil {
return nil, err
}
var body bytes.Buffer
if err := templ.Execute(&body, data); err != nil {
return nil, err
}
pdfg, err := wkhtmltopdf.NewPDFGenerator()
if err != nil {
return nil, err
}
page := wkhtmltopdf.NewPageReader(bytes.NewReader(body.Bytes()))
page.EnableLocalFileAccess.Set(true)
pdfg.AddPage(page)
pdfg.MarginLeft.Set(0)
pdfg.MarginRight.Set(0)
pdfg.Dpi.Set(300)
pdfg.PageSize.Set(wkhtmltopdf.PageSizeA4)
pdfg.Orientation.Set(wkhtmltopdf.OrientationLandscape)
err = pdfg.Create()
if err != nil {
return nil, err
}
return pdfg.Bytes(), nil
}
pdflib (EndFirstCorp에서 제공):
- PDF 검증, 최적화, 분할/병합 등 다양한 PDF 작업을 위한 명령줄 도구입니다.
- PDF 문서와 관련된 배치 처리 및 관리 작업에 유용합니다.
pdflib 개요
pdflib 라이브러리는 Go 프로그래밍 언어를 위한 포괄적인 PDF 처리기로 설계되었습니다. 이 라이브러리는 PDF 검증, 최적화, 분할, 병합, 콘텐츠 추출, 자르기 등 다양한 기능을 지원합니다. 이 라이브러리는 PDF 32000-1:2008 (PDF 1.7) 표준을 준수하여 다양한 PDF 문서와의 호환성을 보장합니다.
주요 기능
- 검증: PDF 파일이 PDF 1.7 표준에 따라 준수하는지 확인합니다.
- 최적화: 중복된 자원을 제거하여 파일 크기를 줄입니다.
- 분할 및 병합: 다페이지 PDF를 단일 페이지 PDF로 분할하거나 여러 PDF를 하나로 병합할 수 있습니다.
- 추출: 이미지, 폰트, 콘텐츠 및 페이지를 PDF에서 추출합니다.
- 자르기: PDF 문서의 자른 버전을 생성합니다.
설치
pdflib을 사용하려면 Go의 패키지 관리 시스템을 통해 설치해야 합니다. 다음 명령어를 실행하여 설치할 수 있습니다:
go get github.com/EndFirstCorp/pdflib
기본 사용 예시 - PDF 검증
pdflib 라이브러리를 사용하여 기본 PDF 작업을 수행하는 간단한 예시를 보여드리겠습니다:
PDF를 PDF 1.7 표준에 따라 검증하려면 다음 코드를 사용할 수 있습니다:
package main
import ( "fmt" "github.com/EndFirstCorp/pdflib/cmd/pdflib" )
func main() {
// PDF 파일 검증
err := pdflib.Validate("example.pdf")
if err != nil {
fmt.Println("검증 실패:", err)
} else {
fmt.Println("PDF는 유효합니다.")
}
}
결론
Go에서 PDF를 생성할 때 사용할 라이브러리는 프로젝트의 복잡성과 특정 요구사항에 따라 달라집니다. 다음의 권장 사항을 제공합니다:
- 간단한 문서:
gofpdf
또는Maroto
를 사용하세요. 이러한 라이브러리는 간단한 작업에 대해 간단하고 사용이 쉬운 기능을 제공합니다. - HTML/CSS를 사용한 복잡한 디자인:
wkhtmltopdf Wrapper
를 사용하세요. 이 라이브러리는 복잡한 HTML 콘텐츠 및 스타일링을 처리하기 위해 wkhtmltopdf를 활용합니다. - 고급 PDF 처리: 암호화, 상호작용 요소, 상세한 포맷팅, 포괄적인 조작 기능이 필요한 경우
Unipdf
또는pdfcpu
를 선택하세요.
이러한 각 라이브러리는 PDF 생성에 필요한 다양한 요구사항에 맞는 고유한 강점을 제공하여, 개발자가 특정 요구사항에 따라 다양한 도구를 선택할 수 있도록 합니다.