2012-09-06 29 views
1

我使用iTextSharp的加入多發PDF文檔,並添加腳註。 我的代碼工作正常 - 除了橫向頁面 - 它沒有檢測到頁面旋轉 - 頁腳不centerd景觀:iTextSharp的PdfCopy和橫向頁面

public static int AddPagesFromStream(Document document, PdfCopy pdfCopy, Stream m, bool addFooter, int detailPages, string footer, int footerPageNumOffset, int numPages, string pageLangString, string printLangString) 
    { 
     CreateFont(); 
     try 
     { 
      m.Seek(0, SeekOrigin.Begin); 
      var reader = new PdfReader(m); 

      // get page count 
      var pdfPages = reader.NumberOfPages; 
      var i = 0; 

      // add pages 
      while (i < pdfPages) 
      { 
       i++; 

       // import page with pdfcopy 
       var page = pdfCopy.GetImportedPage(reader, i); 

       // get page center 
       float posX; 
       float posY; 
       var rotation = page.BoundingBox.Rotation; 
       if (rotation == 0 || rotation == 180) 
       { 
        posX = page.Width/2; 
        posY = 0; 
       } 
       else 
       { 
        posX = page.Height/2; 
        posY = 20f; 
       } 

       var ps = pdfCopy.CreatePageStamp(page); 
       var cb = ps.GetOverContent(); 

       // add footer 
       cb.SetColorFill(BaseColor.WHITE); 
       var gs1 = new PdfGState {FillOpacity = 0.8f}; 
       cb.SetGState(gs1); 
       cb.Rectangle(0, 0, document.PageSize.Width, 46f + posY); 
       cb.Fill(); 

       // Text 
       cb.SetColorFill(BaseColor.BLACK); 
       cb.SetFontAndSize(baseFont, 7); 
       cb.BeginText(); 

       // create text 
       var pages = string.Format(pageLangString, i + footerPageNumOffset, numPages); 
       cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, printLangString, posX, 40f + posY, 0f); 
       cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, footer, posX, 28f + posY, 0f); 
       cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, pages, posX, 20f + posY, 0f); 
       cb.EndText(); 

       ps.AlterContents(); 

       // add page to new pdf 
       pdfCopy.AddPage(page); 
      } 

      // close PdfReader 
      reader.Close(); 
      // return number of pages 
      return i; 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e); 
      return 0; 
     } 
    } 

如何檢測在這種情況下,頁面旋轉(例如,橫向)格式?給出的例子適用於PdfReader,但不適用於PdfCopy。

編輯: 爲什麼需要PdfCopy?我試圖複製一個字的PDF導出。當您嘗試使用PdfReader複製頁面時,某些單詞超鏈接將不起作用。只有PdfCopy傳輸所有需要的頁面信息。

編輯:(解決) 您需要使用reader.GetPageRotation(我);

回答

3

您需要使用reader.GetPageRotation(我);

解決代碼:

public static int AddPagesFromStream(Document document, PdfCopy pdfCopy, Stream m, bool addFooter, int detailPages, string footer, int footerPageNumOffset, int numPages, string pageLangString, string printLangString) 
    { 
     CreateFont(); 
     try 
     { 
      m.Seek(0, SeekOrigin.Begin); 
      var reader = new PdfReader(m); 

      // get page count 
      var pdfPages = reader.NumberOfPages; 
      var i = 0; 

      // add pages 
      while (i < pdfPages) 
      { 
       i++; 

       // import page with pdfcopy 
       var page = pdfCopy.GetImportedPage(reader, i); 

       // get page center 
       float posX; 
       float posY; 
       var rotation = reader.GetPageRotation(i); 
       if (rotation == 0 || rotation == 180) 
       { 
        posX = page.Width/2; 
        posY = 0; 
       } 
       else 
       { 
        posX = page.Height/2; 
        posY = 20f; 
       } 

       var ps = pdfCopy.CreatePageStamp(page); 
       var cb = ps.GetOverContent(); 

       // add footer 
       cb.SetColorFill(BaseColor.WHITE); 
       var gs1 = new PdfGState {FillOpacity = 0.8f}; 
       cb.SetGState(gs1); 
       cb.Rectangle(0, 0, document.PageSize.Width, 46f + posY); 
       cb.Fill(); 

       // Text 
       cb.SetColorFill(BaseColor.BLACK); 
       cb.SetFontAndSize(baseFont, 7); 
       cb.BeginText(); 

       // create text 
       var pages = string.Format(pageLangString, i + footerPageNumOffset, numPages); 
       cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, printLangString, posX, 40f + posY, 0f); 
       cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, footer, posX, 28f + posY, 0f); 
       cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, pages, posX, 20f + posY, 0f); 
       cb.EndText(); 

       ps.AlterContents(); 

       // add page to new pdf 
       pdfCopy.AddPage(page); 
      } 

      // close PdfReader 
      reader.Close(); 
      // return number of pages 
      return i; 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e); 
      return 0; 
     } 
    } 
1

在您的代碼示例,page的類型是PdfImportedPage的。你在要求它的包圍盒。 PdfImportedPage是PdfTemplate類型的,所以你要求XObject的邊界框。我懷疑這會起作用。

你應該問讀者對象的頁面的旋轉。我想你已經發現了你自己,因爲你說「給定的例子適用於PdfReader,但不適用於PdfCopy」。

+0

是 - 我做到了。但我不相信我需要這樣做兩次...一個PdfReader獲取所需的信息和一個PdfCopy來進行復制。 –