itextsharp操作

最近涉足印刷行业,需要做一个软件,这个软件在线接收了客户上传的pdf文件后(socket通讯,4字节发送文件大小,而后分包,总大小/8K=包数,以及最后一包的大小)........

完成异步socket通讯功能后,现在需要做pdf的相关操作

  1.pdf转图片

2.多pdf合并+有规律的合并

3.图片转jpg

4.图片转pdf

5.拼版算法,求最小面积,得出最节约纸张的排版

目前1~4步已经完成,正在做第五步。下面分享第二步的操作的代码

pdf管理类

using System.Collections.Generic;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace Pdf
{
    /// <summary>
    /// Pdf文件信息
    /// 印刷文件最多两页,且每页的长宽一样的
    /// </summary>
    public class PdfFileInfo
    {
        public string path { get; set; }

        public float width { get; set; }

        public float height { get; set; }

        public float X { get; set; }

        public float Y { get; set; }
    }

    /// <summary>
    /// pdf操作核心类
    /// </summary>
    public class PdfMange
    {
        /// <summary>
        /// 读取多个pdf文件,按照每个pdf文件顺序+页面顺序合并到一个pdf文件中
        /// </summary>
        /// <param name="fileList"></param>
        /// <param name="targetFile"></param>
        public static void ComBineMoreToOne(string[] fileList, string targetFile)
        {
            PdfReader reader;
            Document document = new Document();
            PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(targetFile, FileMode.Create));
            document.Open();

            PdfContentByte cb = writer.DirectContent;
            PdfImportedPage newPage;

            for (int i = 0; i < fileList.Length; i++)
            {
                reader = new PdfReader(fileList[i]);
                int iPageNum = reader.NumberOfPages;

                for (int j = 1; j <= iPageNum; j++)
                {
                    newPage = writer.GetImportedPage(reader, j);
                    document.NewPage();
                    cb.AddTemplate(newPage, 0, 0);
                }
            }
            document.Close();
        }
        /// <summary>
        /// 读取多个pdf文件,按照每个pdf文件顺序+页面顺序合并到一个pdf文件中的一页上,并且自动适应大小排序
        /// 1英寸=72磅     2.54厘米=1英寸   pdf单位磅
        /// </summary>
        /// <param name="fileList"></param>
        /// <param name="targetFile"></param>
        public static void ComBineMoreToOnePage(IList<PdfFileInfo> fileList, string targetFile)
        {
            float[] urx2 = GetUrxy(fileList);
            float urx = urx2[0], ury = urx2[1];
            int marginLeft = 0, marginRight = 0, marginTop = 0, marginBottom = 0;
            iTextSharp.text.Rectangle pagesize = new iTextSharp.text.Rectangle(urx, ury);
            Document document = new Document(pagesize, marginLeft, marginRight, marginTop, marginBottom);
            PdfReader reader;
            PdfImportedPage newPage;
            PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(targetFile, FileMode.Create));
            document.Open();
            PdfContentByte cb = writer.DirectContent;
            //=================================关键复制pdf内容代码段Start===============================================
            foreach (PdfFileInfo info in fileList)
            {
                reader = new PdfReader(info.path);
                int PageNum = reader.NumberOfPages;
                for (int j = 1; j <= PageNum; j++)
                {
                    if (j % 2 != 0&&j<3)//印刷行业规定最多只有2页,且只有一页的第二页要空
                    {
                        newPage = writer.GetImportedPage(reader, j);
                        cb.AddTemplate(newPage, info.X, info.Y);
                    }

                }
            }
            document.NewPage();
            foreach (PdfFileInfo info in fileList)
            {
                reader = new PdfReader(info.path);
                int PageNum = reader.NumberOfPages;
                for (int j = 1; j <= PageNum; j++)
                {
                    if (j % 2 == 0 && j < 3)//印刷行业规定最多只有2页,且只有一页的第二页要空
                    {
                        newPage = writer.GetImportedPage(reader, j);
                        cb.AddTemplate(newPage, info.X, info.Y);
                    }

                }
            }
            //=================================关键复制pdf内容代码段end===============================================
            document.Close();
        }

        public static float[] GetUrxy(IList<PdfFileInfo> fileList)
        {
            IList<float> x = new List<float>();
            IList<float> y = new List<float>();
            foreach (PdfFileInfo info in fileList)
            {
                x.Add(info.width + info.X);

                y.Add(info.height + info.Y);
            }

            for (int i = 0; i < x.Count; i++)
            {
                float temp = x[i];
                for (int j = 0; j < x.Count; j++)
                {
                    if (x[j] < x[i])
                    {
                        x[i] = x[j];
                        x[j] = temp;
                    }
                }
            }

            for (int i = 0; i < y.Count; i++)
            {
                float temp = y[i];
                for (int j = 0; j < y.Count; j++)
                {
                    if (y[j] < y[i])
                    {
                        y[i] = y[j];
                        y[j] = temp;
                    }
                }
            }

            float[] result = { x[0], y[0] };

            return result;
        }

        /// <summary>
        /// 计算pdf 毫米转磅
        /// </summary>
        /// <param name="size"></param>
        /// <returns></returns>
        public static float GetPdfSize(float size)
        {
            return (size / 10) / (float)2.54*(float)72;
        }

        //==============================================================================================================================================
    }
}

