C# 如何知道文本是否超过itextSharp中的填充框

C# 如何知道文本是否超过itextSharp中的填充框,c#,itextsharp,itext,C#,Itextsharp,Itext,我正在使用以下代码: PdfReader PDFReader = new PdfReader("c:\\file.pdf"); FileStream Stream = new FileStream("c:\\new.pdf", FileMode.Create, FileAccess.Write); PdfStamper PDFStamper = new PdfStamper(PDFReader, Stream); for (int iCount = 0; iCount < PDFSt

我正在使用以下代码:

PdfReader PDFReader = new PdfReader("c:\\file.pdf");

FileStream Stream = new FileStream("c:\\new.pdf", FileMode.Create, FileAccess.Write);

PdfStamper PDFStamper = new PdfStamper(PDFReader, Stream);

for (int iCount = 0; iCount < PDFStamper.Reader.NumberOfPages; iCount++)
{
    iTextSharp.text.Rectangle PageSize = PDFReader.GetCropBox(iCount + 1);
    PdfContentByte PDFData = PDFStamper.GetOverContent(iCount + 1);
    BaseFont baseFont = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED);
    PDFData.BeginText();
    PDFData.SetColorFill(CMYKColor.RED);
    PDFData.SetFontAndSize(baseFont, 20);
    PDFData.ShowTextAligned(PdfContentByte.ALIGN, SAMPLE DOCUMENT", (PageSize.Right + PageSize.Left) / 2, (PageSize.Top + PageSize.Bottom) / 2, 45);
    PDFData.EndText();
}

PDFStamper.Close();
PDFReader.Close();
如果上面的方法不起作用,那么我的下一步就是使用一个PNG图像,其中包含覆盖的文本,其背景是透明的。然后根据页面大小调整图像大小,然后覆盖它


不过,我更喜欢第一部分。如果没有,那么我将选择第二个选项。

在进行一些小计算后,此方法应计算用于此类垂直文本的最大字体大小,并应用它:

void Stamp(PdfContentByte cb, Rectangle rect, BaseFont bf, string text)
{
    int altitude = Math.Max(bf.GetAscent(text), bf.GetDescent(text));
    int width = bf.GetWidth(text);
    double horizontalFit = Math.Sqrt(2.0) * 1000 * (rect.Left + rect.Right) / (width + 2 * altitude);
    double verticalFit = Math.Sqrt(2.0) * 1000 * (rect.Bottom + rect.Top) / (width + 2 * altitude);
    double fit = Math.Min(horizontalFit, verticalFit);

    cb.BeginText();
    cb.SetColorFill(CMYKColor.RED);
    cb.SetFontAndSize(bf, (float) fit);
    cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, text, (rect.Right + rect.Left) / 2, (rect.Top + rect.Bottom) / 2, 45);
    cb.EndText();
}
你可以这样称呼它:

using (PdfReader reader = new PdfReader(source))
using (PdfStamper stamper = new PdfStamper(reader, new FileStream(dest, FileMode.Create, FileAccess.Write)))
{
    for (int iCount = 0; iCount < reader.NumberOfPages; iCount++)
    {
        Rectangle PageSize = reader.GetCropBox(iCount + 1);
        PdfContentByte PDFData = stamper.GetOverContent(iCount + 1);
        BaseFont baseFont = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED);
        Stamp(PDFData, PageSize, baseFont, "SAMPLE DOCUMENT");
    }
}
使用(PdfReader阅读器=新PdfReader(源))
使用(PdfStamper stamper=newpdfstamper(读卡器,新文件流(dest,FileMode.Create,FileAccess.Write)))
{
对于(int-iCount=0;iCount
(顺便说一下,我使用了你的
BaseFont
,但是你应该知道,对于像
BaseFont.HELVETICA
这样的标准14种字体,iText(Sharp)将忽略
BaseFont.EMBEDDED

结果如下所示:

using (PdfReader reader = new PdfReader(source))
using (PdfStamper stamper = new PdfStamper(reader, new FileStream(dest, FileMode.Create, FileAccess.Write)))
{
    for (int iCount = 0; iCount < reader.NumberOfPages; iCount++)
    {
        Rectangle PageSize = reader.GetCropBox(iCount + 1);
        PdfContentByte PDFData = stamper.GetOverContent(iCount + 1);
        BaseFont baseFont = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED);
        Stamp(PDFData, PageSize, baseFont, "SAMPLE DOCUMENT");
    }
}

PS:如果您(如您的问题所述)确实不想使用大于20的字体大小,则必须将
Min
值再次调整为20