解决PuppeteerSharp生成PDF颜色问题的最佳实践

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 使用PuppeteerSharp生成PDF时颜色丢失是个常见问题。本文介绍如何通过正确配置PdfOptions与CSS规则(如设置`PrintBackground`为`true`及使用`@media print`确保颜色准确显示),结合爬虫代理IP、User-Agent和Cookie设置等技巧来解决此问题,并提供了完整的代码示例。这些方法不仅有助于保持PDF的颜色准确性,还能增强爬虫的稳定性和效率。

爬虫代理.jpg

在现代网络开发中,使用爬虫技术生成PDF文件已成为一种常见需求。然而,开发者经常会遇到一些棘手的问题,其中之一便是使用PuppeteerSharp生成PDF时颜色丢失的问题。本篇文章将概述如何解决这一问题,并提供最佳实践和相关代码示例。

概述

PuppeteerSharp是一个强大的.NET库,它允许开发者使用无头浏览器进行网页操作和生成PDF文件。然而,在某些情况下,生成的PDF文件可能会出现颜色丢失的问题。此问题通常是由于CSS设置不当或PuppeteerSharp的PDF生成选项配置不正确导致的。

细节

解决PuppeteerSharp生成PDF颜色问题的关键在于正确配置PdfOptions和CSS规则。此外,使用爬虫代理IP、设置user-agent和cookie等技术,可以提高爬虫效率和稳定性。以下是具体的步骤和代码示例。

1. 设置PuppeteerSharp的PdfOptions

在生成PDF时,需要确保设置了正确的PdfOptions参数。例如,PrintBackground属性应设置为true,以确保背景颜色能够正确显示。

2. 配置CSS规则

在CSS中,使用@media print规则确保在打印或生成PDF时颜色能正确显示。关键是设置-webkit-print-color-adjust: exact

3. 使用爬虫代理IP

为了提高爬虫效率和稳定性,可以使用爬虫代理IP技术。以下示例代码使用了亿牛云爬虫代理。

4. 设置User-Agent和Cookie

通过设置适当的User-Agent和Cookie,可以模拟真实用户的行为,避免被反爬虫机制检测到。

代码示例

以下是一个使用PuppeteerSharp生成PDF并解决颜色丢失问题的完整代码示例。该代码还包括使用爬虫代理IP、设置User-Agent和Cookie的部分。

using System;
using System.Threading.Tasks;
using PuppeteerSharp;