以及调用方法例子

/// <summary>
        /// 合并多个pdf文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button4_Click(object sender, EventArgs e)
        {
            List<PdfFileInfo> fileList = new List<PdfFileInfo>();
            PdfFileInfo info = new PdfFileInfo();
            info.path = "c://41.pdf";
            info.X = 0;
            info.Y = 0;
            info.width = PdfMange.GetPdfSize(210);
            info.height = PdfMange.GetPdfSize(297);
            fileList.Add(info);

            PdfFileInfo info2 = new PdfFileInfo();
            info2.path = "c://5.pdf";
            info2.X = PdfMange.GetPdfSize(210);
            info2.Y = 0;
            info2.width = PdfMange.GetPdfSize(210);
            info2.height = PdfMange.GetPdfSize(297);
            fileList.Add(info2);

            PdfFileInfo info3 = new PdfFileInfo();
            info3.path = "c://442.pdf";
            info3.X = PdfMange.GetPdfSize(210*2); ;
            info3.Y = 0;
            info3.width = PdfMange.GetPdfSize(210);
            info3.height = PdfMange.GetPdfSize(297);
            fileList.Add(info3);

            PdfMange.ComBineMoreToOnePage(fileList, "c://newpdf.pdf");

        }

效果如下:

最终生成

时间: 2024-10-24 10:48:22

itextsharp操作的相关文章

C#工具类:使用iTextSharp操作PDF文档

iTextSharp是一个用于操作PDF文件的组件DLL程序,在C#程序中可以引用iTextSharp组件,用于开发与PDF文件相关的报表等功能,利用iTextSharp组件提供出来的方法接口,我们可以实现很多与PDF文档有关的操作,如打开PDF文档对象.往PDF文档中添加段落.添加图片链接等等,功能非常的强大.这边简单对iTextSharp类进行了封装,提供一些常用的PDF操作方法. iTextSharp官网:http://www.itextpdf.com/ (英文好的建议直接查看原始文档).

C#使用ITextSharp操作pdf

在.NET中没有很好操作pdf的类库,如果你需要对pdf进行编辑,加密,模板打印等等都可以选择使用ITextSharp来实现. 第一步:可以点击这里下载,新版本的插件升级和之前对比主要做了这几项重大改变 1.初始化对汉字的支持 2.对页眉页脚的加载形式 第二步:制作pdf模板 可以下载Adobe Acrobat DC等任意一款pdf编辑工具,视图--工具--准备表单,可以在需要赋值的地方放上一个文本框,可以把名称修改为有意义的名称,后面在赋值时要用到. 第三步:建项目引入各个操作类 介于前段时间

itextsharp操作pdf——插入图片、二维码等

