PDF的内容提取、转换见上篇

PDF操作:

  1. 旋转
  2. 删除
  3. 合并
  4. 拆分
  5. 转成图片
  6. 导出内嵌资源图片
  7. 两页合并成一页
  8. 添加、去除密码
  9. 添加水印

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的方法的更多相关文章

  1. ASP.Net中实现上传过程中将文本文件转换成PDF的方法

    iTextSharp是一个常用的PDF库,我们可以使用它来创建.修改PDF文件或对PDF文件进行一些其他额外的操作.本文讲述了如何在上传过程中将文本文件转换成PDF的方法. 基本工作 在开始之前,我们 ...

  2. 【译】在Asp.Net中操作PDF - iTextSharp - 利用列进行排版

    原文 [译]在Asp.Net中操作PDF - iTextSharp - 利用列进行排版 在使用iTextSharp通过ASP.Net生成PDF的系列文章中,前面的文章已经讲述了iTextSharp所涵 ...

  3. 【译】在Asp.Net中操作PDF - iTextSharp - 绘制矢量图

    原文 [译]在Asp.Net中操作PDF - iTextSharp - 绘制矢量图 在上一篇iTextSharp文章中讲述了如何将现有的图片插入PDF中并对其进行操作.但有时,你需要在PDF中绘制不依 ...

  4. 【译】在Asp.Net中操作PDF – iTextSharp - 操作图片

    原文 [译]在Asp.Net中操作PDF – iTextSharp - 操作图片 作为我的iTextSharp系列的文章的第七篇,开始探索使用iTextSharp在PDF中操作图片,理解本篇文章需要看 ...

  5. 【译】在Asp.Net中操作PDF – iTextSharp - 使用表格

    原文 [译]在Asp.Net中操作PDF – iTextSharp - 使用表格 使用Asp.Net生成PDF最常用的元素应该是表格,表格可以帮助比如订单或者发票类型的文档更加格式化和美观.本篇文章并 ...

  6. 【译】在Asp.Net中操作PDF – iTextSharp - 使用链接和书签

    原文 [译]在Asp.Net中操作PDF – iTextSharp - 使用链接和书签 用户和PDF文档的交互可以通过锚(链接)和书签进行,接着我前面iTextSharp的系列文章,本篇文章主要讲通过 ...

  7. 【译】在Asp.Net中操作PDF – iTextSharp-列表

    原文 [译]在Asp.Net中操作PDF – iTextSharp-列表 在前文中,我们已经知道了如何利用iTextSharp创建PDF文档,设置字体样式和风格.本文开始讲述iTextSharp中的有 ...

  8. 【译】在Asp.Net中操作PDF – iTextSharp -利用块,短语,段落添加文本

    原文 [译]在Asp.Net中操作PDF – iTextSharp -利用块,短语,段落添加文本 本篇文章是讲述使用iTextSharp这个开源组件的系列文章的第三篇,iTextSharp可以通过As ...

  9. 【译】在Asp.Net中操作PDF - iTextSharp - 使用字体

    原文 [译]在Asp.Net中操作PDF - iTextSharp - 使用字体 紧接着前面我对iTextSharp简介博文,iTextSharp是一个免费的允许Asp.Net对PDF进行操作的第三方 ...

  10. 操作PDF文档功能的相关开源项目探索——iTextSharp 和PDFBox

    原文 操作PDF文档功能的相关开源项目探索——iTextSharp 和PDFBox 很久没自己写写心得日志与大家分享了,一方面是自己有点忙,一方面是自己有点懒,没有及时总结.因为实践是经验的来源,总结 ...

随机推荐

  1. 模拟ArrayList(顺序表)的底层实现

    模拟ArrayLIst的底层实现 package com.tedu.api04.list; import java.util.Objects; /** * @author LIGENSEN * Dat ...

  2. 智能制造之路—从0开始打造一套轻量级MOM平台之基础平台搭建(Linux部署)

    一.前言 前面我们选定了Admin.net来搭建我们的MOM快速开发平台,本章主要描述.NET6平台的Linux部署,以及记录搭建过程中坑. 本次搭建我们选择某云的轻量应用服务器,系统选择CentOS ...

  3. Go 语言 select 都能做什么?

    原文链接: Go 语言 select 都能做什么? 在 Go 语言中,select 是一个关键字,用于监听和 channel 有关的 IO 操作. 通过 select 语句,我们可以同时监听多个 ch ...

  4. JavaScript迭代协议

    JavaScript迭代协议解读 迭代协议分为可迭代协议和迭代器协议. 协议指约定俗成的一系列规则. 可迭代协议 可迭代协议规定了怎么样算是一个可迭代对象:可迭代对象或其原型链上必须有一个键为[Sym ...

  5. 3、Mybatis之CURD

    3.1.创建通用工具类 package org.rain.mybatis.utils; import org.apache.ibatis.io.Resources; import org.apache ...

  6. WPF 在MVVM模式下应用动画

    一个简单的需求:当程序发生异常时候,在界面上动画显示异常信息. 这个需求看似简单,只需要try--catch到异常,然后把异常的信息写入界面就OK了. 但在MVVM时,就不是这么简单了.MVVM模式下 ...

  7. Mac m2使用实现微信小程序抓包

    Mac m2使用实现微信小程序抓包 最近换了MacBook Pro,芯片是M2 Pro,很多东西跟windows是不一样的,所以重新配置相应环境,这里介绍一下微信小程序抓包的方法. 使用burp+pr ...

  8. 用一个示例来学习DockerFile

    在Docker的世界里,我们经常会听到Dockerfile这个词.那么,什么是Dockerfile?它如何工作?本文将简要介绍Dockerfile的基本概念,原理以及一些常用的Dockerfile命令 ...

  9. 如何把网页打包成苹果原生APP并上架TF(TestFlight)

    打包网页APP并上架到TestFlight流程 需要准备的材料: 1. GDB苹果网页打包软件1.6.0或者以上版本: https://www.cnblogs.com/reachteam/p/1229 ...

  10. Linux/Unix-CPU-SuperPI-Unixbench性能测试

    测试服务器CPU单核及多核SuperPI圆周率测试real和user值,SuperPI是利用CPU的浮点运算能力来计算出π(圆周率),测试系统稳定性和测试CPU计算完后特定位数圆周率所需的时间:及Un ...