iText - ColumnText中的新行

时间:2014-06-05 09:38:50

标签: c# itext

我正致力于在现有的pdf文档上插入某种水印的程序。水印不是图像,而是在程序工作期间生成的文本。我需要旋转文本,将其发送到页面中心,这些事情已经完成,但文本有很多行。所以我把新行字符" \ n"在短语中,但PDF在首次使用" \ n"之前仅打印字符。如何在pdf文档(主要是扫描的文档)上叠加一些文本并旋转它?

我的源代码(简化):

PdfContentByte canvas = stamper.GetOverContent(1);
String message = "some\n multiline \n expression";
Phrase text = new Phrase(text);
ColumnText.ShowTextAligned(canvas, Element.ALIGN_MIDDLE, text, size.Width / 2, size.Height / 2, 30);

2 个答案:

答案 0 :(得分:0)

记录:ShowTextAligned()方法仅适用于单行。如果您想要多行,则需要使用ColumnText对象,使用Rectangle方法定义SetSimpleColumn()并使用Go()方法绘制内容。

如果要旋转此类Rectangle,则需要先创建PdfTemplate。将ColumnText渲染到此PdfTemplate并将模板添加到文档中。

可以使用AddTemplate()方法将模板添加到文档中。在这种情况下,您需要一些代数来旋转模板。这是参数所需的代数:

a = cosine(angle);
b = sine(angle);
c = -sine(angle);
d = cosine(angle);
e = x;
f = y;

如果无法使代数工作,可以将模板包装在Image对象中:

Image img = Image.getInstance(template);

现在你有不同的方法来引入一个旋转,包括一个只需要角度的简单方法。

P.S。:在图片中包装模板不会“栅格化”文本。它创建了一个Form XObject(而不是Image XObject)。

答案 1 :(得分:0)

我用另一种方式解决了这个问题:

using (PdfStamper stamper = new PdfStamper(reader, ms))
{
   PdfContentByte canvas = stamper.GetOverContent(1);
   String message = String.Format("mutli\nline\text");
}
PdfGState gState = new PdfGState();
gState.FillOpacity = 0.3f;
canvas.SetGState(gState);
using (StringReader stringReader = new StringReader(message))
{
   string line;
   float y = size.Height / 2 + 200;
   while ((line = stringReader.ReadLine()) != null)
   {
      Phrase p = new Phrase(line,FontFactory.GetFont(FontFactory.HELVETICA, 35));
         ColumnText.ShowTextAligned(canvas, Element.ALIGN_CENTER, p, 300, y, 30);
      y = y - 70;
   }
}

}