操作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 很久没自己写写心得日志与大家分享了,一方面是自己有点忙,一方面是自己有点懒,没有及时总结.因为实践是经验的来源,总结 ...
随机推荐
- tmux 移动窗格
pre + Ctrl+o:所有窗格向前移动一个位置,第一个窗格变成最后一个窗格 pre + Shift+[:当前窗格与上一个窗格交换位置 pre + Shift+]:当前窗格与下一个窗格交换位置
- .NET5从零基础到精通:全面掌握.NET5开发技能
C#版本新语法-官网: C#7:https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-7 C#8:https://docs.m ...
- 关于Openssh版本升级问题及版本升级到最新版8.7p1流程(CentOS7系统)
前言: 对linux服务器做过漏洞扫描的都知道,常常服务器会被扫出一大堆关于openssh的漏洞,诸如下面这些,而其中的原因就是因为openssh版本比较低.于是就需要升级openssh的版本.下面就 ...
- 结果过滤器—MVC项目中结果过滤器(Result Filter)使用
一.什么是结果过滤器? 结果过滤器(ResultFilter),是对执行的Action结果进行处理的一种AOP思想,适用于任何需要直接环绕 View 或格式化处理的逻辑.结果过滤器可以替换或更改 Ac ...
- torch.nn基础学习教程 | PyTorch nn Basic Tutorial
基于torch.nn搭建神经网络的基础教程大纲: 1. 引言 在我们开始深入探讨torch.nn之前,我们首先需要理解PyTorch及其神经网络库的基础知识.这一部分的内容将帮助你对PyTorch有一 ...
- ipmitool配置机器的BMC
一.设置IP地址 1.确定操作对象 #ipmitool mc info 输出中"Device Revision"是命令的操作对象 2.设置BMC IP # ipmitool -I ...
- 正则表达式快速入门三: python re module + regex 匹配示例
使用 Python 实现不同的正则匹配(从literal character到 其他常见用例) reference python regular expression tutorial 目录 impo ...
- Laf 云开发平台及其实现原理
Laf 产品介绍 自我介绍 大家好,我是来自 Laf 团队的王子俊,很高兴今天能在这里给大家分享我们 Laf 云开发平台及其实现原理.本来想说一点什么天气之类的话作为开头,但主持人都说完啦,我就不多说 ...
- java线程的interrup、tUninterruptibles.sleepUninterruptibly和sleep、wait
参考: (1)https://blog.csdn.net/qq_36031640/article/details/116696685 (2)https://blog.csdn.net/liuxiao7 ...
- 深入理解HTTP的基础知识:请求-响应过程解析
首先,我们从网络协议的最顶层开始讲解,即应用层.在网络通信中,应用层是最接近用户的一层,它负责为特定的网络应用提供服务和功能.应用层协议定义了数据交换的规则和格式,以便不同的应用程序能够相互通信和交换 ...