简单介绍 业务需求,需要往pdf图纸上添加二维码功能,将实现过程记录下来 下载类库 直接下载 添加引用 添加命名空间 using System.IO; using iTextSharp.text.pdf; 插入图片处理函数 /// <summary> /// 向pdf中添加图片 /// </summary> /// <param name="oldP">源pdf地址</param> /// <param name="imP

如何把图片放入到页面的合适位置

有时候我们需要批量的向一个文档中插入图片,比如说,我们使用OpexXML操作Word文件,或者使用ITextSharp操作PDF文件. 这里以ITextSharp操作PDF为例,现在有100张图片,插入到PDF中,每个图片占据一页.这里有个问题,因为这些图片的长度,像素等都是不确定的,我们怎么才能把图片摆在一个页面比较合适的位置上?我们可以考虑把图片放到页面的中间,也就是图片的对角线中心与页面的对角线中心重合.但是长度怎么办?有的图片长度可是完全超出了页面的宽带.所以,这时我们就要判断比较图片宽

C#工具类:使用SharpZipLib进行压缩、解压文件

SharpZipLib是一个开源的C#压缩解压库,应用非常广泛.就像用ADO.NET操作数据库要打开连接.执行命令.关闭连接等多个步骤一样,用SharpZipLib进行压缩和解压也需要多个步骤.SharpZipLib功能比较强大,在很多C#的应用中,都有它的身影,我们可以通过引入SharpZipLib类库文件,在程序中实现自动压缩文件以及解压缩文件的功能,例如一个常见的情景就是用户客户端程序下载更新包,下载完成之后,在本地自动解压文件. SharpZipLib的官方地址是:http://icsh

基于iTextSharp的PDF操作(PDF打印,PDF下载)

准备 1. iTextSharp的简介 iTextSharp是一个移植于java平台的iText项目,被封装成c#的组件来用于C#生成PDF文档,目前,也有不少操作PDF的类库,(国产的有福盺的,免费试用,用于商业用途收费)但是功能普遍没有iText强大,而且使用没有iText广泛.还有他就是开源的.目前比较新的是5.5版本的. 2. 使用工具 硬件: PC机:一台 软件: Windows操作系统 Isual studio 2013  (可以是任意版本) .Net frameWork 4.5  

在Asp.Net中操作PDF – iTextSharp - 使用表格

使用Asp.Net生成PDF最常用的元素应该是表格,表格可以帮助比如订单或者发票类型的文档更加格式化和美观.本篇文章并不会深入探讨表格,仅仅是提供一个使用iTextSharp生成表格的方法介绍 使用iTextSharp来操作表格是一件简单的事,尤其是iTextSharp中表格元素的命名方式和HTML与CSS中非常类似.iTextSharp提供了多个类用于创建表格,为了不让读者产生混淆,这里我使用PdfPTable这个专门为在PDF中创建表格的类,下面代码展示了如何创建一个表格并将其加入PDF中:

C#使用iTextSharp封装的PDF文件操作类实例

本文实例讲述了C#使用iTextSharp封装的PDF文件操作类.分享给大家供大家参考.具体分析如下: 这个C#代码主要讲iTextSharp中用于操作PDF文件的方法进行了再次封装,可以更加方便的访问PDF文档,可以动态生成PDF文件.添加内容.设置段落.设置字体等. using System.IO; using iTextSharp.text; using iTextSharp.text.pdf; namespace DotNet.Utilities { /// <summary> ///

一步一步ITextSharp 低级操作函数使用

首先说一下PDF文档的结构: 分为四层,第一层和第四层由低级操作来进行操作,第二层.第三层由高级对象操作 第一层操作只能使用PdfWriter.DirectContent操作,第四层使用DirectContentUnder操作. 第二层和第三层的PdfContentByte是由IText内部操作,没有提供api接口. 图形和文本状态解释 图形状态,就是作图时对图形一些环境设置, 使用低级操作输出文本或图形前,应该设置操作环境,并且操作完成后,应该恢复操作前的环境. 使用低级操作是非常复杂的一般情