C#/VB.NET 实现彩色PDF转为灰度PDF

C#/VB.NET 实现彩色 PDF 转为灰度 PDF 攻略

在处理大量 PDF 文件时,我们可能需要将一些彩色的 PDF 转换为灰度的 PDF,以减少文件大小和管理文件。下面给出使用 C# 或 VB.NET 实现彩色 PDF 转换为灰度 PDF 的攻略。

1. 安装 PDF 处理库 iTextSharp

iTextSharp 是一个使用 C# 实现的免费 PDF 处理库,我们可以使用 NuGet 包管理器将其安装到我们的 .NET 项目中。

例如,可以使用以下命令在 Visual Studio 中安装 iTextSharp:

Install-Package iTextSharp

2. 实现彩色 PDF 转换为灰度 PDF 的代码

下面是一个示例代码块,实现彩色 PDF 转换为灰度 PDF 的功能。

// C# 代码示例
using System;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;

public static void ConvertToGrayscale(string sourcePath, string outputPath)
{
    using (var reader = new PdfReader(sourcePath))
    {
        using (var fileStream = new FileStream(outputPath, FileMode.Create, FileAccess.Write))
        {
            using (var stamper = new PdfStamper(reader, fileStream))
            {
                var total = reader.NumberOfPages + 1;
                for (var i = 1; i < total; i++)
                {
                    var page = stamper.GetImportedPage(reader, i);
                    var newPage = CopyAndConvertToGrayscale(page);
                    stamper.SetPageContent(i, newPage);
                }
            }
        }
    }
}

private static PdfStream CopyAndConvertToGrayscale(PdfImportedPage page)
{
    var sourcePdfStream = page.ToPdf(null);
    var sourceImage = new Jpeg(sourcePdfStream.GetAsBytes());
    var gs = new PdfGrayColorSpace();
    var image = Image.GetInstance(sourceImage);
    var newImage = Image.GetInstance(image.GetWidth(), image.GetHeight(), 1, 8, gs.GetPdfObject());
    newImage.AddImage(sourceImage);
    var outputStream = new MemoryStream();
    newImage.CompressionLevel = 0;
    newImage.Compress = false;
    newImage.Layer = new PdfLayer("converted", page.PdfWriter);
    newImage.WriteImage(outputStream);
    return new PdfStream(outputStream.ToArray());
}
' VB.NET 代码示例
Imports System.IO
Imports iTextSharp.text
Imports iTextSharp.text.pdf

Public Shared Sub ConvertToGrayscale(sourcePath As String, outputPath As String)
    Using reader = New PdfReader(sourcePath)
        Using fileStream = New FileStream(outputPath, FileMode.Create, FileAccess.Write)
            Using stamper = New PdfStamper(reader, fileStream)
                Dim total = reader.NumberOfPages + 1
                For i = 1 To total - 1
                    Dim page = stamper.GetImportedPage(reader, i)
                    Dim newPage = CopyAndConvertToGrayscale(page)
                    stamper.SetPageContent(i, newPage)
                Next
            End Using
        End Using
    End Using
End Sub

Private Shared Function CopyAndConvertToGrayscale(page As PdfImportedPage) As PdfStream
    Dim sourcePdfStream = page.ToPdf(Nothing)
    Dim sourceImage = New Jpeg(sourcePdfStream.GetAsBytes())
    Dim gs = New PdfGrayColorSpace()
    Dim image = Image.GetInstance(sourceImage)
    Dim newImage = Image.GetInstance(image.GetWidth(), image.GetHeight(), 1, 8, gs.GetPdfObject())
    newImage.AddImage(sourceImage)
    Dim outputStream = New MemoryStream()
    newImage.CompressionLevel = 0
    newImage.Compress = False
    newImage.Layer = New PdfLayer("converted", page.PdfWriter)
    newImage.WriteImage(outputStream)
    Return New PdfStream(outputStream.ToArray())
End Function

上述示例代码使用 PdfReader 读取指定 PDF 文件,使用 PdfStamper 创建新的 PDF,对每个页面执行 CopyAndConvertToGrayscale 函数,并将其设置为新的页面内容。CopyAndConvertToGrayscale 函数将指定页面转换为灰度颜色并返回一个 PdfStream 对象,该对象将用于更新新 PDF 中的页面内容。

3. 测试

为了测试这个示例代码,我们需要找到一些彩色的 PDF 文件,将其作为源文件传递给 ConvertToGrayscale 方法并指定输出路径,然后检查生成的灰度 PDF 文件是否符合预期。以下是一个示例测试:

