52 lines
1.0 KiB
Go
52 lines
1.0 KiB
Go
// Package rasterize converts PDF pages to in-memory images using MuPDF.
|
|
package rasterize
|
|
|
|
import (
|
|
"fmt"
|
|
"image"
|
|
|
|
"github.com/gen2brain/go-fitz"
|
|
)
|
|
|
|
// DPI used when rasterizing pages for the orientation classifier.
|
|
// 150 mirrors the Ghostscript -r150 flag used in the original Python pipeline.
|
|
const DPI = 150
|
|
|
|
type Page struct {
|
|
Index int
|
|
Img image.Image
|
|
}
|
|
|
|
// PDF wraps an open MuPDF document.
|
|
type PDF struct {
|
|
doc *fitz.Document
|
|
}
|
|
|
|
func Open(data []byte) (*PDF, error) {
|
|
doc, err := fitz.NewFromMemory(data)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("fitz open: %w", err)
|
|
}
|
|
return &PDF{doc: doc}, nil
|
|
}
|
|
|
|
func (p *PDF) Close() error {
|
|
if p == nil || p.doc == nil {
|
|
return nil
|
|
}
|
|
return p.doc.Close()
|
|
}
|
|
|
|
func (p *PDF) NumPages() int {
|
|
return p.doc.NumPage()
|
|
}
|
|
|
|
// RenderPage rasterizes a single page at the configured DPI.
|
|
func (p *PDF) RenderPage(idx int) (image.Image, error) {
|
|
img, err := p.doc.ImageDPI(idx, DPI)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("render page %d: %w", idx, err)
|
|
}
|
|
return img, nil
|
|
}
|