2016-04-19 4 views
0

Я использую itextsharp SDK, у меня есть pdf-файл с некоторыми данными, я хочу добавить текст заголовка или нижнего колонтитула, он добавляет его, но на самый конец страницы, текст заголовка/нижнего колонтитула частично виднаitextsharp, добавляя текст нижнего колонтитула, но его частично видимый (C# .NET)

Пожалуйста, смотрите пример кода:

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); 
} 

Я также прилагается вывод экрана PDF, пожалуйста, см скриншот.

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

линия глифа происхождение на это базовой линии.

Таким образом, если вы используете координату нижней части страницы для текстового рисунка, координаты нижней части страницы, то части глифов ниже базовой линии будут обрезаны.


Чтобы предотвратить это, вы можете запросить ваш BaseFont экземпляр, как низкие ящики Ограничивающих в строке, которую вы хотите сделать можно с помощью

/** 
* 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) 

и вычесть это значение из ваших у координат.

Или вы можете использовать альтернативы API более высокого уровня, некоторые из которых позволяют вам определить поле, внутри которого будет нарисован текст.


Другой вопрос, может быть, вы предполагаете, в нижней части страницы, чтобы быть в у координат 0. В то время как это часто бывает, это не обязательно так. Таким образом, вы можете принять во внимание нижнюю часть поля обрезки рассматриваемой страницы.

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)

Как я уже сказал, я не уверен, что это лучший способ сделать это, и я думаю, это больше, чем вы спросили (я предполагаю, что вы можете сказать, какая часть этого вы нужно), но это то, что работал для меня, поэтому, пожалуйста, не спускайте вниз :)