Golang截图工具包推荐
Golang截图工具包推荐 大家好! 最适合用于从多个网址创建截图并生成PDF的包是什么?不需要原生浏览器应用。 需要从网址创建完整页面尺寸的截图 谢谢
2 回复
对于从多个网址创建截图并生成PDF的需求,我推荐使用 chromedp 包,它是一个基于 Chrome DevTools Protocol 的 Go 语言库,可以无头运行 Chrome 或 Chromium 浏览器来捕获完整页面截图,然后结合其他库生成 PDF。以下是实现步骤和示例代码。
首先,安装必要的包:
go get -u github.com/chromedp/chromedp
go get -u github.com/jung-kurt/gofpdf # 用于生成 PDF
示例代码:从多个网址捕获完整页面截图,并将它们合并成一个 PDF 文件。
package main
import (
"context"
"image/png"
"log"
"os"
"time"
"github.com/chromedp/cdproto/page"
"github.com/chromedp/chromedp"
"github.com/jung-kurt/gofpdf"
)
func main() {
// 定义要截图的网址列表
urls := []string{
"https://example.com",
"https://golang.org",
"https://github.com",
}
// 创建上下文和取消函数
ctx, cancel := chromedp.NewContext(context.Background())
defer cancel()
// 设置超时
ctx, cancel = context.WithTimeout(ctx, 30*time.Second)
defer cancel()
// 初始化 PDF
pdf := gofpdf.New("P", "mm", "A4", "")
for i, url := range urls {
// 捕获完整页面截图
var buf []byte
err := chromedp.Run(ctx, chromedp.Tasks{
chromedp.Navigate(url),
chromedp.ActionFunc(func(ctx context.Context) error {
// 获取页面尺寸并设置视口为完整页面
var metrics *page.LayoutMetrics
metrics, err := page.GetLayoutMetrics().Do(ctx)
if err != nil {
return err
}
// 设置视口大小为完整页面内容尺寸
err = page.SetDeviceMetricsOverride(int64(metrics.ContentSize.Width), int64(metrics.ContentSize.Height), 1.0, false).Do(ctx)
if err != nil {
return err
}
// 捕获截图
buf, err = page.CaptureScreenshot().WithFormat(page.CaptureScreenshotFormatPng).Do(ctx)
return err
}),
})
if err != nil {
log.Fatalf("Failed to capture screenshot for %s: %v", url, err)
}
// 将截图保存为临时文件或直接处理
tmpFile, err := os.CreateTemp("", "screenshot-*.png")
if err != nil {
log.Fatalf("Failed to create temp file: %v", err)
}
defer os.Remove(tmpFile.Name()) // 清理临时文件
if err := png.Encode(tmpFile, buf); err != nil {
log.Fatalf("Failed to encode PNG: %v", err)
}
tmpFile.Close()
// 将截图添加到 PDF
pdf.AddPage()
// 获取图片尺寸并调整到 PDF 页面
options := gofpdf.ImageOptions{ImageType: "PNG", ReadDpi: true}
imgWidth, imgHeight := getImageDimensions(tmpFile.Name())
// 计算缩放以适配 A4 页面(210x297mm)
scale := min(210.0/imgWidth, 297.0/imgHeight)
pdf.ImageOptions(tmpFile.Name(), 10, 10, imgWidth*scale, imgHeight*scale, false, options, 0, "")
log.Printf("Processed %d/%d: %s", i+1, len(urls), url)
}
// 保存 PDF 文件
if err := pdf.OutputFileAndClose("screenshots.pdf"); err != nil {
log.Fatalf("Failed to save PDF: %v", err)
}
log.Println("PDF generated successfully: screenshots.pdf")
}
// 辅助函数:获取图片尺寸
func getImageDimensions(filePath string) (width, height float64) {
file, err := os.Open(filePath)
if err != nil {
log.Fatalf("Failed to open image file: %v", err)
}
defer file.Close()
img, err := png.DecodeConfig(file)
if err != nil {
log.Fatalf("Failed to decode image config: %v", err)
}
return float64(img.Width), float64(img.Height)
}
// 辅助函数:返回最小值
func min(a, b float64) float64 {
if a < b {
return a
}
return b
}
代码说明:
- 使用
chromedp连接到无头 Chrome 实例,导航到每个网址,并捕获完整页面截图(通过设置设备指标覆盖为页面内容尺寸)。 - 截图保存为 PNG 格式,然后使用
gofpdf库将每个截图添加到 PDF 页面中,自动缩放以适配 A4 尺寸。 - 处理多个网址,并最终生成一个名为
screenshots.pdf的 PDF 文件。
注意事项:
- 确保系统中已安装 Chrome 或 Chromium 浏览器,因为
chromedp依赖于它。 - 代码中使用了临时文件来存储截图,在生产环境中可能需要优化内存使用。
- 超时设置可根据网络状况调整;如果页面加载慢,可能需要增加超时时间。
这个方案避免了原生浏览器应用,完全在 Go 中实现,适合批量处理多个网址。

