PDF生成:全面解析,C# 如何使用iTextSharp库(或其他类似库)生成PDF文档,包括如何将位图图像嵌入PDF中。
一、概述
PDF(Portable Document Format)是一种广泛使用的文档格式,由Adobe公司在1993年推出。PDF的目标是能够在任何设备上呈现固定格式的文档,无论是在不同的操作系统、硬件设备,还是在打印时,都能保证文档的外观和排版一致。
PDF格式支持文本、图像、超链接、表单字段、嵌入式字体、图形、音频、视频等多种元素,广泛应用于电子文档交换、打印、报告生成等多种场景。
二、PDF历史背景
在1980年代,许多软件公司试图开发跨平台的文档格式。Adobe最初提出了PostScript(1982年)来解决这一问题,它是一个描述页面的语言,专门用于打印设备。然而,PostScript需要较高的硬件支持,且使用起来较为复杂,无法满足普通用户的需求。
因此,Adobe于1993年推出了PDF格式,它提供了更为简洁、易用的跨平台文档交换标准。与PostScript不同,PDF能够在各种平台上查看并保证文档格式的稳定性,无论是Windows、MacOS、Linux等操作系统,还是手机和其他设备,PDF文件的格式都能够保持一致。
PDF的流行程度逐年攀升,成为文档交换、归档及电子出版的标准格式之一。
三、C#中如何生成PDF
在C#中生成PDF文件,常用的工具是第三方库。最常见的有 iTextSharp 和 PdfSharp。这些库简化了PDF文档的创建和操作过程,支持添加文本、图像、表格、链接等多种功能。
四、iTextSharp库概述
iTextSharp 是一个功能强大的PDF操作库,最初是用Java开发的,后被移植到C#平台(命名为iTextSharp)。它可以帮助开发者创建、修改和处理PDF文档。iTextSharp的一个优势是其高度的灵活性,能够生成结构化的PDF文档、添加动态内容(如文本、图像、表格、链接等),并支持PDF文档的加密、签名和水印等功能。
4.1 安装 iTextSharp
在C#项目中,使用NuGet包管理器来安装 iTextSharp 库:
打开 Visual Studio,右键点击项目选择“管理NuGet程序包”。
搜索 iTextSharp。
安装最新版本。
Install-Package itext7
iTextSharp 7 是该库的最新版本,提供了更多的功能和优化。
4.2 创建简单的PDF
使用 iTextSharp 创建一个简单的PDF文档,示例如下:
using System;
using System.IO;
using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Element;public class CreatePdfExample
{public static void Main(){string pdfPath = "example.pdf";// 创建 PDF 文档using (PdfWriter writer = new PdfWriter(pdfPath)){using (PdfDocument pdf = new PdfDocument(writer)){Document document = new Document(pdf);// 添加文本内容document.Add(new Paragraph("Hello, World!"));}}Console.WriteLine("PDF created successfully!");}
}
此代码段创建了一个包含“Hello, World!”文本的简单PDF文件。
4.3 向PDF中添加图像
可以使用 iTextSharp 库将位图图像嵌入到PDF文档中。下面是如何向PDF添加图像的示例:
using System;
using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Element;
using iText.IO.Image;public class AddImageToPdf
{public static void Main(){string pdfPath = "image_example.pdf";// 创建 PDF 文档using (PdfWriter writer = new PdfWriter(pdfPath)){using (PdfDocument pdf = new PdfDocument(writer)){Document document = new Document(pdf);// 加载并添加图像Image img = new Image(ImageDataFactory.Create("path_to_image.jpg"));document.Add(img);}}Console.WriteLine("PDF with image created successfully!");}
}
在这个示例中,我们首先用 ImageDataFactory.Create() 方法加载图像文件,之后将图像添加到PDF文档中。
五、进阶功能:使用iTextSharp实现更多操作
iTextSharp 提供了丰富的功能,不仅限于文本和图片的添加。以下是一些常见的功能介绍:
5.1 添加表格
using iText.Layout.Element;public class AddTableToPdf
{public static void Main(){string pdfPath = "table_example.pdf";using (PdfWriter writer = new PdfWriter(pdfPath)){using (PdfDocument pdf = new PdfDocument(writer)){Document document = new Document(pdf);// 创建表格(2列,3行)Table table = new Table(2);table.AddCell("Name");table.AddCell("Age");table.AddCell("John");table.AddCell("30");table.AddCell("Alice");table.AddCell("28");// 添加表格到文档document.Add(table);}}Console.WriteLine("PDF with table created successfully!");}
}
5.2 设置页面大小与边距
using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Element;public class SetPageSize
{public static void Main(){string pdfPath = "page_size_example.pdf";using (PdfWriter writer = new PdfWriter(pdfPath)){using (PdfDocument pdf = new PdfDocument(writer)){Document document = new Document(pdf);document.SetMargins(50, 50, 50, 50); // 设置边距// 添加文本document.Add(new Paragraph("This PDF has custom margins!"));}}Console.WriteLine("PDF with custom margins created successfully!");}
}
5.3 添加超链接
using iText.Layout.Element;public class AddHyperlinkToPdf
{public static void Main(){string pdfPath = "hyperlink_example.pdf";using (PdfWriter writer = new PdfWriter(pdfPath)){using (PdfDocument pdf = new PdfDocument(writer)){Document document = new Document(pdf);// 创建超链接Hyperlink link = new Hyperlink("Click here to visit Google", "https://www.google.com");document.Add(link);}}Console.WriteLine("PDF with hyperlink created successfully!");}
}
六、其他常用PDF操作
除了创建PDF,iTextSharp还支持PDF的以下常见操作:
- 修改现有PDF:可以打开现有的PDF文件,编辑内容或添加新的元素(如文本、图像、表格等)。
- 合并和拆分PDF:可以将多个PDF文件合并为一个,或将一个PDF拆分成多个文件。
- 加密和解密:iTextSharp支持PDF的加密,使用密码保护PDF内容,防止未经授权的访问。
- 数字签名:可以向PDF文件添加数字签名,确保文档的真实性和完整性。
- 提取内容:iTextSharp可以提取PDF文档中的文本和图像,进行后续处理。
七、总结
通过使用 iTextSharp(或者类似的PDF库),开发者可以在C#中轻松创建、修改和处理PDF文档。iTextSharp不仅提供了丰富的功能来生成复杂的PDF文件(如嵌入文本、图像、表格、超链接等),还支持PDF的加密、签名和内容提取等高级操作。
无论是生成发票、报告、电子书,还是设计自动化文档处理系统,iTextSharp 都是一个强大而灵活的工具。
相关文章:
PDF生成:全面解析,C# 如何使用iTextSharp库(或其他类似库)生成PDF文档,包括如何将位图图像嵌入PDF中。
一、概述 PDF(Portable Document Format)是一种广泛使用的文档格式,由Adobe公司在1993年推出。PDF的目标是能够在任何设备上呈现固定格式的文档,无论是在不同的操作系统、硬件设备,还是在打印时,都能保证文…...
如何选择最适合的消息队列?详解 Kafka、RocketMQ、RabbitMQ 的使用场景
引言 在日常开发中,消息队列已经成为业务场景中几乎不可或缺的一部分。无论是订单系统、日志收集、分布式事务,还是大数据实时流处理,消息队列都在支撑着这些关键环节。目前市面上常用的消息队列有三种(ActiveMQ 虽然在企业集成中仍有应用&a…...
gitlab项目如何修改主分支main为master,以及可能遇到的问题
如果你希望将 Git 仓库的主分支名称从 main 修改为 master: 1. 本地修改分支名称 首先,切换到 main 分支: git checkout main将 main 分支重命名为 master: git branch -m main master2. 更新远程仓库 将本地更改推送到远程仓库…...
RRF(Reciprocal Rank Fusion,倒数排序融合)
RRF(Reciprocal Rank Fusion,倒数排序融合) 摘要 倒数排序融合 RRF 是一种简单的方法,用于结合多个 IR(Information Retrieval) 系统的文档排名,始终比任何单独的系统产生更好的结果。 通过使用 RRF 来结合几个TREC实验的结果,并建立一个 …...
移动开发(七):.NET MAUI使用RESTAPI实现查询天气笔记
目录 一、接口准备 二、实体部分 三、页面部分 四、后台代码逻辑 五、总结 在移动开发过程中,第三方对接是非常常见的。今天给大家分享.NET MAUI如何使用REST API实现输入城市名称查询天气的示例,希望对大家学习.NET MAUI可以提供一些帮助! 一、接口准备 首先我们需要…...
企业数据无缝对接:从旺店通到金蝶云的入库单管理案例
【类型:盘盈入库】旺店通-入库单管理>金蝶-其他入库单 在企业的日常运营中,数据的高效集成和准确传递是确保业务顺畅运行的关键。本文将分享一个实际案例,展示如何通过轻易云数据集成平台,将旺店通企业奇门的数据无缝对接到金蝶云星空&am…...
青少年编程与数学 02-003 Go语言网络编程 19课题、Go语言Restful编程
青少年编程与数学 02-003 Go语言网络编程 19课题、Go语言Restful编程 课题摘要:一、微服务微服务的主要特点包括:微服务架构的挑战:微服务的应用场景: 二、RESTfulRESTful的核心原则和特征包括:RESTful API的优势:REST…...
系统架构设计师论文:论区块链技术及应用
试题三 论区块链技术及应用 区块链作为一种分布式记账技术,目前已经被应用到了资产管理、物联网、医疗管理、政务监管等多个领域。从网络层面来讲,区块链是一个对等网络(Peer to Peer, P2P),网络中的节点地位对等,每个节点都保存完整的账本数据,系统的运行不依赖中心化节…...
放电电阻是什么
放电电阻,顾名思义,就是用于放电的电阻。在电路中,当电流突然增大时,如果没有适当的电阻来限制电流,就可能导致电路损坏。因此,放电电阻的作用就是在电路中起到限制电流的作用,防止电路因电流过…...
项目模块十七:HttpServer模块
一、项目模块设计思路 目的:实现HTTP服务器搭建 思想:设计请求路由表,记录请求方法与对应业务的处理函数映射关系。用户实现请求方法和处理函数添加到路由表,服务器只接受请求并调用用户的处理函数即可。 处理流程: …...
Spire.PDF for .NET【页面设置】演示:获取 PDF 文件中的页数
计算 PDF 文件中的页数对于各种目的都至关重要,例如确定文档长度、组织内容和评估打印要求。除了使用 PDF 查看器了解页数信息外,您还可以通过编程自动执行该任务。在本文中,您将学习如何使用C#通过Spire.PDF for .NET获取 PDF 文件中的页数。…...
火语言RPA流程组件介绍--点击软件元素
🚩【组件功能】:点击软件UI窗口上的某个元素 配置预览 配置说明 操作目标 支持T或# 从 元素库 中选择一个已捕获的元素或通过 捕获新元素 来捕获新的窗口元素作为操作目标。获取元素方式见 桌面对象元素库使用方法。 模拟人工点击 模拟人工的方式触…...
c++程序设计速学笔记2基础数据结构
基础数据结构 数组(Array) 数组是一种线性数据结构,它存储相同类型的元素的连续内存块。数组的每个元素都有一个索引,用于快速访问和操作数据。 特点: 随机访问:数组支持通过索引快速访问元素。固定大小…...
搜维尔科技:SenseGlove案例-利用VR触觉技术培训机组人员
SenseGlove案例-利用VR触觉技术培训机组人员 搜维尔科技:SenseGlove案例-利用VR触觉技术培训机组人员...
OpenCV视觉分析之目标跟踪(10)估计两个点集之间的刚性变换函数estimateRigidTransform的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 计算两个2D点集之间的最优仿射变换 estimateRigidTransform 是 OpenCV 中的一个函数,用于估计两个点集之间的刚性变换(即…...
Python 虚拟环境创建
1. 创建python虚拟环境 conda create -n env_name pythonversionex:conda create -n train_ticket_venv python3.112. 查看安装包信息 pip show package_nameex: pip show numpy3. 用清华源安装软件包 pip install package_name -i https://mirrors.tuna.tsinghua.edu.cn/pyp…...
STL-list容器的使用
在C标准库中,std::list 是一个双向链表容器,提供高效的插入和删除操作,尤其适用于需要频繁在容器中间进行插入和删除元素的场景。与其他序列容器(如 std::vector 和 std::deque)相比,std::list 有其独特的优…...
java中线程与集合的面试题
在 Java 面试中,线程和集合相关的知识是非常常见的考察点。以下是几个典型的问题及答案: 线程相关面试题 什么是线程? 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个进程可以有多…...
第十五章 IRIS 进程之间的通信
文章目录 第十五章 IRIS 进程之间的通信介绍指定作业间通信设备的内存缓冲区禁用作业间通信缓冲区 作业间通信设备编号设备编号 IJC 设备的 I/O 命令OPEN命令device 设备timeout 暂停 第十五章 IRIS 进程之间的通信 本页介绍如何在两个或多个 IRIS 数据平台进程之间建立通信。…...
设计者模式之策略模式
前言 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都写在对象中,将会使对象变得异常复杂;而且有时候支持不频繁使用的算法也是一个性能负担。 如何在运行时根据需要透明地更改对象的算…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
