使用 Go 实现将任何网页转化为 PDF
在许多应用场景中,可能需要将网页内容转化为 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 mainimport ("fmt""github.com/go-rod/rod""log""os"
)func main() {// 要转换的网页 URLurl := "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` 还提供了网页截图等其他功能,可以根据需求进行扩展。
相关文章:

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

文件操作和IO
目录 一. 文件预备知识 1. 硬盘 2. 文件 (1) 概念 (2) 文件路径 (3) 文件类型 二. 文件操作 1. 文件系统操作 [1] File常见的构造方法 [2] File的常用方法 [3] 查看某目录下所有的目录和文件 2. 文件内容操作 (1) 打开文件 (2) 关闭文件 (3) 读文件 (4) 写文件 …...

【C++滑动窗口】1248. 统计「优美子数组」|1623
本文涉及的基础知识点 C算法:滑动窗口及双指针总结 LeetCode1248. 统计「优美子数组」 给你一个整数数组 nums 和一个整数 k。如果某个连续子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」。 请返回这个数组中 「优美子数组」 的数…...
C语言导航 4.1语法基础
第四章 顺序结构程序设计 第一节 语法基础 语句概念 语句详解 程序详解 4.1.1语句概念 说明:构成高级语言源程序的基本单位。 特征:在C语言中语句以分号作为结束标志。 分类: (1)简单语句:空语句、…...
使用 Python 和 Py2Neo 构建 Neo4j 管理脚本
Neo4j 是一个强大的图数据库,适合处理复杂的关系型数据。借助 Python 的 py2neo 库,我们可以快速实现对 Neo4j 数据库的管理和操作。本文介绍一个功能丰富的 Python 脚本,帮助用户轻松管理 Neo4j 数据库,包含启动/停止服务、清空数…...

Centos 7 安装wget
Centos 7 安装wget 最小化安装Centos 7 的话需要上传wget rpm包之后再路径下安装一下。rpm包下载地址(http://mirrors.163.com/centos/7/os/x86_64/Packages/) 1、使用X-ftp 或者WinSCP等可以连接上传的软件都可以首先连接服务器,这里我用的…...

定时器的小应用
第一个项目 第一步,RCC开启时钟,这个基本上每个代码都是第一步,不用多想,在这里打开时钟后,定时器的基准时钟和整个外设的工作时钟就都会同时打开了 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);第二步&…...
linux企业中常用NFS、ftp服务
1.静态ip配置 修改ip地址为静态vim /etc/sysconfig/network-scripts/ifcfg-enxxx BOOTPROTO"static" IPADDR192.168.73.10 GATEWAY192.168.73.2 # 该配置与虚拟机网关一致 NETMASK255.255.255.0重启网卡:systemctl restart network.service ping不通域名…...

数据结构与算法分析模拟试题及答案5
模拟试题(五) 一、单项选择题(每小题 2 分,共20分) (1)队列的特点是( )。 A)先进后出 B)先进先出 C)任意位置进出 D࿰…...

.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…...

Python自动检测requests所获得html文档的编码
使用chardet库自动检测requests所获得html文档的编码 使用requests和BeautifulSoup库获取某个页面带来的乱码问题 使用requests配合BeautifulSoup库,可以轻松地从网页中提取数据。但是,当网页返回的编码格式与Python默认的编码格式不一致时,…...

11.12机器学习_特征工程
四 特征工程 1 特征工程概念 特征工程:就是对特征进行相关的处理 一般使用pandas来进行数据清洗和数据处理、使用sklearn来进行特征工程 特征工程是将任意数据(如文本或图像)转换为可用于机器学习的数字特征,比如:字典特征提取(特征离散化)、文本特征提取、图像特征提取。 …...

RAG经验论文《FACTS About Building Retrieval Augmented Generation-based Chatbots》笔记
《FACTS About Building Retrieval Augmented Generation-based Chatbots》是2024年7月英伟达的团队发表的基于RAG的聊天机器人构建的文章。 这篇论文在待读列表很长时间了,一直没有读,看题目以为FACTS是总结的一些事实经验,阅读过才发现FAC…...

【配置后的基本使用】CMake基础知识
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀各种软件安装与配置_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1.…...

ollama+springboot ai+vue+elementUI整合
1. 下载安装ollama (1) 官网下载地址:https://github.com/ollama/ollama 这里以window版本为主,下载链接为:https://ollama.com/download/OllamaSetup.exe。 安装完毕后,桌面小图标有一个小图标,表示已安装成功&…...
【项目开发】理解SSL延迟:为何HTTPS比HTTP慢?
未经许可,不得转载。 文章目录 前言HTTP与HTTPS的耗时差异TCP握手HTTPS的额外步骤:SSL握手使用curl测量SSL延迟性能与安全的权衡前言 在互联网发展的早期阶段,Netscape公司设计了SSL(Secure Sockets Layer)协议,为网络通信提供加密和安全性。有人曾提出一个大胆的设想:…...

2.STM32之通信接口《精讲》之USART通信
有关通信详解进我主页观看其他文章!【免费】SPIIICUARTRS232/485-详细版_UART、IIC、SPI资源-CSDN文库 通过以上可以看出。根据电频标准,可以分为TTL电平,RS232电平,RS485电平,这些本质上都属于串口通信。有区别的仅是…...
Bootstrap和jQuery开发案例
目录 1. Bootstrap和jQuery简介及优势2. Bootstrap布局与组件示例:创建一个响应式的表单界面 3. jQuery核心操作与事件处理示例:使用jQuery为表单添加交互 4. Python后端实现及案例代码案例 1:用户登录系统Flask后端代码前端代码 5. 设计模式…...

Qt 之 qwt和QCustomplot对比
QWT(Qt Widgets for Technical Applications)和 QCustomPlot 都是用于在 Qt 应用程序中绘制图形和图表的第三方库。它们各有优缺点,适用于不同的场景。 以下是 QWT 和 QCustomPlot 的对比分析: 1. 功能丰富度 QWT 功能丰富&a…...

【STM32】MPU6050简介
文章目录 MPU6050简介MPU6050关键块带有16位ADC和信号调理的三轴MEMS陀螺仪具有16位ADC和信号调理的三轴MEMS加速度计I2C串行通信接口 MPU6050对应的数据手册:MPU6050 陀螺仪加速度计 链接: https://pan.baidu.com/s/13nwEhGvsfxx0euR2hMHsyw?pwdv2i6 提取码: v2i6…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
Vue3中的computer和watch
computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...

CSS3相关知识点
CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...

高抗扰度汽车光耦合器的特性
晶台光电推出的125℃光耦合器系列产品(包括KL357NU、KL3H7U和KL817U),专为高温环境下的汽车应用设计,具备以下核心优势和技术特点: 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计,确保在…...
【java】【服务器】线程上下文丢失 是指什么
目录 ■前言 ■正文开始 线程上下文的核心组成部分 为什么会出现上下文丢失? 直观示例说明 为什么上下文如此重要? 解决上下文丢失的关键 总结 ■如果我想在servlet中使用线程,代码应该如何实现 推荐方案:使用 ManagedE…...