使用 Go 实现将任何网页转化为 PDF

news2024/11/18 20:06:00

在许多应用场景中,可能需要将网页内容转化为 PDF 格式,比如保存网页内容、生成报告、或者创建网站截图。使用 Go 编程语言,结合一些现有的库,可以非常方便地实现这一功能。本文将带你一步一步地介绍如何使用 Go 语言将任何网页转换成 PDF 文件。

## 1. 为什么选择 Go 语言?

Go 语言有以下几个优点,使得它适合处理网页转 PDF 的任务:
- **高性能**:Go 是编译型语言,执行速度快,适合大规模处理。
- **易于部署**:Go 编译后生成的二进制文件无依赖,易于部署和使用。
- **丰富的库支持**:Go 有多个优秀的第三方库,可以帮助我们解决不同的问题。

## 2. 所需的工具和库

要将网页转换为 PDF,我们可以使用以下几个工具:
- **Chromium/Chrome 或 Puppeteer**:浏览器引擎来渲染网页,确保网页的样式和内容正确呈现。
- **Go 的 WebDriver 或 Web 自动化工具**:用于控制 Chromium 或 Chrome 实现网页加载和渲染。
- **go-rod**:一个 Go 语言的 Web 自动化工具,可以非常容易地控制浏览器,并将网页渲染成 PDF。

我们将使用 `go-rod` 库,这是一个轻量级的 Go 库,它封装了 Puppeteer 和 Playwright 等浏览器自动化工具。`go-rod` 支持无头模式的 Chromium 浏览器,并提供了很好的 API 来操作浏览器,完成网页渲染和 PDF 转换。

## 3. 安装 Go 和相关依赖

