我正在测试一种方法,该方法将从一个名为55PREMIUMPAYMENTWARRANTY.pdf的现有pdf中读取,该文件顶部有几个小段,每段3行。然后,我尝试使用画布将其复制到其他Y位置的新文档中。
我在具有不同位置的循环中调用了此方法,并对结果感到惊讶。
Y位置通常从左下角的0开始,但是如果Y值为负,则仅在新页面上显示。为什么?
通常,如果我只写纯文本,则Y值400大约在A4页面的中间,即595 x842。
但是在这里,如果我想在中间显示它,我需要将Y设置为-300左右,这对我来说毫无意义。
设置位置的行是 canvas.AddXObject(pageCopy,0,position);
这是方法。
public static byte[] WritePPWToPosition(float position)
{
try
{
//write PPW to different positions on the pdf
var link = "D:\\Repo\\website3.0\\LeisureInsure\\Content\\CertificateDocuments\\55PREMIUMPAYMENTWARRANTY.pdf";
byte[] buffer;
using (Stream stream = new FileStream(@link, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
buffer = new byte[stream.Length - 1];
stream.Read(buffer, 0, buffer.Length);
}
using (var ms = new MemoryStream())
{
//read source page
var readerSource = new PdfReader(new MemoryStream(buffer));
PdfDocument sourcePdf = new PdfDocument(readerSource);
PdfPage sourcePage = sourcePdf.GetPage(1);
//create destination page
PdfDocument newpdf = new PdfDocument(new PdfWriter(ms));
PageSize a4Page = PageSize.A4;
PdfPage newpage = newpdf.AddNewPage(a4Page);
PdfCanvas canvas = new PdfCanvas(newpage);
//copy source page to destination page
PdfFormXObject pageCopy = sourcePage.CopyAsFormXObject(newpdf);
//add destination page to canvas at position
canvas.AddXObject(pageCopy, 0, position);
sourcePdf.Close();
newpdf.Close();
var result = ms.ToArray();
return result;
}
}
catch (Exception ex)
{
throw;
}
}
答案 0 :(得分:0)
通常,如果我只是写纯文本,则Y值400大约在A4页面的中间。
但是在这里,如果我想在中间显示它,我需要将Y设置为-300左右,这对我来说毫无意义。
这实际上是很自然的:
如果要放置文本,则必须使用该文本的基线起始位置的坐标。对于垂直居中的文本,它将位于页面区域内 内,明显位于页面底部上方。
如果要放置表单XObject,则必须使用该XObject的左下角所在的坐标。要将内容垂直放在目标页面上页面大小的表单XObject顶部的中心,该左下角将位于页面区域下方的某处:
很显然,源页面的左下角应该位于目标页面底部的 下。通常,目标页面的坐标系的原点位于左下角,这意味着该位置的 y 坐标为负。
严格来说,以上所述只是一种简化,因为通常您不会看到XObject形式的左下角应该去的地方,而是XObject的 origin 的去处。 XObject坐标系就可以了。
但是,如果从某个源页面创建了表单XObject,则原始页面坐标系的原点(通常在其左下角)将成为XObject的原点。因此,通常上述说法是正确的。但是,对于通用解决方案,您将不得不考虑XObject边界框的实际值。