当前位置: 首页 > news >正文

使用 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&#xff0…...

.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默认的编码格式不一致时&#xff0c…...

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

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

Android15默认授权浮窗权限

我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

蓝桥杯 冶炼金属

原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...