Spire.PDF for .NET【文档操作】演示:查找并删除 PDF 中的空白页

news2024/9/23 22:36:55

PDF 中的空白页并不罕见,因为它们可能是作者故意留下的或在操作文档时意外添加的。当您阅读或打印文档时,这些空白页可能会很烦人,因此可能非常有必要将其删除。在本文中,您将了解如何使用Spire.PDF for .NET以编程方式查找和删除 PDF 文档中的空白页。

Spire.PDF for .NET 是一款独立 PDF 控件,用于 .NET 程序中创建、编辑和操作 PDF 文档。使用 Spire.PDF 类库,开发人员可以新建一个 PDF 文档或者对现有的 PDF 文档进行处理,且无需安装 Adobe Acrobat。

E-iceblue 功能类库Spire 系列文档处理组件均由中国本土团队研发,不依赖第三方软件,不受其他国家的技术或法律法规限制,同时适配国产操作系统如中科方德、中标麒麟等,兼容国产文档处理软件 WPS(如 .wps/.et/.dps 等格式(qun:767755948 )

Spire.PDF for.net下载   Spire.PDF for java下载

安装适用于 .NET 的 Spire.PDF

首先,您需要将 Spire.PDF for .NET 包中包含的 DLL 文件添加为 .NET 项目中的引用。DLL 文件可以从此链接下载或通过NuGet安装。

PM> Install-Package Spire.PDF
查找并删除 PDF 文档中的空白页

Spire.PDF for .NET 提供了方法PdfPageBase.IsBlank()来检测 PDF 页面是否绝对空白。但有些看起来空白的页面实际上包含白色图像,使用PdfPageBase.IsBlank()方法不会将这些页面视为空白。因此,有必要创建一个自定义方法IsImageBlank()与PdfPageBase.IsBlank()方法结合使用来检测这些白色但非空白的页面。

注意:此解决方案会将 PDF 页面转换为图像并检测图像是否为空白。需要申请许可证才能删除转换图像中的评估消息。否则,该方法将无法正常工作。如果您没有许可证,请联系sales@e-iceblue.com获取临时许可证以进行评估。

详细步骤如下:

  • 创建一个PdfDocument实例。
  • 使用PdfDocument.LoadFromFile()方法加载 PDF 文档。
  • 使用PdfPageBase.IsBlank()方法循环遍历 PDF 文档中的页面以检测页面是否为空白。
  • 对于绝对空白的页面,请使用PdfDocument.Pages.RemoveAt()方法删除它们。
  • 对于并非绝对空白的页面,请使用PdfDocument.SaveAsImage()方法将其保存为图像。然后使用自定义方法IsImageBlank()检测转换后的图像是否为空白,并使用PdfDocument.Pages.RemoveAt()方法删除“空白”页面。
  • 使用PdfDocument.SaveToFile()方法保存结果文档。

[C#]

using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;

namespace DeleteBlankPage
{
class Program
{
static void Main(string[] args)
{
//Apply license by license key
Spire.License.LicenseProvider.SetLicenseKey("your license key");

//Create a PdfDocument instance
PdfDocument document = new PdfDocument();

//Load a sample PDF document
document.LoadFromFile("input.pdf");

//Loop through all pages in the PDF
for (int i = document.Pages.Count - 1; i >= 0; i--)
{
//Detect if a page is blank
if (document.Pages[i].IsBlank())
{
//Remove the absolutely blank page
document.Pages.RemoveAt(i);
}
else
{
//Save PDF page as image
Image image = document.SaveAsImage(i, PdfImageType.Bitmap);

//Detect if the converted image is blank
if (IsImageBlank(image))
{
//Remove the page
document.Pages.RemoveAt(i);
}
}
}

//Save the result document
document.SaveToFile("RemoveBlankPage.pdf", FileFormat.PDF);
}

//Detect if an image is blank
public static bool IsImageBlank(Image image)
{
Bitmap bitmap = new Bitmap(image);
for (int i = 0; i < bitmap.Width; i++)
{
for (int j = 0; j < bitmap.Height; j++)
{
Color pixel = bitmap.GetPixel(i, j);
if (pixel.R < 240 || pixel.G < 240 || pixel.B < 240)
{
return false;
}
}
}
return true;
}
}
}

【VB.NET】

Imports Spire.Pdf
Imports Spire.Pdf.Graphics

Namespace DeleteBlankPage
Class Program
Private Shared Sub Main(ByVal args() As String)
'Apply license by license key
Spire.License.LicenseProvider.SetLicenseKey("your license key")

'Create a PdfDocument instance
Dim document As PdfDocument = New PdfDocument

'Load a sample PDF document
document.LoadFromFile("input.pdf")

'Loop through all pages in the PDF
Dim i As Integer = (document.Pages.Count - 1)
Do While (i >= 0)

'Detect if a page is blank
If document.Pages(i).IsBlank Then

'Remove the absolutely blank page
document.Pages.RemoveAt(i)
Else

'Save PDF page as image
Dim image As Image = document.SaveAsImage(i, PdfImageType.Bitmap)

'Detect if the converted image is blank
If Program.IsImageBlank(image) Then

'Remove the page
document.Pages.RemoveAt(i)
End If

End If

i = (i - 1)
Loop

'Save the result document
document.SaveToFile("RemoveBlankPage.pdf", FileFormat.PDF)
End Sub

'Detect if an image is blank
Public Shared Function IsImageBlank(ByVal image As Image) As Boolean
Dim bitmap As Bitmap = New Bitmap(image)
Dim i As Integer = 0
Do While (i < bitmap.Width)
Dim j As Integer = 0
Do While (j < bitmap.Height)
Dim pixel As Color = bitmap.GetPixel(i, j)
If ((pixel.R < 240) _
OrElse ((pixel.G < 240) _
OrElse (pixel.B < 240))) Then
Return False
End If

j = (j + 1)
Loop

i = (i + 1)
Loop

Return True
End Function
End Class
End Namespace

C#/VB.NET:查找并删除 PDF 中的空白页

以上便是如何查找并删除 PDF 中的空白页,如果您有其他问题也可以继续浏览本系列文章,获取相关教程~

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

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

相关文章

Docker创建mysql容器本地版

1.下载docker desktop https://www.docker.com/products/docker-desktop/ 2. 创建容器 docker run 创建并启动mysql容器 --name 容器名字 -d 后台运行容器 -p 映射端口 -e 参数 截至目前最新的mysql是mysql8.0.36 那就整这个试下。 docker run -d --name mysql-cont…

【笔记】深入理解JVM机制

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 JVM 运⾏流程图 JVM 中内存区域划分 方法区 / 元数据区 堆 栈 程序计数器 本地方法栈 内存区域总结 JVM 中类加载过程 …

flask_restful渲染模版

渲染模版就是在 Flask_RESTful 的类视图中要返回 html 片段代码&#xff0c;或 者是整个html 文件代码。 如何需要浏览器渲染模板内容应该使用 api.representation 这个装饰器来定 义一个函数&#xff0c; 在这个函数中&#xff0c;应该对 html 代码进行一个封装&#xff…

【Java程序设计】【C00368】基于(JavaWeb)Springboot的箱包存储系统(有论文)

TOC 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;博客中有上百套程序可供参考&#xff0c;欢迎共同交流学习。 项目简介 项目获取 &#x1f345;文末点击卡片…

编译u-boot(硬件: atk-dl6y2c)和NFS/EMMC模式启动Linux Kernel

目录 概述 1 编译u-boot 1.1 解压文件 1.2 编译u-boot 2 配置环境 2.1 在Ubunt 搭建TFTP 2.2 建立下载目录 3 烧写bootloader到SD 4 使用NFS模式启动板卡 5 从EMMC 启动 Linux 系统 5.1 通过配置参数方式 5.2 使用命令直接启动内核 文中使用的代码下载地址&#xf…

MySQL 8.x 高可用集群之MGR(组复制)

MySQL 8.x 高可用集群之MGR&#xff08;组复制&#xff09; 前言一、集群部署1.1 修改主机名和关闭selinux1.2 MySQL安装1.2.1 **移除Linux自带安装的mariadb数据库**1.2.2 下载安装文件1.2.3 顺序执行安装1.2.4 启动mysql并修改密码1.2.5 开启防火墙端口允许访问 1.3 修改mysq…

模仿羊羊~消消乐

慎玩&#xff01;随机生成、不保证能消完哦&#xff01; 游戏试玩&#xff1a; 链接: https://pan.baidu.com/s/1IwtOd__8Ca0bSouMP8kEzw 提取码: 6yhd

[深度学习]yolov8+pyqt5搭建精美界面GUI设计源码实现五

【简单介绍】 依托先进的目标检测算法YOLOv8与灵活的PyQt5界面开发框架&#xff0c;我们倾力打造出了一款集直观、易用与功能强大于一体的目标检测GUI界面软件。通过深度融合YOLOv8在目标识别领域的出色性能与PyQt5的精美界面设计&#xff0c;我们成功推出了一款高效且稳定的软…

【Web】浅聊Jackson序列化getter的利用——POJONode

目录 核心速览 原理分析 EXP TemplatesImpl利用 SignedObject利用 核心速览 writeValueAsString是jackson序列化自带的入口&#xff0c;在调用该方法的过程中将会通过遍历的方法将bean对象中的所有的属性的getter方法进行调用 下面介绍如下利用链&#xff1a; BadAttrib…

python3游戏GUI--开心打地鼠游戏By:PyQt5(附下载地址)

文章目录 一&#xff0e;前言二&#xff0e;游戏预览1.启动2.开始游戏3.游戏结束4.排行榜 三&#xff0e;游戏思路四&#xff0e;总结 一&#xff0e;前言 第一次用PyQt做游戏&#xff0c;有点小紧张呢。本次使用PyQt5制作一款简单的打地鼠游戏&#xff0c;支持基本游戏玩法、…

IO网络通信

IO Bio&#xff1a; 同步阻塞&#xff0c;一个线程一次连接&#xff0c;基于字符流/字节流 Nio&#xff1a;同步非阻塞 一个线程多个连接&#xff0c;多个请求注册到多路复用selector上&#xff0c;多路复用器轮训连接 面向缓冲区&#xff0c; 从某通道读取数据到缓存区&…

详解Python面向对象编程(一)

类和对象 面向过程——怎么做&#xff1f; &#xff08;1&#xff09;把完成某一需求的所有步骤、从头到尾&#xff0c;逐步实现 &#xff08;2&#xff09;根据开发需求&#xff0c;将某些功能独立的代码块封装成一个又一个的函数 &#xff08;3&#xff09;最后完成的代码&a…

csdn最全面的网安面试题汇总——小白篇

防范常见的 Web 攻击 什么是 SQL 注入攻击 攻击者在 HTTP 请求中注入恶意的 SQL 代码&#xff0c;服务器使用参数构建数据库 SQL 命令时&#xff0c;恶意SQL 被一起构造&#xff0c;并在数据库中执行。 用户登录&#xff0c;输入用户名 lianggzone&#xff0c;密码 ‘ or ‘…

程序员如何兼职赚小钱?

程序员由于有技术和手艺其实兼职赚钱的路子还是挺多的&#xff0c;只要你有足够的时间。 1. 做外包 这是比较传统的方式&#xff0c;甲方在一些众包平台上发布开发任务&#xff0c;你可以抢这个任务&#xff0c;但是价格都比较便宜。 任务比较多的平台: 猪八戒、一品威客、开…

【Java】哈希表

文章目录 一、概念二、哈希冲突2.1概念2.2设计合理的哈希函数-避免冲突2.3调节负载因子-避免冲突2.4闭散列-冲突解决&#xff08;了解&#xff09;2.5开散列/哈希桶-冲突解决&#xff08;重点掌握&#xff09; 三、代码实现3.1成员变量及方法的设定3.2插入3.3重新哈希3.4 获取到…

面试题-Elasticsearch集群架构和调优手段(超全面)

对于Elasticsearch&#xff08;ES&#xff09;&#xff0c;我了解并有经验。在我之前的公司&#xff0c;我们有一个相对大型的ES集群&#xff0c;以下是该集群的架构和一些调优手段的概述&#xff1a; 1. 集群架构 集群规模&#xff1a;我们的ES集群由15个节点组成&#xff0c…

ICC2:postmask ECO参考脚本

更多学习内容请关注「拾陆楼」知识星球 拾陆楼知识星球入口 eco_netlist -by_verilog_file eco.v -write_changes eco.tcl set_app_options -name design.eco_freeze_silocon_mode -value true source eco tcl set_app_options -name design.eco_freeze_silocon_mode -valu…

C++ 3.25作业

1、定义自己的命名空间&#xff0c;其中有string类型的变量&#xff0c;再定义两个函数&#xff0c;一个函数完成字符串的输入&#xff0c;一个函数完成求字符串长度&#xff0c;再定义一个全局函数完成对该字符串的反转 #include <iostream>using namespace std;namesp…

vite+vue3动态模块化导入并使用pinia

一、安装引入pinia 1.安装 pnpm install pinia # 或者使用 yarn yarn add pinia # 或者使用 npm npm install pinia 2.在main.js里引入 import { createApp } from vue import App from ./App.vue import { createPinia } from pinia createApp(App).use(createPinia()).mo…

【linux网络(一)】初识网络, 理解四层网络模型

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux网络 1. 前言2. 初识网络…