2011-03-17 325 views
15

我正在使用iTextSharp将多个PDF文件合并到一个PDF中。我在网络上发现了一个code sampletwo以了解如何完成此任务。iTextSharp如何旋转/切换页面从横向到纵向

它们都工作,没有明显的问题,因为我可以将多个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的页面布局,肖像,之前我也跟cb.AddTemplate...添加到新合并的PDF文档的链接的代码?

PS。确定页面是否是横向或纵向我使用如此获得的code下面件(适合于代码上面的例子):

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

任何帮助,将不胜感激。

谢谢

回答

6

正如你发现的那样,你不能总是依靠PdfReader.GetPageRotation()

例如,如果文档对象像这样创建:

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

PdfReader.GetPageRotation()总是返回0

一个真的简化的方式来决定一个页面是否是纵向还是横向用于比较您组合的每个PDF的每个页面的宽度和高度。如果宽度大于单个页面的高度,请将字典条目添加到该页面并明确设置其旋转。像下面HTTP handler

<%@ 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 classmailing list中的here's a good thread解释iText [Sharp]如何在每个页面中存储页面旋转。当然,你可能想投资the book

+0

谢谢。奇迹般有效。 – Riaan 2011-03-22 08:52:17

10

我用过这样的东西。

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; 
} 
+0

谢谢。我也尝试过,矩形路线。当我在Landscape中使用PDF运行代码时,矩形值为: base {iTextSharp.text.Element} = {Rectangle:841.8898x595.2756(rot:0 degrees)} 当我使用PDF运行相同的代码时纵向矩形值为: base {iTextSharp.text.Element} = {Rectangle:595x842(rot:0度)} 从不同的XY值可以看到文件是横向或纵向,但旋转保持为0在这两种情况下。 – Riaan 2011-03-18 03:48:50

+0

我必须补充一点,如果按照我的示例代码使用XYRatio,页面会翻过来,这很好,但它并不是拉伸整个A4页面,而是拉长了一半。如果我可以找到有关AddTemplate参数的更多详细信息,而不是'float a'...'float f' – Riaan 2011-03-18 04:01:05

+0

在我的情况下效果更好,感谢代码! – VinnyG 2012-02-17 15:00:09

3

与例如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建造和他们有相同的大小,所以我用一号文件的第一页(我想)

+0

谢谢,这与我的ssrs报告做了诡计。 – Lareau 2013-07-29 19:33:31

0
// 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); 
相关问题