ConvertToGrayscale("color.pdf", "grayscale.pdf");
ConvertToGrayscale("color.pdf", "grayscale.pdf")

这将把名为 "color.pdf" 的彩色 PDF 文件转换为名为 "grayscale.pdf" 的灰度 PDF 文件。

另外,我们可以添加额外的测试用例,以确保代码可以处理多种类型的彩色 PDF 文件。

总结

使用 iTextSharp 库,我们可以轻松实现彩色 PDF 转换为灰度 PDF 的功能。在处理大量彩色 PDF 文件时,这种技术能够有效地节省存储空间并简化文件的管理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#/VB.NET 实现彩色PDF转为灰度PDF - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • 基于C#方法重载的总结详解

    基于C#方法重载的总结详解 在C#中,方法重载(Overloading)允许我们定义多个同名函数,只要它们的参数类型、数量或顺序不同。当我们调用函数时,编译器会根据提供的参数类型、数量和顺序来自动匹配函数。 方法重载的定义和规则 定义方法重载 方法重载需要在同一类中定义,其函数名称必须相同,形参列表不同。形参列表包括参数的数据类型、参数的个数以及参数的排列顺…

    C# 2023年5月15日
    00
  • CommunityToolkit.Mvvm8.1 消息通知(4)

    本系列文章导航 https://www.cnblogs.com/aierong/p/17300066.html https://github.com/aierong/WpfDemo (自我Demo地址)   希望提到的知识对您有所提示,同时欢迎交流和指正 作者:aierong出处:https://www.cnblogs.com/aierong   说明 为了…

    C# 2023年4月22日
    00
  • C#查找对象在ArrayList中出现位置的方法

    Markdown格式说明: 标题使用#号进行标记 代码块使用“`标记开头和结尾 示例说明使用文本加代码块结合的方式 C#查找对象在ArrayList中出现位置的方法 在 C# 中,可以使用 ArrayList 类型来存储一些对象。有时候我们需要查找某个对象在 ArrayList 中出现的位置,这时候可以使用以下方法对 ArrayList 进行搜索: int…

    C# 2023年5月31日
    00
  • C# httpwebrequest访问HTTPS错误处理方法

    下面是关于C# httpwebrequest访问HTTPS错误处理方法的完整攻略。 问题描述 当使用C#中的httpwebrequest请求HTTPS的时候,可能会遇到一些安全策略上的限制,导致请求失败或者返回错误信息。例如,常见的错误信息“Could not establish trust relationship for the SSL/TLS secu…

    C# 2023年5月14日
    00
  • C#加解密之AES算法的实现

    下面就为大家详细讲解“C#加解密之AES算法的实现”的完整攻略。 什么是AES算法 AES(Advanced Encryption Standard),高级加密标准,是一种对称加密算法,是由美国国家标准与技术研究院(NIST)于2001年10月2日发布的一种加密标准,已被广泛应用于各种计算机系统的安全保护之中。 AES算法实现 在C#中,可以通过以下步骤实现…

    C# 2023年6月7日
    00
  • 分享两种实现Winform程序的多语言支持的多种解决方案

    接下来我将详细讲解Winform程序实现多语言支持的多种解决方案。 1. 利用Resx文件实现多语言支持 Resx文件是.NET中专门用于多语言支持的文件格式,可以用来存储不同语言的文本信息,在程序中通过读取Resx文件来实现不同语言的界面显示。 1.1 创建Resx文件 创建Resx文件有多种方式,这里以Visual Studio为例。 在Visual S…

    C# 2023年6月7日
    00
  • 使用Visual Studio创建ASP.NET Web API项目

    1. 创建ASP.NET Web API项目的步骤 以下是使用Visual Studio创建ASP.NET Web API项目的详细步骤: 1.1 打开Visual Studio 首先,我们需要打开Visual Studio IDE。 1.2 新建项目 点击“新建项目”按钮,选择“Web”类别,并在右侧选择“ASP.NET Web 应用程序”。 1.3 选择…

    C# 2023年6月3日
    00
  • ASP.NET Core – 缓存之内存缓存(上)

    1. 缓存 缓存指的是在软件应用运行过程中,将一些数据生成副本直接进行存取,而不是从原始源(数据库,业务逻辑计算等)读取数据,减少生成内容所需的工作,从而显著提高应用的性能和可伸缩性,使用好缓存技术,有利于提高我们提升用户体验性。 对于缓存的使用有以下一些注意点: 缓存最适用于不常更改且生成成本很高的数据。 代码应始终具有回退选项,以提取数据,而不依赖于可用…

    C# 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部