Golang截图工具包推荐

Golang截图工具包推荐 大家好! 最适合用于从多个网址创建截图并生成PDF的包是什么?不需要原生浏览器应用。 需要从网址创建完整页面尺寸的截图 谢谢

2 回复

无。

更多关于Golang截图工具包推荐的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


对于从多个网址创建截图并生成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 中实现,适合批量处理多个网址。

回到顶部