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 合并PDFFiles( string[] 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天的努力和尝试,我终于完成了。
我的方法只适用于目标大小确定的情况。如果目标大小不确定,需要考虑其他方法