2013-01-08 111 views
0

我目前正在編寫pdf api。有一種方法可將具有不同方向的選定頁面合併到一個文檔中。在運行時,如果選定的頁面處於橫向模式,我想要像這樣合併,但目前所有顯示的都是縱向。使用橫向和縱向文檔

我已經在網上查看過幾篇文章,但沒有一篇幫助過。

這是我目前有:

public static void MergePDF(string source, string destination, PageCollection pages) { 
     try { 
      PdfReader reader = new PdfReader(new RandomAccessFileOrArray(source), null); 


      Document doc = new Document(); 
      PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream(destination, FileMode.Create)); 
      doc.Open(); 
      PdfContentByte contentByte = writer.DirectContent; 

      foreach (Page page in pages) { 
       float width = reader.GetPageSize(page.Number).Width; 
       float height = reader.GetPageSize(page.Number).Height; 


       PdfImportedPage pdfImportedPagepage = writer.GetImportedPage(reader, page.Number); 

       doc.NewPage(); 
       if (width > height) { 
        doc.SetPageSize(PageSize.A4.Rotate()); 
       } else { 
        doc.SetPageSize(PageSize.A4); 
       } 
       iTextSharp.text.Rectangle psize = reader.GetPageSizeWithRotation(page.Number); 

       switch (psize.Rotation) { 
        case 0: 
         contentByte.AddTemplate(pdfImportedPagepage, 1f, 0, 0, 1f, 0, 0); 
         break; 
        case 90: 
         contentByte.AddTemplate(pdfImportedPagepage, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(page.Number).Height); 
         break; 
        case 180: 
         contentByte.AddTemplate(pdfImportedPagepage, -1f, 0, 0, -1f, 0, 0); 
         break; 
        case 270: 
         contentByte.AddTemplate(pdfImportedPagepage, 0, 1.0F, -1.0F, 0, reader.GetPageSizeWithRotation(page.Number).Width, 0); 
         break; 
        default: 
         break; 
       } 

      } 

      doc.Close(); 

     } catch (Exception ex) { 

     } 
    } 

感謝您的幫助。

+1

是否有一個特殊的原因,你爲什麼使用'PdfWriter'而不是'PdfCopy'? 'PdfCopy'只是簡單地使用該頁面,包括其尺寸和方向... – mkl

+0

謝謝你的工作。 – sinestro

回答

1

每MKL sugguestion,這工作:

Document doc = new Document(); 
      PdfCopy copy = new PdfCopy(doc, new FileStream(destination, FileMode.Create)); 
      doc.Open(); 

      foreach (Page page in pages) { 
       doc.NewPage(); 
       copy.AddPage(copy.GetImportedPage(reader, page.Number)); 
      } 

感謝。

+0

不客氣。請考慮閱讀(免費提供)[iText in Action - 第二版](http://itextpdf.com/book/)[第6章](http://www.manning.com/lowagie2/samplechapter6.pdf)有關如何使用iText來操作PDF的更多信息。 – mkl

3
if (width > height) { 
        doc.SetPageSize(PageSize.A4.Rotate()); 

你已經告訴你的程序,如果它比它高(橫向)寬,那麼它應該旋轉成肖像。只需刪除該旋轉段

   switch (psize.Rotation) { 
        case 0: 
         contentByte.AddTemplate(pdfImportedPagepage, 1f, 0, 0, 1f, 0, 0); 
         break; 
        case 90: 
         contentByte.AddTemplate(pdfImportedPagepage, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(page.Number).Height); 
         break; 
        case 180: 
         contentByte.AddTemplate(pdfImportedPagepage, -1f, 0, 0, -1f, 0, 0); 
         break; 
        case 270: 
         contentByte.AddTemplate(pdfImportedPagepage, 0, 1.0F, -1.0F, 0, reader.GetPageSizeWithRotation(page.Number).Width, 0); 
         break; 
        default: 
         break; 

這部分計算頁面的方向知道多少旋轉它,如果你刪除此所有頁面都將導入完全一樣的。如果你離開這一切將被旋轉到垂直放置

+0

我已經嘗試過,沒有這一行。我甚至試過這個:doc.SetPageSize(PageSize.A4_LANDSCAPE);仍然顯示有肖像 – sinestro

+0

以上是編輯 – RhysW

+0

@sinestro re-re-reedited;) – RhysW