首先,确保你已经安装了 Go 环境。如果还没有安装 Go,可以从 [Go 官网](https://golang.org/dl/) 下载并安装。

然后,我们需要安装 `go-rod` 库:

go get github.com/go-rod/rod

`go-rod` 依赖于 Chromium 浏览器(或任何其他支持无头模式的浏览器)。确保你已经安装了 Chromium 或 Chrome 浏览器。如果你还没有安装 Chromium,可以通过以下命令安装:

### 安装 Chromium(以 Ubuntu 为例):
```bash

sudo apt install chromium-browser


```

或者,你可以使用其他平台的安装方式,比如下载 Chromium 的可执行文件或者使用 Docker 来运行。

## 4. 使用 Go 实现网页转 PDF

在这一部分,我们将使用 `go-rod` 库来实现一个简单的程序,将网页内容转化为 PDF。

### 创建 `main.go` 文件:```go

package main

import (
    "fmt"
    "github.com/go-rod/rod"
    "log"
    "os"
)

func main() {
    // 要转换的网页 URL
    url := "https://www.example.com"
    // 输出的 PDF 文件路径
    outputFile := "output.pdf"

    // 启动无头 Chromium 浏览器
    browser := rod.New().MustConnect()

    // 打开网页
    page := browser.MustPage(url)

    // 设置 PDF 导出选项
    page.MustPDF(rod.PDFOptions{
        Path: outputFile, // 输出的 PDF 文件路径
    })

    fmt.Printf("网页已成功转换为 PDF: %s\n", outputFile)

    // 关闭浏览器
    browser.MustClose()
}


```

### 代码解析:

1. **启动浏览器**:
   我们使用 `rod.New().MustConnect()` 启动一个新的 Chromium 实例,`MustConnect` 会连接到本地的 Chromium 浏览器。
   
2. **加载网页**:
   使用 `browser.MustPage(url)` 打开指定的网页 URL。

3. **生成 PDF**:
   `page.MustPDF()` 方法会将加载的网页渲染为 PDF。我们可以通过 `rod.PDFOptions` 来指定一些选项,比如输出文件的路径、页面大小、边距等。

4. **关闭浏览器**:
   在操作完成后,我们使用 `browser.MustClose()` 关闭浏览器实例,释放资源。

### 运行程序:

保存代码后,在终端中执行:

```bash

go run main.go


```

运行成功后,网页将被转换为 PDF 文件,保存在当前目录下,文件名为 `output.pdf`。

## 5. 可选功能:自定义 PDF 设置

`go-rod` 提供了许多可以自定义的 PDF 选项,下面是一些常用的配置项:

### 自定义 PDF 页面大小

你可以通过 `Format` 设置 PDF 页面的大小,`A4` 或 `Letter` 等。

```go

page.MustPDF(rod.PDFOptions{
    Path:   "output.pdf",
    Format: "A4", // 可选: A4, Letter, Legal 等
})


```

### 自定义边距和布局

你可以自定义 PDF 页面的边距:

```go

page.MustPDF(rod.PDFOptions{
    Path:  "output.pdf",
    MarginTop:    0.5,  // 上边距
    MarginBottom: 0.5,  // 下边距
    MarginLeft:   0.5,  // 左边距
    MarginRight:  0.5,  // 右边距
})


```

### 等待页面加载完成

如果网页有大量的动态内容(例如使用 JavaScript 渲染),你可能需要等待页面加载完成后再转换为 PDF。可以使用 `page.WaitLoad()` 来确保页面完全加载:

```go

page.MustNavigate(url).MustWaitLoad()


```

### 屏幕截图和其他功能

除了生成 PDF,`go-rod` 还可以用来截取网页的截图。你可以使用 `page.MustScreenshot()` 方法截取整个网页的图片。

```go

page.MustScreenshot("screenshot.png")


```

## 6. 结语

通过以上步骤,你可以使用 Go 和 `go-rod` 库轻松地将网页转换成 PDF 文件。这个方法不仅简单易用,而且支持自定义 PDF 输出设置。你还可以根据需要扩展更多功能,如截图、网页内容爬取等。

### 总结

- 使用 `go-rod` 库实现网页转 PDF 主要依赖 Chromium 浏览器的渲染引擎,确保网页内容、样式能够正确呈现。
- 你可以通过简单的 Go 程序,实现网页转 PDF,支持自定义输出设置,如页面大小、边距等。
- `go-rod` 还提供了网页截图等其他功能,可以根据需求进行扩展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2242997.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

.NET 9.0 中 System.Text.Json 的全面使用指南

以下是一些 System.Text.Json 在 .NET 9.0 中的使用方式,包括序列化、反序列化、配置选项等,并附上输出结果。 基本序列化和反序列化 using System; using System.Text.Json; public class Program {public class Person{public string Name { get; se…

.netcore + postgis 保存地图围栏数据

一、数据库字段 字段类型选择(Type) 设置对象类型为:geometry 二、前端传递的Json格式转换 前端传递围栏的各个坐标点数据如下: {"AreaRange": [{"lat": 30.123456,"lng": 120.123456},{"lat": 30.123456…

用pyspark把kafka主题数据经过etl导入另一个主题中的有关报错

首先看一下我们的示例代码 import os from pyspark.sql import SparkSession import pyspark.sql.functions as F """ ------------------------------------------Description : TODO:SourceFile : etl_stream_kafkaAuthor : zxxDate : 2024/11/…

算法日记 26-27day 贪心算法

接下来的题目有些地方比较相似。需要注意多个条件。 题目:分发糖果 135. 分发糖果 - 力扣(LeetCode) n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求,给这些孩子分发糖果: 每…

编写一个生成凯撒密码的程序

plain list(input("请输入需要加密的明文(只支持英文字母):"))key int(input("请输入移动的位数:"))base_A ord(A)base_a ord(a)cipher []for each in plain:if each :cipher.append( )else:if each.i…

PyCharm2024.2.4安装

一、官网下载 1.从下面的链接点进去 PyCharm: The Python IDE for data science and web development by JetBrains 2.进入官网后,下载pycharm安装包 3.点击下载能适配你系统的安装包 4.安装包下载完成 二、安装 1.下载完成后,打开点击右键&#xff…

【MySQL】MySQL数据库入门:构建你的数据基石

🍑个人主页:Jupiter. 🚀 所属专栏:MySQL初阶探索:构建数据库基础 欢迎大家点赞收藏评论😊 目录 🦅数据库基础🐀什么是数据库🐏主流数据库🦆MySQL数据库的基本…

基于Python 和 pyecharts 制作招聘数据可视化分析大屏

在本教程中,我们将展示如何使用 Python 和 pyecharts 库,通过对招聘数据的分析,制作一个交互式的招聘数据分析大屏。此大屏将通过不同类型的图表(如柱状图、饼图、词云图等)展示招聘行业、职位要求、薪资分布等信息。 …

OMV7 树莓派 tf卡安装

​ 升级7之后,问题多多,不是docker不行了,就是代理不好使 今天又重装了一遍,用官方的链接,重新再折腾一遍…… 使用raspberry pi imager安装最新版lite OS。 注意是无桌面 Lite版 配置好树莓派初始化设置&#xff0…

idea 弹窗 delete remote branch origin/develop-deploy

想删除远程分支,就选delete,仅想删除本地分支,选cancel; 在 IntelliJ IDEA 中遇到弹窗提示删除远程分支 origin/develop-deploy,这通常是在 Git 操作过程中出现的情况,可能是在执行如 git branch -d 或其他…

GitCode光引计划有奖征文大赛

一、活动介绍 GitCode平台汇聚了众多杰出的G-Star项目,它们犹如璀璨星辰,用各自的故事和成就,为后来者照亮前行的道路。我们诚邀广大开发者、项目维护者及爱好者,共同撰写并分享项目在GitCode平台上托管的体验,挖掘平…

qt移植到讯为rk3568,包含一些错误总结

qt移植到arm报错动态库找不到 error while loading shared libraries: libAlterManager.so.1: cannot open shared object file: No such file or directory 通过设置环境变量 LD_LIBRARY_PATH就行了。 LD_LIBRARY_PATH是一个用于指定动态链接器在运行时搜索共享库的路径的环…

Android Framework AMS(16)进程管理

该系列文章总纲链接:专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明: 说明:本章节主要解读AMS 进程方面的知识。关注思维导图中左上侧部分即可。 我们本章节主要是对Android进程管理相关知识有一个基本的了解。先来了解下L…

(一)- DRM架构

一,DRM简介 linux内核中包含两类图形显示设备驱动框架: FB设备:Framebuffer图形显示框架; DRM:直接渲染管理器(Direct Rendering Manager),是linux目前主流的图形显示框架; 1&am…

【PHP】ThinkPHP基础

下载composer ComposerA Dependency Manager for PHPhttps://getcomposer.org/ 安装composer 查看composer是否安装 composer composer --version 安装 ThinkPHP6 如果你是第一次安装的话,首次安装咱们需要打开控制台: 进入后再通过命令,在命令行下面&a…

Elasticsearch基本概念及使用

Elasticsearch 是一个开源的、分布式的全文搜索和分析引擎,基于 Apache Lucene 构建。它提供了快速的搜索能力,支持大规模的数据分析,广泛应用于日志分析、全文搜索、监控系统和商业智能等领域。ES操作指令是基于restAPI构建,也就…

黑马智慧商城项目学习笔记

目录 智慧商城项目创建项目调整初始化目录vant组件库vant按需导入和全部导入 项目中的vw适配路由设计配置登录页静态布局图形验证码功能request模块-axios封装api模块-封装图片验证码接口 Toast轻提示(vant组件)短信验证倒计时功能登录功能响应拦截器统一…

攻防世界Web-bug

打开链接 先注册一个账号 创建成功,会给一个UID5 抓包的user值就是UID:用户名的md5加密的编码 点击Manage时要求admin用户 利用改包把user改成admin 1:admin的md5值为4b9987ccafacb8d8fc08d22bbca797ba 还要把url上的UID改为1 存在逻辑漏洞,成功越权 …

apk反编译修改教程系列-----apk应用反编译中AndroidManifest.xml详细代码释义解析 包含各种权限 代码含义【二】

💝💝💝💝在上期博文中解析了一个常规apk中 AndroidManifest.xml的权限以及代码。应粉丝需求。这次解析一个权限较高的apk。这款apk是一个家长管控的应用。需求的各种权限较高。而且通过管控端可以设置控制端的app隐藏与否。 通过博文了解💝💝💝💝 1💝💝…

湘潭大学软件工程算法设计与分析考试复习笔记(一)

文章目录 前言随机类(第七章)随机概述数值随机化舍伍德拉斯维加斯蒙特卡罗 模拟退火遗传人工神经网络 回溯(第五章)动态规划(第四章)后记 前言 考试还剩十一天,现在准备开始复习这门课了。好像全…