-
-
Save johan-lejdung/2b0fd62871b6f37acaf45e484ffdc69a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Package gofpdi wraps the gofpdi PDF library to import existing PDFs as templates. See github.com/phpdave11/gofpdi | |
for further information and examples. | |
Users should call NewImporter() to obtain their own Importer instance to work with. | |
To retain backwards compatibility, the package offers a default Importer that may be used via global functions. Note | |
however that use of the default Importer is not thread safe. | |
ChainTraced NOTE: We're using this file copied from the https://github.com/phpdave11/gofpdf/blob/master/contrib/gofpdi/gofpdi.go | |
while we wait for our fix detailed here https://github.com/phpdave11/gofpdi/issues/59 to be merged (https://github.com/phpdave11/gofpdi/pull/60). | |
*/ | |
package pdfgen | |
import ( | |
"io" | |
realgofpdi "github.com/chaintraced/gofpdi" | |
) | |
// gofpdiPdf is a partial interface that only implements the functions we need | |
// from the PDF generator to put the imported PDF templates on the PDF. | |
type gofpdiPdf interface { | |
ImportObjects(objs map[string][]byte) | |
ImportObjPos(objs map[string]map[int]string) | |
ImportTemplates(tpls map[string]string) | |
UseImportedTemplate(tplName string, x float64, y float64, w float64, h float64) | |
SetError(err error) | |
} | |
// Importer wraps an Importer from the gofpdi library. | |
type Importer struct { | |
fpdi *realgofpdi.Importer | |
} | |
// NewImporter creates a new Importer wrapping functionality from the gofpdi library. | |
func NewImporter() *Importer { | |
return &Importer{ | |
fpdi: realgofpdi.NewImporter(), | |
} | |
} | |
// ImportPage imports a page of a PDF file with the specified box (/MediaBox, | |
// /TrimBox, /ArtBox, /CropBox, or /BleedBox). Returns a template id that can | |
// be used with UseImportedTemplate to draw the template onto the page. | |
func (i *Importer) ImportPage(f gofpdiPdf, sourceFile string, pageno int, box string) int { | |
// Set source file for fpdi | |
i.fpdi.SetSourceFile(sourceFile) | |
// return template id | |
return i.getTemplateID(f, pageno, box) | |
} | |
// ImportPageFromStream imports a page of a PDF with the specified box | |
// (/MediaBox, TrimBox, /ArtBox, /CropBox, or /BleedBox). Returns a template id | |
// that can be used with UseImportedTemplate to draw the template onto the | |
// page. | |
func (i *Importer) ImportPageFromStream(f gofpdiPdf, rs *io.ReadSeeker, pageno int, box string) int { | |
// Set source stream for fpdi | |
i.fpdi.SetSourceStream(rs) | |
// return template id | |
return i.getTemplateID(f, pageno, box) | |
} | |
func (i *Importer) getTemplateID(f gofpdiPdf, pageno int, box string) int { | |
// Import page | |
tpl := i.fpdi.ImportPage(pageno, box) | |
// Import objects into current pdf document | |
// Unordered means that the objects will be returned with a sha1 hash instead of an integer | |
// The objects themselves may have references to other hashes which will be replaced in ImportObjects() | |
tplObjIDs := i.fpdi.PutFormXobjectsUnordered() | |
// Set template names and ids (hashes) in gofpdf | |
f.ImportTemplates(tplObjIDs) | |
// Get a map[string]string of the imported objects. | |
// The map keys will be the ID of each object. | |
imported := i.fpdi.GetImportedObjectsUnordered() | |
// Import gofpdi objects into gofpdf | |
f.ImportObjects(imported) | |
// Get a map[string]map[int]string of the object hashes and their positions within each object, | |
// to be replaced with object ids (integers). | |
importedObjPos := i.fpdi.GetImportedObjHashPos() | |
// Import gofpdi object hashes and their positions into gopdf | |
f.ImportObjPos(importedObjPos) | |
return tpl | |
} | |
// UseImportedTemplate draws the template onto the page at x,y. If w is 0, the | |
// template will be scaled to fit based on h. If h is 0, the template will be | |
// scaled to fit based on w. | |
func (i *Importer) UseImportedTemplate(f gofpdiPdf, tplid int, x float64, y float64, w float64, h float64) { | |
// Get values from fpdi | |
tplName, scaleX, scaleY, tX, tY := i.fpdi.UseTemplate(tplid, x, y, w, h) | |
f.UseImportedTemplate(tplName, scaleX, scaleY, tX, tY) | |
} | |
// GetPageSizes returns page dimensions for all pages of the imported pdf. | |
// Result consists of map[<page number>]map[<box>]map[<dimension>]<value>. | |
// <page number>: page number, note that page numbers start at 1 | |
// <box>: box identifier, e.g. "/MediaBox" | |
// <dimension>: dimension string, either "w" or "h" | |
func (i *Importer) GetPageSizes() map[int]map[string]map[string]float64 { | |
return i.fpdi.GetPageSizes() | |
} | |
// Default Importer used by global functions | |
var fpdi = NewImporter() | |
// ImportPage imports a page of a PDF file with the specified box (/MediaBox, | |
// /TrimBox, /ArtBox, /CropBox, or /BleedBox). Returns a template id that can | |
// be used with UseImportedTemplate to draw the template onto the page. | |
// Note: This uses the default Importer. Call NewImporter() to obtain a custom Importer. | |
func ImportPage(f gofpdiPdf, sourceFile string, pageno int, box string) int { | |
return fpdi.ImportPage(f, sourceFile, pageno, box) | |
} | |
// ImportPageFromStream imports a page of a PDF with the specified box | |
// (/MediaBox, TrimBox, /ArtBox, /CropBox, or /BleedBox). Returns a template id | |
// that can be used with UseImportedTemplate to draw the template onto the | |
// page. | |
// Note: This uses the default Importer. Call NewImporter() to obtain a custom Importer. | |
func ImportPageFromStream(f gofpdiPdf, rs *io.ReadSeeker, pageno int, box string) int { | |
return fpdi.ImportPageFromStream(f, rs, pageno, box) | |
} | |
// UseImportedTemplate draws the template onto the page at x,y. If w is 0, the | |
// template will be scaled to fit based on h. If h is 0, the template will be | |
// scaled to fit based on w. | |
// Note: This uses the default Importer. Call NewImporter() to obtain a custom Importer. | |
func UseImportedTemplate(f gofpdiPdf, tplid int, x float64, y float64, w float64, h float64) { | |
fpdi.UseImportedTemplate(f, tplid, x, y, w, h) | |
} | |
// GetPageSizes returns page dimensions for all pages of the imported pdf. | |
// Result consists of map[<page number>]map[<box>]map[<dimension>]<value>. | |
// <page number>: page number, note that page numbers start at 1 | |
// <box>: box identifier, e.g. "/MediaBox" | |
// <dimension>: dimension string, either "w" or "h" | |
// Note: This uses the default Importer. Call NewImporter() to obtain a custom Importer. | |
func GetPageSizes() map[int]map[string]map[string]float64 { | |
return fpdi.GetPageSizes() | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment