C#使用iText7将多个PDF文档合并为单个文档

  使用HtmlAgilityPack抓取并分析网页内容,然后再调用PuppeteerSharp将网页生成PDF文件,最终的成果如下图所示,得到将近120个pdf文档。能看,但是不方便,需要逐个打开文档才能看到所需的内容,最好能将这些文档合并成单个文档,便于查看与保存。
在这里插入图片描述
  百度"C# 合并pdf文档",最终决定使用IText7,其GitHub主页介绍特点时就提到支持合并PDF文件,如下图所示:
在这里插入图片描述
  新建Winform项目,在Nuget包管理器中搜索并安装iText7,如下图所示。注意这里与iText相关的包有很多个,最初测试时错装了iTextSharp,关键类的名字和用法都差不多,直到编译和调试时才发现包装错了。
在这里插入图片描述

  合并PDF文档最关键的类是PdfDocument和PdfMerger,前者用于打开PDF文档,后者则用于将多个文档合并到指定文档,关键代码如下所示,参照自iText7的GitHub主页示例(参考文献)。

private void button2_Click(object sender, EventArgs e)
{
    PdfDocument pdfDoc = new PdfDocument(new PdfWriter(txtOutputFileName.Text));
    PdfMerger merger = new PdfMerger(pdfDoc);
    merger.SetCloseSourceDocuments(true);

    List<PdfDocument> pdfFiles = GetSourceDocuments();

    foreach (PdfDocument doc in pdfFiles)
    {
        merger.Merge(doc, 1, doc.GetNumberOfPages());
    }

    pdfDoc.Close();

    foreach(PdfDocument doc in pdfFiles)
    {
        doc.Close();
    }
}

private List<PdfDocument> GetSourceDocuments()
{
    List<PdfDocument> list = new List<PdfDocument>();
    foreach(ListViewItem item in listView1.Items)
    {
        list.Add(new PdfDocument(new PdfReader(item.Tag.ToString())));
    }

    return list;
}

  实际运行过程中还出现如下错误,百度错误信息找到参考文献5,原因是漏装了itext7.bouncy-castle-adapter包,安装后即可正常运行程序。

