使用C#中的ITextSharp将文本框添加到现有pdf的右上角

时间:2017-03-20 09:11:34

标签: itext sharp

我想使用c#在现有pdf的右上角添加一个TextBox,但我无法完成它。我写了下面的代码,但它没有帮助解决问题,任何人都可以建议我

using (MemoryStream stream = new MemoryStream())
{
        PdfReader reader = new PdfReader(bytes);               
        PdfReader.unethicalreading = true;
        Paragraph p = new Paragraph();
        Document doc = new Document();

        using (PdfStamper stamper = new PdfStamper(reader, stream))
        {
            PdfContentByte canvas = stamper.GetOverContent(1);
            iTextSharp.text.Rectangle size = reader.GetPageSizeWithRotation(1);


            //PdfContentByte cb = null;
            //PdfImportedPage page;
            int pages = reader.NumberOfPages;                    
            for (int i = 1; i <= pages; i++)
            {
                var size1 = reader.GetPageSize(i);
                w = size1.Width;
                h = size1.Height;
                stamper.FormFlattening = true;

                TextField tf = new TextField(stamper.Writer, new iTextSharp.text.Rectangle(0, 0, 300, 100), displaytext);
                //Change the orientation of the text
                tf.Rotation = 0;
                stamper.AddAnnotation(tf.GetTextField(), i);
            }
        }
        bytes = stream.ToArray();
}
File.WriteAllBytes(str, bytes);

1 个答案:

答案 0 :(得分:0)

由于OP在对问题的评论中澄清,他想要

  • 将文字添加为页面右下角的页面内容,
  • 以前存在的页面内容将被删除。

这个的简单实现包括

  • 首先使用填充矩形和
  • 覆盖现有页面内容
  • 然后在那里写文字。

使用这些辅助方法可以实现这些任务:

void EmptyTextBoxSimple(PdfStamper stamper, int pageNumber, Rectangle boxArea, BaseColor fillColor)
{
    PdfContentByte canvas = stamper.GetOverContent(pageNumber);
    canvas.SaveState();
    canvas.SetColorFill(fillColor);
    canvas.Rectangle(boxArea.Left, boxArea.Bottom, boxArea.Width, boxArea.Height);
    canvas.Fill();
    canvas.RestoreState();
}

ColumnText GenerateTextBox(PdfStamper stamper, int pageNumber, Rectangle boxArea)
{
    PdfContentByte canvas = stamper.GetOverContent(pageNumber);
    ColumnText columnText = new ColumnText(canvas);
    columnText.SetSimpleColumn(boxArea);
    return columnText;
}

E.g。像这样:

using (PdfReader reader = new PdfReader(source))
using (PdfStamper stamper = new PdfStamper(reader, new FileStream(dest, FileMode.Create)))
{
    Rectangle cropBox = reader.GetCropBox(1);
    Rectangle bottomRight = new Rectangle(cropBox.GetRight(216), cropBox.Bottom, cropBox.Right, cropBox.GetBottom(146));
    EmptyTextBoxSimple(stamper, 1, bottomRight, BaseColor.WHITE);
    ColumnText columnText = GenerateTextBox(stamper, 1, bottomRight);
    columnText.AddText(new Phrase("Some test text to draw into a text box in the lower right corner of the first page"));
    columnText.Go();
}

对于此源页面

source page

示例代码生成此

result page

附录

OP在评论中指出

  

它适用于所有文件,但对于某些pdf文件,它显示在中间

最终他提供了一个问题发生的sample file。事实上,有了这个文件,问题就可以重现了。

问题的原因是示例文件中的页面使用页面旋转,iText(仅)部分允许用户忽略。特别是iText在旋转后自动旋转文本直立并转换坐标,但是当检索页面的裁剪框时,仍然必须在使用它之前应用旋转坐标。因此,一个更完整的例子是这样的:

using (PdfReader reader = new PdfReader(source))
using (PdfStamper stamper = new PdfStamper(reader, new FileStream(dest, FileMode.Create)))
{
    Rectangle cropBox = reader.GetCropBox(1);
    int rotation = reader.GetPageRotation(1);
    while (rotation > 0)
    {
        cropBox = cropBox.Rotate();
        rotation -= 90;
    }
    Rectangle bottomRight = new Rectangle(cropBox.GetRight(216), cropBox.Bottom, cropBox.Right, cropBox.GetBottom(146));
    EmptyTextBoxSimple(stamper, 1, bottomRight, BaseColor.WHITE);
    ColumnText columnText = GenerateTextBox(stamper, 1, bottomRight);
    columnText.AddText(new Phrase("Some test text to draw into a text box in the lower right corner of the first page"));
    columnText.Go();
}