2016-04-19 15 views
0

私はitextsharp SDKを使用しています。データがあるpdfファイルがあります。ヘッダやフッタテキストを追加したいのですが、itextsharpフッターテキストを追加するが部分的に表示する(C#.NET)

私もPDFのスクリーンショットの出力を添付しました
PdfReader reader = new PdfReader("C:\Source pdf file.pdf"); 
string f_textPrefix = "Page No : 1"; 
using (MemoryStream memoryStream = new MemoryStream()) 
{ 
    PdfStamper pdfStamper = new PdfStamper(reader, memoryStream); 
    bool flag = false; 
    for (int i = 1; i <= reader.NumberOfPages; i++) 
    { 
     iTextSharp.text.Rectangle pageSize = reader.GetPageSizeWithRotation(i); 
     PdfContentByte pdfPageContents = pdfStamper.GetOverContent(i); 
     pdfPageContents.BeginText(); 
     BaseFont baseFont = BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, 
                  BaseFont.CP1252, 
                  false);       
     System.Drawing.Color m_Color = new System.Drawing.Color(); 
     pdfPageContents.SetFontAndSize(baseFont, Convert.ToInt32(p_objParam.pdfBatesDetail.FontSize)); 
     pdfPageContents.SetRGBColorFill(m_Color.R, m_Color.G, 
                m_Color.B); 
     // this is to set the cursor tp Bottom Middle 
     int yPos = 0; 
     yPos = PDFLayout.BottomHeight; 
     pdfPageContents.SetTextMatrix(pageSize.Width/2, yPos); 

     pdfPageContents.ShowText(f_textPrefix.Trim()); 

     pdfPageContents.EndText(); 
    } 
    pdfStamper.FormFlattening = true; // enable this if you want the PDF flattened. 
    pdfStamper.Close();    // Always close the stamper or you'll have a 0 byte stream. 
    byte []bt = btmemoryStream.ToArray(); 

    File.WriteAllBytes("C:\new_file.pdf", bt); 
} 

、スクリーンショットを参照してください。ページの一番最後には、ヘッダー/フッターのテキストは

サンプルコードを参照してください一部が表示されます。事前に

Screenshot

感謝。

+1

PDFLayout.BottomHeight = 0 p_objParam.pdfBatesDetail.FontSize = 5.0; これらはちょうどuser_definedオブジェクトですいくつかの値は、これらの値を考慮してください –

+0

私はあなたの問題を理解していません。 ** y **座標を選択します。あなたがそれを低く選んでテキストを切り取ったら、もっと大きな値を選ぶのはなぜですか? – mkl

+0

ページの下部に余白を追加することはできますが、それを行うにはテンプレートを作成する必要があると思います(これは私がやったやり方です)。 – Spluf

答えて

1

iText APIの非常に低いレベルの部分を使用してテキストを描画することを選択しました。これは基本的に、PDF内で使用される正確なテキスト描画命令を表しています。

g glyph bounding box with base line

グリフ起源は上にある行は次のとおりです。

これらの描画命令はYを使用していないテキストのとして与えるがベースラインとして座標ベースライン。

yテキストの描画のためにページの下部の座標を使用すると、ベースラインの下にあるグリフの部分が切り捨てられます。


を描きたい文字列中の低バウンディングボックスが
/** 
* Gets the descent of a <CODE>String</CODE> in points. The descent will always be 
* less than or equal to zero even if all the characters have an higher descent. 
* @param text the <CODE>String</CODE> to get the descent of 
* @param fontSize the size of the font 
* @return the dexcent in points 
*/ 
virtual public float GetDescentPoint(String text, float fontSize) 

を使用することができますどのようにあなたの BaseFontインスタンスを照会することができ、これを防止し、あなたのy座標からその値を減算します。

または、より高レベルのAPIの代替を使用できます。その中には、テキストが描画されるボックスを定義できるものがあります。


もう一つの問題は、あなたがこのよくあるケースですがが0をy座標であることをページの一番下を想定していることかもしれないが、それは必ずしもそうではありません。したがって、問題のページのクロップボックスの底を考慮する必要があるかもしれません。

1

まず最初に、私はiTextSharpについてよく分かりません。私は一度だけ使用しましたが、同じ問題があることを覚えています。ここでは私のために働いたものだ、と多分これはあまりにもあなたを助けることができる:

を私は次の拡張クラスを持っている:

public class ITextSharpExtension 
{ 
//Add pagination 
public class PageEventHelper : PdfPageEventHelper 
{ 
    PdfContentByte cb; 
    PdfTemplate template; 


    public override void OnOpenDocument(PdfWriter writer, Document document) 
    { 
     cb = writer.DirectContent; 
     template = cb.CreateTemplate(50, 50); 
    } 

    public override void OnEndPage(PdfWriter writer, Document document) 
    { 
     Font arial = FontFactory.GetFont("Arial", 10, GrayColor.GRAY); 
     base.OnEndPage(writer, document); 
     int pageN = writer.PageNumber; 
     BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); 
     string text = String.Format("Page {0} of ", pageN.ToString()); 
     float len = bf.GetWidthPoint(text, 8); 

     iTextSharp.text.Rectangle pageSize = document.PageSize; 

     cb.SetRGBColorFill(100, 100, 100); 

     cb.BeginText(); 
     cb.SetFontAndSize(bf, 10); 
     cb.SetTextMatrix(10, pageSize.GetBottom(10)); 
     cb.ShowText(text); 

     cb.EndText(); 

     cb.AddTemplate(template, 60, pageSize.GetBottom(10)); 
    } 

    public override void OnCloseDocument(PdfWriter writer, Document document) 
    { 
     base.OnCloseDocument(writer, document); 
     BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); 
     template.BeginText(); 
     template.SetFontAndSize(bf, 10); 
     template.SetTextMatrix(0, 0); 
     template.ShowText("" + (writer.PageNumber - 1)); 
     template.EndText(); 
    } 
} 

}

そして、それは下部に余白を追加するところ、この行は次のとおりです。 cb.AddTemplate(template, 60, pageSize.GetBottom(10));特にこの部分:pageSize.GetBottom(10)

私は、これはそれを行うための最善の方法であるか分からないし、私はあなたが(私はあなたがそれのどの部分を伝えることができます推測している尋ねた以上だと思い、言ったように必要)しかし、それは何ですか私のために働いたので、ダウンしないでください:)

関連する問題