GO에서 PDF 보고서 생성

좋습니다. 이제 GO에서 PDF를 생성 중입니다!

Page content

PDF 문서를 프로그래밍 방식으로 생성하는 것은 애플리케이션에서 중요한 기능일 수 있습니다. 여기서 우리는 Go 프로그래밍 언어(Golang)에서 PDF 파일을 생성하는 데 사용할 수 있는 라이브러리에 대한 간단한 검토와 예제를 살펴보겠습니다.

예를 들어, 간단한 문서 생성이나 복잡하고 기능이 풍부한 PDF 생성과 같은 상황에 따라 적합한 솔루션이 다를 수 있습니다.

go, 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

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

기능:

  • 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 생성에 필요한 다양한 요구사항에 맞는 고유한 강점을 제공하여, 개발자가 특정 요구사항에 따라 다양한 도구를 선택할 수 있도록 합니다.

라이브러리 링크

기타 유용한 링크