C# iText 7 切分PDF,处理PDF页面大小
一、itext
我要使用itext做一个pdf的页面大小一致性处理,然后再根据数据切分出需要的pdf.
iText的官网有关于它的介绍,https://itextpdf.com/ 然后在官网可以查找api文档https://api.itextpdf.com/。
其中我要使用的是itext7+,主要在iText.Kernel.Pdf 命名空间下。

二、处理PDF页面大小一致
由于原始PDF 是扫描图片合成来的,有些页面扫描的图片规格不一致,导致pdf阅读性很差。

对于这个pdf我进行处理,首先是在nuget 里面搜索 itext 进行安装,使用itext7。

处理PDF大小方法:
public void RestPageSize(string sourcePdfPath, string outputPdfPath)
{
PdfReader pdfReader = null;
PdfDocument pdfDocument = null;
PdfWriter pdfWriter = null;
PdfDocument outPDfDoc = null;
try
{
pdfReader = new PdfReader(sourcePdfPath);
pdfDocument = new PdfDocument(pdfReader);
var outDir = System.IO.Path.GetDirectoryName(outputPdfPath);
if (!Directory.Exists(outDir))
{
Directory.CreateDirectory(outDir);
}
pdfWriter = new PdfWriter(outputPdfPath);
outPDfDoc = new PdfDocument(pdfWriter);
outPDfDoc.SetDefaultPageSize(PageSize.A3);
for (int i = 1; i < pdfDocument.GetNumberOfPages() + 1; i++)
{
var page = pdfDocument.GetPage(i);
var formXObject = page.CopyAsFormXObject(outPDfDoc);
var xPercent = PageSize.A3.GetWidth() / page.GetPageSize().GetWidth();
var yPercent = PageSize.A3.GetHeight() / page.GetPageSize().GetHeight();
PdfCanvas pdfCanvas = new PdfCanvas(outPDfDoc.AddNewPage());
pdfCanvas.AddXObjectWithTransformationMatrix(formXObject, xPercent, 0, 0, yPercent, 0, 0);
}
pdfWriter.Flush();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
finally
{
if (pdfReader != null)
{
pdfReader.Close();
}
if (pdfDocument != null)
{
pdfDocument.Close();
}
if (outPDfDoc != null)
{
outPDfDoc.Close();
}
if (pdfWriter != null)
{
pdfWriter.Close();
pdfWriter.Dispose();
}
}
思路:遍历原来的PDF页码,将原来的PDF页码对象拷贝PdfFormXObject到要生成的PDF文档中,首先要copy页面对象才能使用,不然直接获取的page对象是原来文档的,我们无法操作。
var formXObject = page.CopyAsFormXObject(outPDfDoc);
然后对页面进行缩放计算,我们新的PDF默认设置成A3大小,通过计算原始页面和新页面宽高比例进行缩放。
计算完成后,在新文档中使用PdfCanvas 对象新添加一页,然后将PdfFormXObject 写入到新添加的页中。
处理后的PDF:

三、切分PDF
切分PDF 就比较简单了,直接从原始文件中拷贝页面到新PDF文档中就行了。
切分PDF 方法:
public void ExtractPages(string sourcePdfPath, string outputPdfPath, int startPage, int endPage)
{
PdfReader pdfReader = null;
PdfDocument pdfDocument = null;
PdfWriter pdfWriter = null;
PdfDocument outPDfDoc = null;
try
{
pdfReader = new PdfReader(sourcePdfPath);
pdfDocument = new PdfDocument(pdfReader);
var outDir = Path.GetDirectoryName(outputPdfPath);
if (!Directory.Exists(outDir))
{
Directory.CreateDirectory(outDir);
}
pdfWriter = new PdfWriter(outputPdfPath);
outPDfDoc = new PdfDocument(pdfWriter);
pdfDocument.CopyPagesTo(startPage, endPage, outPDfDoc);
pdfWriter.Flush();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
finally
{
if (pdfReader != null)
{
pdfReader.Close();
}
if (pdfDocument != null)
{
pdfDocument.Close();
}
if (outPDfDoc != null)
{
outPDfDoc.Close();
}
if (pdfWriter != null)
{
pdfWriter.Close();
pdfWriter.Dispose();
}
}
}
注意:对写入流要进行pdfWriter.Flush()将缓冲区数据写入PDF后再关。
C# iText 7 切分PDF,处理PDF页面大小的更多相关文章
- 动态jsp页面转PDF输出到页面
最近工作中遇到不少问题.总结一下.这段代码主要功能是将一个生成JSP页面转发成PDF输出到页面 需要利用ITEXT String html = ServletUtils.forward(request ...
- Java PDF页面设置——页面大小、页边距、纸张方向、页面旋转
下面的示例将介绍通过Java编程来对PDF页面进行个性化设置的方法,包括设置页面大小.页边距.纸张方向.页面旋转等.这里有如下多种页面大小尺寸可供选择: 同时,设置文档内容旋转时,可支持如下角度进行内 ...
- 经验分享:PDF怎么提取页面
PDF文件的页面有很多但有需要的并不是全部,有时候需要其中一页或几页的时候,这个时候我们就需要把单独的页面提取出来,这个时候应该怎么做呢,上次有小伙伴来询问小编,今天小编就为大家分享一下小编自己的编辑 ...
- PDF怎么旋转页面,只需几步轻松搞定!
有时候我们下载一个PDF文件里面有页面是旋转的情况,用手机看的时候可以把手机旋转过来看,那么用电脑的时候总不可能也转过来看吧,笔记本是可以的台式的是不行的,这个时候我们就需要把PDF文件中旋转的页面转 ...
- 怎么给PDF文件交换页面
在使用PDF文件的时候有文件页面的排版错误的时候,这个时候就需要交换页面了,那么怎么给PDF文件交换页面呢,在使用PDF文件的时候需要交换页面的时候要怎么做呢,下面小编就为大家分享一下PDF文件交换页 ...
- PDF裁剪页面,PDF怎么裁剪页面的方法
PDF文件要怎么裁剪页面呢,是不是有很多的小伙们想知道呢,当打开一个PDF文件的时候如果一个页面中有很多的空白页面就会影响文件的美观与使用,今天小编就为大家分享一下小编的裁剪页面的方法. 操作软件:迅 ...
- base64编码后的pdf文件前端页面展示--pdf.js的应用
最近在整理项目中用到的插件或者使用心得,感觉还是写成博客,能加深新一层的理解. 我先说一下我的需求:由于java后台编译的文件流在手机端加载速度太慢,所以想着可以在前端解析,放在页面展示给用户. 所以 ...
- itext A4纸张横向创建PDF
import java.awt.Color;import java.io.FileOutputStream;import java.io.IOException; import com.lowagie ...
- PDF怎么替换页面,教你一招秒实现
PDF格式是在办公中比较常用的文件格式之一,虽然很好用,也很容易携带,但也容易出现一个问题,当你想要对PDF文件操作或者修改的时候,才发现PDF文件不是那么容易就能进行编辑和修改的,特别是需要对PDF ...
随机推荐
- mysql索引失效原理(联合索引失效问题)
单值索引B+树图单值索引在B+树的结构里,一个节点只存一个键值对 联合索引开局一张图,由数据库的a字段和b字段组成一个联合索引. 从本质上来说,联合索引也是一个B+树,和单值索引不同的是,联合索引的键 ...
- Hibernate实体的三种状态是什么?各有什么特点?
瞬时态(Transient). 持久态(Persistent).脱管态(Detached).处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为VO(Value ...
- pg数据库排序和limit同时使用遇到的奇怪问题
这两天由于一位实习生同事回学校答辩,因此我来跟进他之前开发的功能进行测试,测试反馈上来这么一个问题: 也就是说下面这两条sql查询出来的数据前10条的数据不一样. select * from tabl ...
- 用maven建立一个工程4
在命令行里面输入cd C:\Users\admin\Documents\hello 然后按回车 再输入这行代码 mvn archetype:generate -DgroupId=com.liyongz ...
- leetcode_两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同 ...
- 2_状态空间_State Space
- Python使用逻辑回归估算OR值
第一种是统计学方法,需要用到 statsmodels包 statsmodels是统计和计量经济学的package,包含了用于参数评估和统计测试的实用工具 第二种是机器学习,需要使用sklearn中的L ...
- ubantu系统之快捷键使用
1. 文件管理器中,目录切换为可以编辑的状态: ctrl + l 2. gedit 搜索 : ctrl + h
- vue中Promise对象用法
Promise.all([ 需要异步一起执行的方法---------先做的事 ]).then(res=>{ 后做的事(先做的事已经做好了) }) 举栗子: Promise.all([ this. ...
- echarts中饼图的legend自定义icon图片(扇形为例)
效果图: 代码: 问题:// icon: "pin", // 这个字段控制形状 类型包括 circle,rect ,roundRect,triangle,diamond,pin,a ...