InnerException	{"Either com.itextpdf:bouncy-castle-adapter or
com.itextpdf:bouncy-castle-fips-adapter 
dependency must be added in order to use BouncyCastleFactoryCreator"}	
System.Exception {System.NotSupportedException}

在这里插入图片描述
在这里插入图片描述
  最后是程序运行效果及合并后的文档效果,如下图所示:

在这里插入图片描述在这里插入图片描述

  还存在很多不足之处,比如没有书签,从八百多页中查找内容并跳转到指定内容处不方便,后续还会学习iText7的用法,完善合并PDF文档功能。

参考文献:
[1]https://itextpdf.com/
[2]https://github.com/itext/itext-dotnet
[3]https://blog.csdn.net/qq_38628970/article/details/135478244
[4]https://github.com/itext/itext-publications-samples-dotnet/blob/master/itext/itext.samples/itext/samples/sandbox/merge/PdfDenseMergeExample.cs
[5]https://blog.csdn.net/rebecca_cao/article/details/135185043

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ps:绘画对称功能

Photoshop 中的绘画对称 Paint Symmetry功能允许用户在画布上创建对称的绘画和设计&#xff0c;极大地提高了创作的效率和准确性&#xff0c;尤其适合于制作复杂的对称图形和图案。 可在使用画笔工具、铅笔工具或橡皮擦工具时启用“绘画对称"功能。 提示&#xff1a; 绘画…

【IO流系列】ObjectStream 序列化流与反序列化流

序列化流与反序列化流 1. 概述2. 作用3. 序列化流&#xff08;对象操作字节输出流&#xff09;3.1 构造方法3.2 成员方法3.3 代码示例 4. 反序列化流&#xff08;对象操作字节输入流&#xff09;4.1 构造方法4.2 成员方法4.3 代码示例 5. 细节6. 练习6.1 练习1&#xff1a;用对…

看待事物的层与次 | DBA与架构的一次对话交流

前言 在计算机软件业生涯中,想必行内人或多或少都能感受到系统架构设计与数据库系统工程的重要性,也能够清晰地认识到在计算机软件行业中技术工程师这个职业所需要的专业素养和必备技能! 背景 通过自研的数据库监控管理工具,发现 SQL Server 数据库连接数在1-2K之间,想…

【git】入门

当我们设计文档时&#xff0c;我们会不断的修改文档&#xff0c;而设计的文档通过第一次修改&#xff0c;第二次修改&#xff0c;很难讲每次修改的版本维护起来&#xff0c;每个版本可以分为v1,v2 ,v3,v4如果需要哪个版本&#xff0c;我们可以直接查看。 随着版本的不断增多&am…

当大语言模型遇到AI绘画-google gemma与stable diffusion webui融合方法-矿卡40hx的AI一体机

你有想过建一台主机&#xff0c;又能AI聊天又能AI绘画&#xff0c;还可以直接把聊天内容直接画出来的机器吗&#xff1f; 当Google最新的大语言模型Gemma碰到stable diffusion webui会怎么样&#xff1f; 首先我们安装stable diffusion webui(automatic1111开源项目&#xff…

群晖NAS配置WebDav结合内网穿透实现公网访问本地影视资源

文章目录 本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是&#xff1a;1 使用环境要求&#xff1a;2 配置webdav3 测试局域网使用potplayer访问webdav3 内网穿透&#xff0c;映射至公网4 使用固定地址在potplayer访问webdav ​ 国内流媒体平台的内…

贪心算法(算法竞赛、蓝桥杯)--修理牛棚

1、B站视频链接&#xff1a;A27 贪心算法 P1209 [USACO1.3] 修理牛棚_哔哩哔哩_bilibili 题目链接&#xff1a;[USACO1.3] 修理牛棚 Barn Repair - 洛谷 #include <bits/stdc.h> using namespace std; const int N205; int m,s,c,ans; int a[N];//牛的位置标号 int d[N…

opencv--使用直方图找谷底进行确定分割阈值

直方图原理就不说了&#xff0c;大家自行百度 直方图可以帮助分析图像中的灰度变化&#xff0c;进而帮助确定最优二值化的灰度阈值&#xff08;threshold level&#xff09;。如果物体与背景的灰度值对比明显&#xff0c;此时灰度直方图就会包含双峰&#xff08;bimodal histo…

【golang】25、图片操作

用 “github.com/fogleman/gg” 可以画线, 框 用 “github.com/disintegration/imaging” 可以变换颜色 一、渲染 1.1 框和字 import "github.com/fogleman/gg"func DrawRectangles(inPath string, cRects []ColorTextRect, fnImgNameChange FnImgNameChange) (st…

C# 获取类型 Type.GetType()

背景 C#是强类型语言&#xff0c;任何对象都有Type&#xff0c;有时候需要使用Type来进行反射、序列化、筛选等&#xff0c;获取Type有Type.GetType, typeof()&#xff0c;object.GetType() 等方法&#xff0c;本文重点介绍Type.GetType()。 系统类型/本程序集内的类型 对于系…

【k8s配置与存储--配置管理】

1、ConfigMap的配置 1.1 ConfigMap介绍 ConfigMap 是一种 API 对象&#xff0c;用来将非机密性的数据保存到键值对中。使用时&#xff0c; Pod 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。 ConfigMap 将你的环境配置信息和容器镜像解耦&#xff0c;便于应用配…

蓝牙耳机和笔记本电脑配对连接上了,播放设备里没有显示蓝牙耳机这个设备,选不了输出设备

环境&#xff1a; WIN10 杂牌蓝牙耳机6s 问题描述&#xff1a; 蓝牙耳机和笔记本电脑配对连接上了&#xff0c;播放设备里没有显示蓝牙耳机这个设备&#xff0c;选不了输出设备 解决方案&#xff1a; 1.打开设备和打印机&#xff0c;找到这个设备 2.选中这个设备&#…

Linux下gcc编译常用命令详解

在Linux环境下&#xff0c;使用gcc编译器进行源代码的编译是程序员日常工作的一部分。本篇将介绍一些常用的gcc编译命令&#xff0c;帮助开发者更好地理解和使用这些命令。 1. 基本编译命令 gcc工作流程&#xff1a; 编译单个源文件 gcc source.c -o output这个命令将sour…

java学习笔记-初级

一、变量 1.双标签 <!-- 外部js script 双标签 --><script srcmy.js></script> 在新文件my.js里面写&#xff1a; 2.字符串定义&#xff1a; //外单内双var str 我是一个"高富帅"的程序员;console.log(str);// 字符串转义字符 都是用 \ 开头 …

Jenkins自动化部署之流水线模式部署

文章目录 任务类型Pipeline流水线项目声明式的Pipeline脚本式Pipeline 示例脚本生成Tools配置示例 高级Pipeline Script from SCM 任务类型 在Jenkins中&#xff0c;有不同类型的任务&#xff08;项目&#xff09;适用于不同的构建需求。以下是一些常见的Jenkins任务类型&…

供应链投毒预警 | 恶意NPM包利用Windows反向shell后门攻击开发者

概述 本周&#xff08;2024年02月19号&#xff09;&#xff0c;悬镜供应链安全情报中心在NPM官方仓库&#xff08;https://npmjs.com&#xff09;中发现多起NPM组件包投毒事件。攻击者利用包名错误拼写方式 (typo-squatting)在NPM仓库中连续发布9个不同版本的恶意包&#xff0…

ubuntu20.04 ROS-Noetic 配置qtcreator的ROS环境

文章目录 1 安装qtcreator1.1 下载安装Qt1.2 配置命令启动qtcreator2 配置ROS2.1 直接安装qtcreator-ros2.2 在qtcreator上安装ros_qtc_plugin插件3 注意3.1 构建套件3.2 更新、删除qt4 参考链接1 安装qtcreator QT官网:Qt Downloads 下载包链接:qt5.12.12 Qt5.12.12默认qtc…

SpringBoot使用classfinal-maven-plugin插件加密Jar包

jar包加密 1、在启动类的pom.xml中加入classfinal-maven-plugin插件 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><…

官网万词霸屏推广+关键词排名优化源码系统 带完整的安装代码包以及搭建教程

随着搜索引擎算法的不断更新和市场竞争的加剧&#xff0c;传统的SEO方法已经难以满足企业对于快速、高效推广的需求。罗峰结合多年的互联网营销经验和最新的搜索引擎优化技术&#xff0c;给大家推荐一款集网站搭建、关键词优化、数据分析于一体的源码系统。 以下是部分代码示例…

Linux信号【产生-保存-处理】

目录 前言&#xff1a; 1、进程信号基本概念 1.1、什么是信号&#xff1f; 1.2、信号的作用 2、键盘键入 2.1、ctrlc 终止前台进程 2.1.1、signal 注册执行动作 3、系统调用 3.1、kill 函数 3.2、模拟实现 myKill 3.3、raise 函数 3.4、abort 函数 4、软件条件信号…