class Program
{
   
   
    static async Task Main(string[] args)
    {
   
   
        // 设置爬虫代理IP信息 亿牛云爬虫代理加强版
        string proxyServer = "http://www.proxy.cn:端口";
        string proxyUsername = "用户名";
        string proxyPassword = "密码";

        // 启动浏览器并配置爬虫代理IP
        var browserFetcher = new BrowserFetcher();
        await browserFetcher.DownloadAsync(BrowserFetcher.DefaultRevision);
        var launchOptions = new LaunchOptions
        {
   
   
            Headless = true,
            Args = new[]
            {
   
   
                $"--proxy-server={proxyServer}",
                "--no-sandbox",
                "--disable-setuid-sandbox"
            }
        };

        using var browser = await Puppeteer.LaunchAsync(launchOptions);
        using var page = await browser.NewPageAsync();

        // 设置代理身份验证
        await page.AuthenticateAsync(new Credentials
        {
   
   
            Username = proxyUsername,
            Password = proxyPassword
        });

        // 设置User-Agent和Cookie
        await page.SetUserAgentAsync("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36");
        await page.SetCookieAsync(new CookieParam
        {
   
   
            Name = "cookie_name",
            Value = "cookie_value",
            Domain = "zxcs.info"
        });

        // 导航到目标网页
        await page.GoToAsync("https://zxcs.info");

        // 注入CSS规则,确保颜色在PDF中正确显示
        await page.EvaluateFunctionOnNewDocumentAsync(@"
            () => {
                const style = document.createElement('style');
                style.type = 'text/css';
                style.innerHTML = `
                    @media print {
                        @page {
                            margin: 22mm 15mm 35mm 15mm;
                            background-color: teal !important;
                        }
                        html, body, #content, #header, #footer, .page {
                            background-color: teal !important;
                            -webkit-print-color-adjust: exact !important;
                        }
                    }
                `;
                document.head.appendChild(style);
            }
        ");

        // 生成PDF
        await page.PdfAsync("output.pdf", new PdfOptions
        {
   
   
            Format = PaperFormat.A4,
            PrintBackground = true,
            PreferCSSPageSize = true,
        });

        await browser.CloseAsync();
    }
}

结论

通过正确配置PuppeteerSharp的PdfOptions和CSS规则,可以有效解决生成PDF时颜色丢失的问题。此外,使用爬虫代理IP、设置User-Agent和Cookie等技术可以显著提高爬虫效率和稳定性。希望本文的最佳实践和代码示例对您在解决相关问题时有所帮助。

相关文章
5万字长文:Stream和Lambda表达式最佳实践-附PDF下载(一)
5万字长文:Stream和Lambda表达式最佳实践-附PDF下载(一)
5万字长文:Stream和Lambda表达式最佳实践-附PDF下载(一)
|
并行计算 Java 测试技术
5万字长文:Stream和Lambda表达式最佳实践-附PDF下载(三)
5万字长文:Stream和Lambda表达式最佳实践-附PDF下载(三)
5万字长文:Stream和Lambda表达式最佳实践-附PDF下载(三)
|
并行计算 Java 编译器
5万字长文:Stream和Lambda表达式最佳实践-附PDF下载(二)
5万字长文:Stream和Lambda表达式最佳实践-附PDF下载(二)
|
1月前
|
XML 缓存 JSON
为什么浏览器中有些图片、PDF等文件点击后有些是预览,有些是下载
为什么浏览器中有些图片、PDF等文件点击后有些是预览,有些是下载
124 0
|
1月前
|
Linux Python Windows
Python PDF文件转Word格式,只需要3秒(附打包)
Python PDF文件转Word格式,只需要3秒(附打包)
54 3
Python PDF文件转Word格式,只需要3秒(附打包)
|
22天前
|
移动开发 资源调度 JavaScript
Vue移动端网页(H5)预览pdf文件(pdfh5和vue-pdf)
这篇文章介绍了在Vue移动端网页中使用`pdfh5`和`vue-pdf`两个插件来实现PDF文件的预览,包括滚动查看、缩放、添加水印、分页加载、跳转指定页数等功能。
Vue移动端网页(H5)预览pdf文件(pdfh5和vue-pdf)
|
1月前
|
JSON JavaScript 数据格式
打印插件 hiprint 使用、回单打印PDF保存本地、将列表数据打印成pdf文件保存到本地
这篇文章介绍了如何使用hiprint打印插件将列表数据打印成PDF文件并保存到本地,包括插件的配置、依赖安装、项目代码案例以及如何预览和打印数据。
打印插件 hiprint 使用、回单打印PDF保存本地、将列表数据打印成pdf文件保存到本地
|
1月前
|
Python
Python——批量将PDF文件转为图片
Python——批量将PDF文件转为图片
29 2
|
1月前
|
Python
Python——将PPT和Word转为PDF文件
Python——将PPT和Word转为PDF文件
36 1
|
20天前
|
C# 开发者 Windows
WPF与PDF文档:解锁创建和编辑PDF文件的新技能——从环境配置到代码实践,手把手教你如何在WPF应用中高效处理PDF,提升文档管理效率
【8月更文挑战第31天】随着数字文档的普及,PDF因跨平台兼容性和高保真度成为重要格式。WPF虽不直接支持PDF处理,但借助第三方库(如iTextSharp)可在WPF应用中实现PDF的创建与编辑。本文通过具体案例和示例代码,详细介绍了如何在WPF中集成PDF库,并展示了从设计用户界面到实现PDF创建与编辑的完整流程。不仅包括创建新文档的基本步骤,还涉及在现有PDF中添加页眉页脚等高级功能。通过这些示例,WPF开发者可以更好地掌握PDF处理技术,提升应用程序的功能性和实用性。
36 0