itextsharp添加页脚文本但部分可见(C#.NET)

时间:2016-04-19 13:34:40

标签: c# itextsharp

我一直在使用itextsharp SDK,我有一个包含一些数据的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);
}

我还附上了pdf截图的输出,请参见截图。

Screenshot

提前致谢。

2 个答案:

答案 0 :(得分:1)

您已选择使用iText API的一个非常低级别的部分来绘制文本,该部分基本上代表PDF中使用的确切文本绘制说明。

这些绘图说明不使用您提供的 y 坐标作为文本的底部,而是使用基线

g glyph bounding box with base line

字形原点所在的行是基线。

因此,如果您使用页面底部的 y 坐标进行文本绘制,则基线下方的字形部分将被截断。

为防止出现这种情况,您可以查询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) 

并从y坐标中减去该值。

或者您可以使用更高级别的API替代方案,其中一些可以让您定义一个用于绘制文本的框。

另一个问题可能是您假设页面底部位于 y 坐标0处。虽然情况经常如此,但不一定如此。因此,您可能需要考虑相关页面的裁剪框的底部。

答案 1 :(得分: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)

就像我说的那样,我不确定这是最好的方法,我想这比你问的要多(我猜你可以分辨出你需要它的哪一部分),但这是有用的我请你不要downvote:)