itext pdf merge 将翻转方向,修复方法

2023-10-10 01:19

itext pdf合并会翻转方向问题。修复方法。

itext pdf 当处理合并多个页面时。
有两种方法
一种是直接使用itext的Write来控制输出。
另一种方法是使用 PdfCopy 类进行复制。

自己用Write来控制就可以了。一般都是这样写的。

 public staticMemoryStream mergePDFStream(MemoryStream[] 文件, iTextSharp.text.Rectangle 页面大小 = null){ //outMergeFile = Server.MapPath(outMergeFile);//if (outMergeFile == null)//{ // outMergeFile = "d:\\" + DateTime.Now.ToString(" yyyy-MM-dd HH:mm:ss") + new Random().Next(1000) + ".pdf";//} PdfReader 阅读器;文档文档;if (pagesize == null){document = new Document();//pagesize = PageSize.A4;} 其他{文档= new Document(pagesize);}//var fs = new FileStream(outMergeFile, FileMode.Create);MemoryStream fs = new MemoryStream();//BufferedStream bfs = new BufferedStream(fs);PdfWriter writer = PdfWriter.GetInstance(document, fs);writer.CloseStream = false; //不自动关闭内存流。 m.genealogy-computer-tips.com();PdfContentByte cb = m.genealogy-computer-tips.comContent;for (inti = 0;i< 文件长度; i++){reader = new PdfReader(files[i].ToArray());//关闭内存流。files[i].Close(); int iPageNum = reader.NumberOfPages;for (int j = 1; j <= iPageNum; j++){PdfImportedPage newPage = writer.GetImportedPage(reader , j);//cb.Add(newPage);//cb.MoveTo(0, 0);//PageSize.A4.Height - newPage.Height解决itext高度的问题。 itext的y轴默认从底部开始 if (pagesize == null){// newPage.Height;var newPageSize =  new iTextSharp.text.Rectangle(newPage.Width, newPage.Height);document.SetPageSize(newPageSize); //这句话让每个页面都和原纸大小一样。document.NewPage();cb.AddTemplate(newPage, 0, 0);}else1  {document.SetPageSize(pagesize);document.NewPage();cb.AddTemplate(newPage, 0, pagesize.Height - newPage.Height); //- newPage.Height 解决itext高度的问题。默认情况下,itext 的 y 轴从底部减小以使其向上对齐。 //cb.AddTemplate(newPage, 1f, 0, 0, 1f, 0, pagesize.Height);//case 0:// writer.DirectContent.AddTemplate(importedPage, 1f, 0, 0, 1f, 0, 0);//break;//case 90:// writer .DirectContent.AddTemplate(importedPage, 0, -1f, 1f, 0, 0, pageHeight);//break;//case 180:// writer.DirectContent.AddTemplate(importedPage, - 1f, 0, 0, -1f, pageWidth, pageHeight);//break;//case 270:// writer.DirectContent.AddTemplate(importedPage, 0, 1f, -1f, 0 , pageWidth, 0);//中断;//默认:}}//reader.Close();}document.Close(); / /byte[] fileBuffer = fs.GetBuffer();return fs;}

但是上面的方法有一个问题。不管怎么改,都解决不了翻转问题。我猜是
cb.AddTemplate(newPage, 0, pagesize.Height - newPage.Height);
没啥用,以后再研究。

使用PdfCopy的第二种方法一般写法如下。

 公共 静态 PdfMemoryStream 合并PDFFilesstring[] fileList){//outMergeFile = Server.MapPath(outMergeFile );//if (outMergeFile == null)//{ // outMergeFile = "d:\\" + DateTime.Now.ToString("yyyy-MM-dd HH:mm: ss") + new Random().Next(1000) + ".pdf";//} PdfReader 阅读器 = null;文档文档 = new 文档();PdfMemoryStream fs = new PdfMemoryStream();fs.AllowClose = false;PdfCopy p = new  PdfSmartCopy(文档, fs); //生成目标PDF文件m.genealogy-computer-tips.com(); for (int i = 0; i < fileList.Length; i++){try {//var fs = new FileStream(outMergeFile , 文件模式.Create); 阅读器 =  PdfReader(fileList[i]); //读取源文件 int n = reader.NumberOfPages; //获取源文件的页数PdfDictionary pd;for (int j =  ;j <= n;j++){pd = 读者。 GetPageN(j);//pd.Put(PdfName.ROTATE, new PdfNumber(90)); // 顺时针旋转90°}for (int page = 0; page < n; ){ p.AddPage(p.GetI importedPage(阅读器, ++page ));}reader.Close();//这个需要关闭。否则文件会被占用而无法释放。 } catch(例外){ 抛出 例外("无法打开原始PDF文档,文件路径为:"  + 文件List[i], ex);} }document.Close();//byte[] fileBuffer = fs.GetBuffer(); return fs;}

这第二种方法也是不行的。。经过长时间的猜测和实验,发现这个方法解决不了问题...永远都会从 A5 更改为 A4 时翻转...

经过4天的努力和尝试,我终于完成了。
我的方法只适用于目标大小确定的情况。如果目标大小不确定,需要考虑其他方法

? ) /// 纸张尺寸/// 报告单上的徽标公共 静态MemoryStream mergePDFStream(Stream[] 文件,iTextSharp.text.Rectangle 页面大小 = null,LogoImgConfig 徽标 = null ){文档文档;if (pagesize == null){document = new Document();//pagesize = PageSize.A4; } 其他{文档= new Document(pagesize);}//var fs = new FileStream(outMergeFile, FileMode.Create); PdfMemoryStream fs = PdfMemoryStream();fs 。 AllowClose = false;//PdfCopy pcopy = new PdfSmartCopy(document, fs); // 生成目标PDF文件 //pcopy.ChangePageSize(pagesize);PdfWriter write = PdfWriter.GetInstance(document, fs); write.CloseStream = false; //不自动关闭内存流。 m.genealogy-computer-tips.com();//文档. NewPage();PdfContentByte cb = m.genealogy-computer-tips.comContent;for (int i = 0; i < 文件.长度; i++){try {//File.AppendAllText("d: \\ttt.txt", "***** 开始处理" + i + "第个文件******\r\n");//var fs = new FileStream(outMergeFile, FileMode 。创造); PdfReader 阅读器 = new PdfReader(files[i]); //读取源文件//var pdfVersion = reader.Pdf Version;/ /var pdfVersion = reader.PdfVersion;//PdfDictionary res = (PdfDictionary)PdfReader.GetPdfObject(pg. Get(PdfName.RESOURCES));//PdfDictionary xobj = (PdfDictionary)PdfReader.GetPdfObject(res.Get(PdfName.;/*添加LOGO图片。*/if (logo != null){ //newPage.AddImage();//创建标志图片对象 logoimg = iTextSharp.text.Image.GetInstance(logo.ImgUri );//logoimg.BackgroundColor = m.genealogy-computer-tips.com;//logoimg.Border = 1; //logoimg.BorderColor = m.genealogy-computer-tips.com;logoimg.ScaleToFit(new iTextSharp.text.Rectangle(logo.Width, logo.Height));//设置图片指定大小/ / img .ScaleToFit(140F, 320F);//img.Rotation = 旋转;//按比例缩放 //img.ScalePercent(50);// logoimg.PlainHeight == logo .Height相同。logoimg.SetAbsolutePosition(logo.Left, pagesize.Height - logo.Height - m.genealogy-computer-tips.com);//y轴原点在左下角。 } //img.Width = 50;//img.SetAbsolutePosition(10, 20);//img.Rotation = 270;//write.DirectContent.Add图片(img); int n = reader.NumberOfPages; //获取源文件的页数for (int pageIndex = 1; pageIndex <= n; pageIndex++){ // var 旋转= reader.GetPageRotation(pageIndex); //var pd = reader.GetPageN(pageIndex);//pd.Put(PdfName.ROTATE, new PdfNumber(90)); //先修改参数内容,然后GetImportedPagevar newPage = write.GetImportedPage(reader, pageIndex);//if (pdfVersion <= '3') //版本1.3或之前版本坐标系不同。它需要旋转90度。 //if(newPage.Height == pagesize.Width) //这种写法容错性较差,小数部分会改为如下。//如果旧纸张的高度等于目标纸张的宽度,则直接旋转90度。例如A5的高度等于A4的宽度//if (Math.Abs​​(newPage.Height - pagesize.Width) < 5){document.NewPage() ;文档.SetPageSize(页面大小); // 这句话让每一页都和原纸的尺寸一致。 true, true);// 0,-1,1,0,用于旋转pdf内容//将图片添加到内容页指定位置b 宽度 c 高度 e 底部 f 左// cb.AddImage(img, 0, 32F, 32F, 0, 50F, 20);//write.DirectContent.AddImage(img); //添加图片}else //4,5,6,7{document.NewPage();document.SetPageSize(pagesize); //这句话使得每一页都和原纸尺寸一样。 cb.AddTemplate(newPage, 0, pagesize.Height - newPage.Height);//将图片添加到内容页指定位置b width c height e Bottom f left/ /write.DirectContent.AddImage(img); //添加图片 }//将图片添加到内容页指定位置 b width c height e Bottom f left// cb.AddImage(img, 0, 100, 100, 0 , 10, 10); 如果(logo != null){ //此添加的图片必须位于复制页面的下方。 cb.AddImage(logoimg);}}logoimg = nu ll ;//reader.Close();//这个需要关闭。否则文件会被占用而无法释放。 }catch(例外){1例外( 》解析原始PDF文档失败,文件路径为: " + 文件[i], ex);}}if (document.I sOpen() ){document.Close();}//fs.Close();//byte[] fileBuffer = fs.GetBuffer();fs.Position = 0; //使指针指向第一个位置。return fs;}