2011-03-17 328 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); 
相關問題