操作PDF的方法
PDF操作:
- 旋转
- 删除
- 合并
- 拆分
- 转成图片
- 导出内嵌资源图片
- 两页合并成一页
- 添加、去除密码
- 添加水印
PDF旋转某一页
var document = pdfViewer1.Document;
int page = pdfViewer1.Renderer.Page;
//判断pdf旋转方向
var rotate = (int)document.GetRotation(page);
if (rotate < 3)
rotate++;
else
rotate = 0;
pdfViewer1.Document = null;
//向下一个方向旋转
document.RotatePage(page, (PdfRotation)rotate);
var memoryStream = new MemoryStream();
document.Save(memoryStream);
pdfViewer1.Document = PdfDocument.Load(this, memoryStream);
pdfViewer1.Renderer.Page = page;
//如需要保存
//document.Save(路径);
PDF删除某一页
int page = pdfViewer1.Renderer.Page;
pdfViewer1.Document.DeletePage(page);
pdf合并 如需保存请直接保存文件
var file = "";
using (var form = new OpenFileDialog())
{
form.Filter = "PDF Files (*.pdf)|*.pdf|All Files (*.*)|*.*";
form.RestoreDirectory = true;
form.Title = "Open PDF File"; if (form.ShowDialog(this) != DialogResult.OK)
{
Dispose();
return;
}
file = form.FileName;
}
var document = pdfViewer1.Document;
var doc = PdfSupport.MergePDF(document, OpenDocument(file));
{
if (doc != null)
{
pdfViewer1.Document = null;
pdfViewer1.Document = doc;
}
}
//打开pdf
private PdfDocument OpenDocument(string fileName)
{
try
{ // Remove ReadOnly attribute from the copy.
File.SetAttributes(fileName, File.GetAttributes(fileName) & ~FileAttributes.ReadOnly);
return PdfDocument.Load(this, new MemoryStream(File.ReadAllBytes(fileName)));
}
catch (Exception ex)
{
MessageBox.Show(this, ex.Message, Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
return null;
}
}
拆分PDF,拆分PDF支持指定拆分
var path = Path.Combine(Path.GetDirectoryName(fileName), Path.GetFileNameWithoutExtension(fileName));
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
var document = pdfViewer1.Document;
{
for (int i = 0; i < document.PageCount; i++)
{
var filePath = Path.Combine(path, $"{i}.pdf");
///eg. "1,1,1,1" 4个1页
/// "1-3" 第1页到第3页
/// "1,3" 第1页、第3页
using (var doc = PdfSupport.GetPDFPage(document, i + 1))
{
doc.Save(filePath);
}
}
}
PDF转成图片
var document = pdfViewer1.Document;
var path = Path.Combine(Path.GetDirectoryName(fileName), Path.GetFileNameWithoutExtension(fileName));
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
var dpiX = 96 * 2;
var dpiY = 96 * 2;
for (int i = 0; i < document.PageCount; i++)
{
using (var image = document.Render(i, (int)document.PageSizes[i].Width * 4 / 3, (int)document.PageSizes[i].Height * 4 / 3, dpiX, dpiY, PdfRotation.Rotate0, PdfRenderFlags.Annotations | PdfRenderFlags.CorrectFromDpi))
{
image.Save(Path.Combine(path, i + ".png"));
}
}
导出PDF内嵌资源
var path = Path.Combine(Path.GetDirectoryName(fileName), Path.GetFileNameWithoutExtension(fileName));
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
using (var memoryStream = new MemoryStream())
{
pdfViewer1.Document.Save(memoryStream);
var document = PdfReader.Open(memoryStream);
var imageCount = 0;
// Iterate the pages.
foreach (var page in document.Pages)
{
// Get the resources dictionary.
var resources = page.Elements.GetDictionary("/Resources");
if (resources == null)
continue; // Get the external objects dictionary.
var xObjects = resources.Elements.GetDictionary("/XObject");
if (xObjects == null)
continue; var items = xObjects.Elements.Values;
// Iterate the references to external objects.
foreach (var item in items)
{
var reference = item as PdfReference;
if (reference == null)
continue; var xObject = reference.Value as PdfDictionary;
// Is external object an image?
if (xObject != null && xObject.Elements.GetString("/Subtype") == "/Image")
{
PDFHelper.ExportImage(xObject, path, ref imageCount);
}
}
}
}
两页合并成一页
using (var stream = new MemoryStream())
{
pdfViewer1.Document.Save(stream);
stream.Position = 0; // Create the output document.
var outputDocument = new PdfSharp.Pdf.PdfDocument();
var outputmemoryStream = new MemoryStream();
// Show single pages.
// (Note: one page contains two pages from the source document)
outputDocument.PageLayout = PdfPageLayout.SinglePage; var font = new XFont("微软雅黑", 8, XFontStyle.Regular);
var format = new XStringFormat();
format.Alignment = XStringAlignment.Center;
format.LineAlignment = XLineAlignment.Far; // Open the external document as XPdfForm object.
var form = XPdfForm.FromStream(stream); for (var idx = 0; idx < form.PageCount; idx += 2)
{
// Add a new page to the output document.
var page = outputDocument.AddPage();
page.Orientation = PageOrientation.Landscape;
double width = page.Width;
double height = page.Height; var gfx = XGraphics.FromPdfPage(page); // Set the page number (which is one-based).
form.PageNumber = idx + 1; var box = new XRect(0, 0, width / 2, height);
// Draw the page identified by the page number like an image.
gfx.DrawImage(form, box); // Write page number on each page.
box.Inflate(0, -10);
gfx.DrawString(String.Format("- {0} -", idx + 1),
font, XBrushes.Red, box, format); if (idx + 1 >= form.PageCount)
continue; // Set the page number (which is one-based).
form.PageNumber = idx + 2; box = new XRect(width / 2, 0, width / 2, height);
// Draw the page identified by the page number like an image.
gfx.DrawImage(form, box); // Write page number on each page.
box.Inflate(0, -10);
gfx.DrawString(String.Format("- {0} -", idx + 2),
font, XBrushes.Red, box, format);
}
outputDocument.Save(outputmemoryStream);
pdfViewer1.Document = null;
pdfViewer1.Document = PdfDocument.Load(this, outputmemoryStream);
}
添加、去除密码
//添加密码
using (var form = new PasswordForm())
{
if (form.ShowDialog(this) == DialogResult.OK)
{
var path = Path.Combine(Path.GetDirectoryName(fileName), Path.GetFileNameWithoutExtension(fileName));
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
var txt = form.Password;
using (var stream = new MemoryStream())
{
pdfViewer1.Document.Save(stream);
stream.Position = 0;
// Open an existing document. Providing an unrequired password is ignored.
var document = PdfReader.Open(stream); var securitySettings = document.SecuritySettings; // Setting one of the passwords automatically sets the security level to
// PdfDocumentSecurityLevel.Encrypted128Bit.
securitySettings.UserPassword = txt;
//securitySettings.OwnerPassword = "owner"; // Don't use 40 bit encryption unless needed for compatibility.
//securitySettings.DocumentSecurityLevel = PdfDocumentSecurityLevel.Encrypted40Bit; // Restrict some rights.
securitySettings.PermitAccessibilityExtractContent = false;
securitySettings.PermitAnnotations = false;
securitySettings.PermitAssembleDocument = false;
securitySettings.PermitExtractContent = false;
securitySettings.PermitFormsFill = true;
securitySettings.PermitFullQualityPrint = false;
securitySettings.PermitModifyDocument = true;
securitySettings.PermitPrint = false; // Save the document...
document.Save(Path.Combine(path, Path.GetFileName(fileName)));
}
}
}
//去除密码
using (var form = new PasswordForm())
{
if (form.ShowDialog(this) == DialogResult.OK)
{
var path = Path.Combine(Path.GetDirectoryName(fileName), Path.GetFileNameWithoutExtension(fileName));
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
var txt = form.Password;
using (var stream = new MemoryStream())
{
pdfViewer1.Document.Save(stream);
stream.Position = 0;
// Open an existing document. Providing an unrequired password is ignored.
var document = PdfReader.Open(stream, txt, PdfDocumentOpenMode.Modify);
document.SecuritySettings.DocumentSecurityLevel = PdfSharp.Pdf.Security.PdfDocumentSecurityLevel.None;
document.Save(Path.Combine(path, Path.GetFileName(fileName)));
}
}
}
添加水印
using (var stream = new MemoryStream())
{
pdfViewer1.Document.Save(stream);
stream.Position = 0;
var font = new XFont("微软雅黑", fontsize, XFontStyle.Regular, XPdfFontOptions.UnicodeDefault);
var document = PdfReader.Open(stream); // Set version to PDF 1.4 (Acrobat 5) because we use transparency.
if (document.Version < 14)
document.Version = 14; for (var idx = 0; idx < document.Pages.Count; idx++)
{
var page = document.Pages[idx];
var gfx = XGraphics.FromPdfPage(page);
var size = gfx.MeasureString(watermark, font);
gfx.TranslateTransform(page.Width / 2, page.Height / 2);
gfx.RotateTransform(-Math.Atan(page.Height / page.Width) * 180 / Math.PI);
gfx.TranslateTransform(-page.Width / 2, -page.Height / 2);
if (waterIndex == 0)
{
var format = new XStringFormat();
format.Alignment = XStringAlignment.Near;
format.LineAlignment = XLineAlignment.Near;
XBrush brush = new XSolidBrush(XColor.FromArgb(color));
gfx.DrawString(watermark, font, brush,
new XPoint((page.Width - size.Width) / 2, (page.Height - size.Height) / 2),
format);
}
else if (waterIndex == 1)
{
var path = new XGraphicsPath();
var format = new XStringFormat();
format.Alignment = XStringAlignment.Near;
format.LineAlignment = XLineAlignment.Near;
path.AddString(watermark, font.FontFamily, XFontStyle.BoldItalic, fontsize,
new XPoint((page.Width - size.Width) / 2, (page.Height - size.Height) / 2),
format);
var pen = new XPen(XColor.FromArgb(color), 2);
gfx.DrawPath(pen, path);
}
if (waterIndex == 2)
{
var path = new XGraphicsPath();
var format = new XStringFormat();
format.Alignment = XStringAlignment.Near;
format.LineAlignment = XLineAlignment.Near;
path.AddString(watermark, font.FontFamily, XFontStyle.BoldItalic, fontsize,
new XPoint((page.Width - size.Width) / 2, (page.Height - size.Height) / 2),
format);
var pen = new XPen(XColor.FromArgb(50, 75, 0, 130), 3);
XBrush brush = new XSolidBrush(XColor.FromArgb(color));
gfx.DrawPath(pen, brush, path);
}
}
var outputmemoryStream = new MemoryStream();
document.Save(outputmemoryStream);
pdfViewer1.Document = null;
pdfViewer1.Document = PdfDocument.Load(this, outputmemoryStream);
}
阿里云下载:https://www.aliyundrive.com/s/o4KTpMLQyU9
具体使用方法请仓库自取
欢迎Start、PR
源码地址
操作PDF的方法的更多相关文章
- ASP.Net中实现上传过程中将文本文件转换成PDF的方法
iTextSharp是一个常用的PDF库,我们可以使用它来创建.修改PDF文件或对PDF文件进行一些其他额外的操作.本文讲述了如何在上传过程中将文本文件转换成PDF的方法. 基本工作 在开始之前,我们 ...
- 【译】在Asp.Net中操作PDF - iTextSharp - 利用列进行排版
原文 [译]在Asp.Net中操作PDF - iTextSharp - 利用列进行排版 在使用iTextSharp通过ASP.Net生成PDF的系列文章中,前面的文章已经讲述了iTextSharp所涵 ...
- 【译】在Asp.Net中操作PDF - iTextSharp - 绘制矢量图
原文 [译]在Asp.Net中操作PDF - iTextSharp - 绘制矢量图 在上一篇iTextSharp文章中讲述了如何将现有的图片插入PDF中并对其进行操作.但有时,你需要在PDF中绘制不依 ...
- 【译】在Asp.Net中操作PDF – iTextSharp - 操作图片
原文 [译]在Asp.Net中操作PDF – iTextSharp - 操作图片 作为我的iTextSharp系列的文章的第七篇,开始探索使用iTextSharp在PDF中操作图片,理解本篇文章需要看 ...
- 【译】在Asp.Net中操作PDF – iTextSharp - 使用表格
原文 [译]在Asp.Net中操作PDF – iTextSharp - 使用表格 使用Asp.Net生成PDF最常用的元素应该是表格,表格可以帮助比如订单或者发票类型的文档更加格式化和美观.本篇文章并 ...
- 【译】在Asp.Net中操作PDF – iTextSharp - 使用链接和书签
原文 [译]在Asp.Net中操作PDF – iTextSharp - 使用链接和书签 用户和PDF文档的交互可以通过锚(链接)和书签进行,接着我前面iTextSharp的系列文章,本篇文章主要讲通过 ...
- 【译】在Asp.Net中操作PDF – iTextSharp-列表
原文 [译]在Asp.Net中操作PDF – iTextSharp-列表 在前文中,我们已经知道了如何利用iTextSharp创建PDF文档,设置字体样式和风格.本文开始讲述iTextSharp中的有 ...
- 【译】在Asp.Net中操作PDF – iTextSharp -利用块,短语,段落添加文本
原文 [译]在Asp.Net中操作PDF – iTextSharp -利用块,短语,段落添加文本 本篇文章是讲述使用iTextSharp这个开源组件的系列文章的第三篇,iTextSharp可以通过As ...
- 【译】在Asp.Net中操作PDF - iTextSharp - 使用字体
原文 [译]在Asp.Net中操作PDF - iTextSharp - 使用字体 紧接着前面我对iTextSharp简介博文,iTextSharp是一个免费的允许Asp.Net对PDF进行操作的第三方 ...
- 操作PDF文档功能的相关开源项目探索——iTextSharp 和PDFBox
原文 操作PDF文档功能的相关开源项目探索——iTextSharp 和PDFBox 很久没自己写写心得日志与大家分享了,一方面是自己有点忙,一方面是自己有点懒,没有及时总结.因为实践是经验的来源,总结 ...
随机推荐
- 【MAUI Blazor踩坑日记】2.关于Windows上的相机问题
前言 本系列文章,默认你已经踏上了MAUI Blazor的贼船,并且对MAUI Blazor有了一些了解,知道MAUI是什么,知道Blazor是什么. 不会教你怎么写MAUI Blazor的项目,只是 ...
- 【VS Code 与 Qt6】QAction 类的一些事
QAction 类表示用户命令的一种抽象,包括命令文本.图标.命令触发后要执行的代码.菜单.工具栏按钮往往存在相同的功能,将这些命令独立抽出来,放到 QAction 以象上,可避免编写重复的代码.比如 ...
- react中使用动画 react-transition-group
在React中通过react-transition-group使用过渡.动画,首先要有CSS3中的过渡和动画的相关知识储备,可以参考 过渡和2D变换.动画和3d变换. 我们自己通过css设置过渡.动画 ...
- 手工搭建并配置apache,php,mysql环境服务器
1,安装apache2.4: 从apache官网中下载windows版本的apache二进制文件,解压 打开apache目录中的bin目录,在其中打开cmd窗口,使用命令: httpd -k inst ...
- .NET Core基础到实战案例零碎学习笔记
前言:前段时间根据 [老张的哲学] 大佬讲解的视频做的笔记,讲的很不错.此文主要记录JWT/DI依赖注入/AOP面向切面编程/DTO/解决跨域等相关知识,还包含一些.NET Core项目实战的一些案例 ...
- 你的开发套件已到货「GitHub 热点速览」
这周的 GitHub 热点榜,撇开上周的介绍过的几个项目,剩下就两字:套件.像是搜罗了大量黑客工具的 hackingtool,还有打算一统米哈游游戏客户端的 Starward,以及好用的 CV 库 s ...
- 揭秘ChatGPT,如何打造自己的自定义指令
一.ChatGPT-0720更新 又在深夜,正要打开ChatGPT官网测试下pdf对话功能,发现ChatGPT又有更新.本次更新总结有2点: 1.对于Plus用户,GPT-4的使用限额从25条/3h提 ...
- mysql8关闭binlog并清空Binlog
编辑my.ini或者my.cnf文件 清空binlog信息 #查看现存的binlog文件列表 show master logs; #重置清空binlog文件 reset master; #重置清空后 ...
- PLC通过Modbus转Profinet网关与合康变频器Modbus通讯案例
PLC通过Modbus转Profinet网关(XD-MDPN100)与合康变频器Modbus通讯,实现了两个设备之间的数据交互.Profinet是一种基于以太网的实时工控网络协议,而Modbus是一种 ...
- DBA容灾与备份恢复:闪回应用及实践(一)
闪回应用及实践 针对主机故障.网络故障.系统软件故障.存储介质故障.人为操作失误等各类故障,可以通过RAC.RMAN.Data Guard等成熟的解决方案来处理,不过对于人为操作失误防范的首推技术还是 ...