iTextSharp如何旋转/切换页面从横向到纵向

我正在使用iTextSharp将多个PDF文件合并为一个Pdf。 我在网上找到了一些关于如何完成此任务的代码示例 。

它们都可以工作,没有明显的问题,因为我能够将多个PDF文件合并为一个PDF。

我所拥有的问题是我希望所有页面都在PORTRAIT中,因为一些PDF文件在LANDSCAPE中有页面,我希望它们可以旋转到PORTRAIT。 我不介意他们要么颠倒,要么侧身,但他们都必须是肖像。

查看列出的示例中的代码部分:

page = writer.GetImportedPage(reader, i); rotation = reader.GetPageRotation(i); 

始终将页面旋转值返回为0(零),因此代码部分

 if (rotation == 90 rotation == 270) { cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(i).Height); } 

永远不会被执行(如果这是应该做的,旋转页面)。

所以,根据第一个代码示例page = writer.GetImportedPage(reader, i)的链接中的代码page = writer.GetImportedPage(reader, i)在将其添加到新的合并之前,我将如何将页面的页面布局从Landscape更改为Portrait使用cb.AddTemplate... PDF文档cb.AddTemplate...

PS。 确定页面是横向还是纵向我使用从SO获得的以下代码 (适用于上面的代码示例):

 float pageXYRatio = page.Width / page.Height; if (XYRatio > 1f) { //page is landscape } else { //page is portrait } 

任何帮助,将不胜感激。

谢谢

正如您所知 ,您不能总是指望PdfReader.GetPageRotation() 。

例如,如果Document对象是这样创建的:

 Document doc = new Document( new Rectangle(792, 612) ); 

PdfReader.GetPageRotation()始终返回0。

确定页面是纵向还是横向的一种非常简单的方法是比较您要合并的每个PDF的每个页面的宽度和高度。 如果宽度大于单个页面的高度,请向该页面添加字典条目并明确设置其旋转。 像下面的HTTP处理程序 :

 <%@ WebHandler Language='C#' Class='LandscapeToPortrait' %> using System; using System.IO; using System.Web; using iTextSharp.text; using iTextSharp.text.pdf; public class LandscapeToPortrait : IHttpHandler { public void ProcessRequest (HttpContext context) { HttpResponse Response = context.Response; Response.ContentType = "application/pdf"; PdfReader[] readers = { new PdfReader(CreateReaderBytes(false)), new PdfReader(CreateReaderBytes(true)) }; using (Document doc = new Document()) { using (PdfCopy copy = new PdfCopy(doc, Response.OutputStream)) { doc.Open(); foreach (PdfReader reader in readers) { int n = reader.NumberOfPages; for (int page = 0; page < n;) { ++page; float width = reader.GetPageSize(page).Width; float height = reader.GetPageSize(page).Height; if (width > height) { PdfDictionary pageDict = reader.GetPageN(page); pageDict.Put(PdfName.ROTATE, new PdfNumber(90)); } copy.AddPage(copy.GetImportedPage(reader, page)); } } } } } public bool IsReusable { get { return false; } } public byte[] CreateReaderBytes(bool isLandscape) { using (MemoryStream ms = new MemoryStream()) { Rectangle r = isLandscape ? new Rectangle(792, 612) : PageSize.LETTER ; using (Document doc = new Document(r)) { PdfWriter.GetInstance(doc, ms); doc.Open(); for (int i = 0; i < 5; ++i) { doc.Add(new Phrase("hello world")); doc.NewPage(); } } return ms.ToArray(); } } } 

看一下PdfDictionary类 。 这里有一个来自邮件列表 的好post ,解释了iText [Sharp]如何在每个页面中存储页面旋转。

当然,你可能想投资本书 。

我用过这样的东西。

 cb.PdfDocument.NewPage(); PdfImportedPage page1 = writer.GetImportedPage(reader, i); Rectangle psize = reader.GetPageSizeWithRotation(i); switch (psize.Rotation) { case 0: cb.AddTemplate(page1, 1f, 0, 0, 1f, 0, 0); break; case 90: cb.AddTemplate(page1, 0, -1f, 1f, 0, 0, psize.Height); break; case 180: cb.AddTemplate(page1, -1f, 0, 0, -1f, 0, 0); break; case 270: cb.AddTemplate(page1, 0, 1.0F, -1.0F, 0, psize.Width, 0); break; default: break; } 

用这个例子http://alex.buayacorp.com/merge-pdf-files-with-itext-and-net.html我添加了以下行:

 newDocument.SetPageSize(documents[0].GetPageSizeWithRotation(1));* newDocument = new Document(); PdfWriter pdfWriter = PdfWriter.GetInstance(newDocument, outputStream); // START PAGE ORIENTATION FROM 1st Document 1st Page newDocument.SetPageSize(documents[0].GetPageSizeWithRotation(1)); // END PAGE ORIENTATION newDocument.Open(); PdfContentByte pdfContentByte = pdfWriter.DirectContent; 

我的pdf是用SSRS构建的,它们的大小相同,所以我使用第一篇文档的第一页(我想)

 // Instantiate the imported page as an Image const float HALF_INCH = 36f; // currentPosY is used to keep track of the current Y position. PdfImportedPage page = writer.GetImportedPage(reader, j); float scale = ((currentPosY - HALF_INCH - 10f) / page.Height); Image imgP = Image.GetInstance(page); if (page.Width > page.Height) { // Auto-detect landscape scale = ((currentPosY - HALF_INCH - 10f) / page.Width); imgP.RotationDegrees = 90f; // could be 270f } imgP.ScalePercent(scale * 100f); imgP.SetAbsolutePosition(HALF_INCH, HALF_INCH); imgP.CompressionLevel = 9; imgP.Border = Image.BOX; imgP.BorderWidth = 1f; document.Add(imgP);