2017-03-02 150 views
0

從我的ASP.net MVC應用程序中,我使用iTextSharp和XSLT作爲模板生成PDF。這些網頁應該是以風景爲導向的。如何使用iTextSharp爲橫向中生成的頁面添加頁腳到PDF文檔

以下是橫向模式下的PDF文檔。

new Document(PageSize.LETTER.Rotate(), marginLeft, marginRight, marginTop, marginBottom); 

從XSLT我得到的HTML和構建PDF內容如下:

public void ParseXhtmlContents(string xhtml) 
{ 
    //Instantiate handler 
    var elementhandler = new ElementHandler(); 
    //Bind a reader to text 
    using (TextReader sr = new StringReader(xhtml)) 
    { 
     //Parse 
     XMLWorkerHelper.GetInstance().ParseXHtml(elementhandler, sr); 
    } 

    //Loop through each element 
    foreach (var element in elementhandler.Elements) 
    { 
     var div = element as PdfDiv; 
     if (div != null) 
      foreach (var table in div.Content.OfType<PdfPTable>()) 
      { 
       table.HeaderRows = 1; 
      } 
     _iTextDocument.Add(element); 
    } 
} 

生成PDF字節,我想添加頁腳後如下

private byte[] AddPageHeader(byte[] pdf, float marginLeft, float marginRight, float marginTop, float marginBottom) 
{ 
    using (var stream = new MemoryStream()) 
    { 
     stream.Write(pdf, 0, pdf.Length); 
     var reader = new PdfReader(pdf); 
     var totalPage = reader.NumberOfPages; 
     var pageSize = reader.GetPageSize(1); 
     var document = new Document(pageSize, marginLeft, marginRight, marginTop, marginBottom); 
     var writer = PdfWriter.GetInstance(document, stream); 
     document.Open(); 
     var contentByte = writer.DirectContent; 
     var pageIndex = 0; 
     for (var page = 1; page <= reader.NumberOfPages; page++) 
     { 
      document.NewPage(); 
      pageIndex++; 
      var importedPage = writer.GetImportedPage(reader, page); 
      contentByte.AddTemplate(importedPage, 0, 0); 
      contentByte.BeginText(); 
      var baseFont = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); 
      contentByte.SetFontAndSize(baseFont, 6); 
      contentByte.ShowTextAligned(PdfContentByte.ALIGN_CENTER, "-  " + pageIndex.ToString() + "  -", 300f, 20, 0); 
      contentByte.EndText(); 
      contentByte.SaveState(); 
      contentByte.SetColorStroke(new PdfSpotColor("black", new BaseColor(0, 0, 0)), 100); 
      contentByte.SetLineWidth(0.25f); 
      contentByte.Rectangle(20, 45, 572, 0.25f); 
      contentByte.FillStroke(); 
      contentByte.RestoreState(); 
     } 
     startingPageNumber = pageIndex; 
     document.Close(); 
     return stream.ToArray(); 
    } 
} 

如果我跳過添加頁碼的部分,我可以橫向生成PDF,內容按正確順序顯示,但是當我添加頁腳時,我得到以下結果,呈現的頁面e是肖像。

請參考附圖像輸出:

enter image description here

幫我出在哪裏我錯了,謝謝。

+0

1.創建新頁面,但不設置頁面大小。 2.通過將頁面作爲模板添加到其他頁面來複制頁面,可能會丟失很多信息。 1和2導致'丟失'你的頁面方向 –

+0

由於你首先解析元素並將它們添加到iText文檔中,解決此問題的更好方法是通過頁面事件。看看這個iText的例子:http://developers.itextpdf.com/examples/itext-action-second-edition/chapter-5#228-moviehistory2.java –

回答

0

我發現什麼是錯誤的

我改變了文檔創建的代碼如下:

var document = new Document(reader.GetPageSizeWithRotation(1), marginLeft, marginRight, marginTop, marginBottom); 

,並加入類似上述頁腳模板:

contentByte.AddTemplate(importedPage, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(pageIndex).Height); 
+0

你修補了一個壞的解決方案,以某種方式工作。一個好的解決方案會使用一個'PdfStamper'來代替。 – mkl

+0

@mkl我將來肯定會研究'PdfStamper',但這項工作有點緊迫,並且不能像現在一樣改變實現。謝謝 – RandomUser

相關問題