1

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

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

1 回答 1

1

正如 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;
}

比如像这样:

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

对于此源页面

源页面

示例代码生成这个

结果页面

附录

OP在评论中指出

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

最终,他提供了一个出现问题的示例文件。事实上,有了这个文件,这个问题就可以重现了。

问题的原因是示例文件中的页面使用页面旋转,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();
}
于 2017-03-29T16:18:24.750 回答