phpdave11/gofpdi
GitHub: phpdave11/gofpdi
一个免费的 Go 语言 PDF 文档导入库,支持将现有 PDF 页面导入到 gopdf 或 gofpdf 生成的新文档中。
Stars: 133 | Forks: 75
# gofpdi
[](https://raw.githubusercontent.com/phpdave11/gofpdi/master/LICENSE)
[](https://goreportcard.com/report/github.com/phpdave11/gofpdi)
[](https://godoc.org/github.com/phpdave11/gofpdi)
## Go 免费 PDF 文档导入器
gofpdi 允许您将现有的 PDF 导入到新的 PDF 中。支持以下 PDF 生成库:
- [gopdf](https://github.com/signintech/gopdf)
- [gofpdf](https://github.com/phpdave11/gofpdf)
## 示例
### gopdf 示例
```
package main
import (
"github.com/signintech/gopdf"
"io"
"net/http"
"os"
)
func main() {
var err error
// Download a Font
fontUrl := "https://github.com/google/fonts/raw/master/ofl/daysone/DaysOne-Regular.ttf"
if err = DownloadFile("example-font.ttf", fontUrl); err != nil {
panic(err)
}
// Download a PDF
fileUrl := "https://tcpdf.org/files/examples/example_012.pdf"
if err = DownloadFile("example-pdf.pdf", fileUrl); err != nil {
panic(err)
}
pdf := gopdf.GoPdf{}
pdf.Start(gopdf.Config{PageSize: gopdf.Rect{W: 595.28, H: 841.89}}) //595.28, 841.89 = A4
pdf.AddPage()
err = pdf.AddTTFFont("daysone", "example-font.ttf")
if err != nil {
panic(err)
}
err = pdf.SetFont("daysone", "", 20)
if err != nil {
panic(err)
}
// Color the page
pdf.SetLineWidth(0.1)
pdf.SetFillColor(124, 252, 0) //setup fill color
pdf.RectFromUpperLeftWithStyle(50, 100, 400, 600, "FD")
pdf.SetFillColor(0, 0, 0)
pdf.SetX(50)
pdf.SetY(50)
pdf.Cell(nil, "Import existing PDF into GoPDF Document")
// Import page 1
tpl1 := pdf.ImportPage("example-pdf.pdf", 1, "/MediaBox")
// Draw pdf onto page
pdf.UseImportedTemplate(tpl1, 50, 100, 400, 0)
pdf.WritePdf("example.pdf")
}
// DownloadFile will download a url to a local file. It's efficient because it will
// write as it downloads and not load the whole file into memory.
func DownloadFile(filepath string, url string) error {
// Get the data
resp, err := http.Get(url)
if err != nil {
return err
}
defer resp.Body.Close()
// Create the file
out, err := os.Create(filepath)
if err != nil {
return err
}
defer out.Close()
// Write the body to file
_, err = io.Copy(out, resp.Body)
return err
}
```
生成的 PDF:[example.pdf](https://github.com/signintech/gopdf/files/3144466/example.pdf)
PDF 截图:

### gofpdf 示例 #1 - 从文件导入 PDF
```
package main
import (
"github.com/phpdave11/gofpdf"
"github.com/phpdave11/gofpdf/contrib/gofpdi"
"io"
"net/http"
"os"
)
func main() {
var err error
pdf := gofpdf.New("P", "mm", "A4", "")
// Download a PDF
fileUrl := "https://tcpdf.org/files/examples/example_026.pdf"
if err = DownloadFile("example-pdf.pdf", fileUrl); err != nil {
panic(err)
}
// Import example-pdf.pdf with gofpdi free pdf document importer
tpl1 := gofpdi.ImportPage(pdf, "example-pdf.pdf", 1, "/MediaBox")
pdf.AddPage()
pdf.SetFillColor(200, 700, 220)
pdf.Rect(20, 50, 150, 215, "F")
// Draw imported template onto page
gofpdi.UseImportedTemplate(pdf, tpl1, 20, 50, 150, 0)
pdf.SetFont("Helvetica", "", 20)
pdf.Cell(0, 0, "Import existing PDF into gofpdf document with gofpdi")
err = pdf.OutputFileAndClose("example.pdf")
if err != nil {
panic(err)
}
}
// DownloadFile will download a url to a local file. It's efficient because it will
// write as it downloads and not load the whole file into memory.
func DownloadFile(filepath string, url string) error {
// Get the data
resp, err := http.Get(url)
if err != nil {
return err
}
defer resp.Body.Close()
// Create the file
out, err := os.Create(filepath)
if err != nil {
return err
}
defer out.Close()
// Write the body to file
_, err = io.Copy(out, resp.Body)
return err
}
```
生成的 PDF:[example.pdf](https://github.com/phpdave11/gofpdf/files/3178770/example.pdf)
PDF 截图:

### gofpdf 示例 #2 - 从流导入 PDF
```
package main
import (
"bytes"
"github.com/phpdave11/gofpdf"
"github.com/phpdave11/gofpdf/contrib/gofpdi"
"io"
"io/ioutil"
"net/http"
)
func main() {
var err error
pdf := gofpdf.New("P", "mm", "A4", "")
// Download a PDF into memory
res, err := http.Get("https://tcpdf.org/files/examples/example_038.pdf")
if err != nil {
panic(err)
}
pdfBytes, err := ioutil.ReadAll(res.Body)
res.Body.Close()
if err != nil {
panic(err)
}
// convert []byte to io.ReadSeeker
rs := io.ReadSeeker(bytes.NewReader(pdfBytes))
// Import in-memory PDF stream with gofpdi free pdf document importer
tpl1 := gofpdi.ImportPageFromStream(pdf, &rs, 1, "/TrimBox")
pdf.AddPage()
pdf.SetFillColor(200, 700, 220)
pdf.Rect(20, 50, 150, 215, "F")
// Draw imported template onto page
gofpdi.UseImportedTemplate(pdf, tpl1, 20, 50, 150, 0)
pdf.SetFont("Helvetica", "", 20)
pdf.Cell(0, 0, "Import PDF stream into gofpdf document with gofpdi")
err = pdf.OutputFileAndClose("example.pdf")
if err != nil {
panic(err)
}
}
```
生成的 PDF:
[example.pdf](https://github.com/phpdave11/gofpdi/files/3483219/example.pdf)
PDF 截图:

标签:EVTX分析, Go, PDF, Ruby工具, 导入工具, 开发库, 文档处理, 日志审计