我正致力于在现有的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);
答案 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;
}
}
}