一、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页面大小的更多相关文章

  1. 动态jsp页面转PDF输出到页面

    最近工作中遇到不少问题.总结一下.这段代码主要功能是将一个生成JSP页面转发成PDF输出到页面 需要利用ITEXT String html = ServletUtils.forward(request ...

  2. Java PDF页面设置——页面大小、页边距、纸张方向、页面旋转

    下面的示例将介绍通过Java编程来对PDF页面进行个性化设置的方法,包括设置页面大小.页边距.纸张方向.页面旋转等.这里有如下多种页面大小尺寸可供选择: 同时,设置文档内容旋转时,可支持如下角度进行内 ...

  3. 经验分享:PDF怎么提取页面

    PDF文件的页面有很多但有需要的并不是全部,有时候需要其中一页或几页的时候,这个时候我们就需要把单独的页面提取出来,这个时候应该怎么做呢,上次有小伙伴来询问小编,今天小编就为大家分享一下小编自己的编辑 ...

  4. PDF怎么旋转页面,只需几步轻松搞定!

    有时候我们下载一个PDF文件里面有页面是旋转的情况,用手机看的时候可以把手机旋转过来看,那么用电脑的时候总不可能也转过来看吧,笔记本是可以的台式的是不行的,这个时候我们就需要把PDF文件中旋转的页面转 ...

  5. 怎么给PDF文件交换页面

    在使用PDF文件的时候有文件页面的排版错误的时候,这个时候就需要交换页面了,那么怎么给PDF文件交换页面呢,在使用PDF文件的时候需要交换页面的时候要怎么做呢,下面小编就为大家分享一下PDF文件交换页 ...

  6. PDF裁剪页面,PDF怎么裁剪页面的方法

    PDF文件要怎么裁剪页面呢,是不是有很多的小伙们想知道呢,当打开一个PDF文件的时候如果一个页面中有很多的空白页面就会影响文件的美观与使用,今天小编就为大家分享一下小编的裁剪页面的方法. 操作软件:迅 ...

  7. base64编码后的pdf文件前端页面展示--pdf.js的应用

    最近在整理项目中用到的插件或者使用心得,感觉还是写成博客,能加深新一层的理解. 我先说一下我的需求:由于java后台编译的文件流在手机端加载速度太慢,所以想着可以在前端解析,放在页面展示给用户. 所以 ...

  8. itext A4纸张横向创建PDF

    import java.awt.Color;import java.io.FileOutputStream;import java.io.IOException; import com.lowagie ...

  9. PDF怎么替换页面,教你一招秒实现

    PDF格式是在办公中比较常用的文件格式之一,虽然很好用,也很容易携带,但也容易出现一个问题,当你想要对PDF文件操作或者修改的时候,才发现PDF文件不是那么容易就能进行编辑和修改的,特别是需要对PDF ...

随机推荐

  1. IO笔记(学习尚硅谷java基础教程)

    一.基础知识 1. 在普通方法和测试方法中文件路径的差异 在普通方法中:文件路径相当于在当前项目中,而不是当前Module(以项目为基准) 在测试方法中:文件路径相当于在当前Module中,而不是当前 ...

  2. libpcap -学习1

    1.今天学到的最重要一点就是指定是否打开混杂模式(Promiscuous Mode),0表示非混杂模式,任何其他值表示混合模式.如果要打开混杂模式,那么网卡必须也要打开混杂模式,可以使用如下的命令打开 ...

  3. EMQX_AUTH_USERNAME 使用

    emqx_auth_username 它通过比对每个终端的接入的 username 和 password 与 EMQ X 中存储的是否一致来实现终端接入的控制.其功能逻辑如下: emqx_auth_u ...

  4. 重载(Overload)和重写(Override)的区别。重载的 方法能否根据返回类型进行区分?

    方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性.重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同.参数个数不同或者二者都不同)则视 ...

  5. Redis 集群方案什么情况下会导致整个集群不可用?

    有 A,B,C 三个节点的集群,在没有复制模型的情况下,如果节点 B 失败了, 那么整个集群就会以为缺少 5501-11000 这个范围的槽而不可用.

  6. JavaScript HTML5事件

    有3个页面级事件在HTML5版本中被引入.  事件  说明  DOMContentLoaded  在DOM树形成后触发(与此同时,图片.CSS和JavaScript可能还在加载).在这个事件中,脚本运 ...

  7. 用 Java 实现阻塞队列 ?

    参考 java 中的阻塞队列的内容吧,直接实现有点烦

  8. spring @Bean和@Order 官方doc理解

    今天阅读了spring的官方代码,(大概)理解了@Bean和@Order如何使用. @Bean 官方代码解读: 0.@Bean的注入,用于表示这个bean被spring容器管理(创建.销毁)(官方英文 ...

  9. 提高scrapy爬取效率配置

    提高scrapy爬取效率配置 #增加并发: 默认scrapy开启的并发线程为32个,可以适当进行增加.在settings配置文件中修改CONCURRENT_REQUESTS = 100值为100,并发 ...

  10. Clickhouse 纯手工迁移表

    [应用场景] 由于一些未可知的原因,导致原表不可用,也不能恢复.通过手动迁移的方法来恢复业务 [解决办法] 新建一张 copy 表,把原表的 data 目录复制到新表的data 目录,并 attach ...