我使用PdfFormXObject
而不是PdfCanvas
来将背景,边框和/或背景色应用于页面的特定区域(主要是因为PdfCanvas
需要Page来构造, PdfFormXObject
不是。因为我的内容可能持续数页)。问题是,如果坐标(x = 0,y = 0)表示左下角,则图像的位置不符合预期。我也想将Canvas定位到固定位置,但是canvas.SetFixedPosition()
似乎不起作用。请参阅所附的原始图像以及要放置在{x,y,宽度,高度} = {100f,100f,200f,200f}的图像,该图像应位于页面底部(不是),并且以某种方式被截断了吗?
代码
public void CreatePDF(string path)
{
var writer = new PdfWriter(path);
var pdf = new PdfDocument(writer);
var doc = new Document(pdf, PageSize.LETTER);
doc.SetMargins(18, 18, 18, 18);
var rect = new Rectangle(100f, 100f, 200f, 200f);
var temp = new PdfFormXObject(new Rectangle(rect.GetWidth(), rect.GetHeight()));
var ca = new Canvas(temp, pdf);
// ca.SetFixedPosition(rect.GetLeft(), rect.GetBottom(), rect.GetWidth());
var img = new Image(ImageDataFactory.Create(path));
img.SetFixedPosition(rect.GetLeft(), rect.GetBottom());
img.ScaleAbsolute(rect.GetWidth(), rect.GetHeight());
ca.Add(img);
ca.SetBackgroundColor(ColorConstants.BLUE); // not shown blue bg
ca.Close();
doc.Add(new Image(temp));
doc.Close();
pdf.Close();
}
更新 这是mkl指示之后的工作代码。但是画布无法设置边框/背景色:
public void CreatePDF(string path) { var writer = new PdfWriter(path); var pdf = new PdfDocument(writer); var doc = new Document(pdf, PageSize.LETTER); doc.SetMargins(LETTER_MARGIN, LETTER_MARGIN, LETTER_MARGIN, LETTER_MARGIN); var rect = new Rectangle(100f, 300f, 200f, 200f); var w = Doc.GetPageEffectiveArea(PageSize.LETTER).GetWidth(); //576f var h = Doc.GetPageEffectiveArea(PageSize.LETTER).GetHeight();//756f var temp = new PdfFormXObject(new Rectangle(w, h)); var ca = new Canvas(temp, pdf); ca.SetFixedPosition(0, 0, 576f); ca.SetBorder(new SolidBorder(1f));//not work ca.SetBackgroundColor(ColorConstants.BLUE);//not work var img = new Image(ImageDataFactory.Create(path)); img.SetFixedPosition(rect.GetLeft(), rect.GetBottom()); img.ScaleAbsolute(rect.GetWidth(), rect.GetHeight()); ca.Add(img); ca.Close(); doc.Add(new Image(temp)); doc.Close(); pdf.Close(); }
TIA
答案 0 :(得分:0)
首先,使用仅为以下对象定义宽度和高度的矩形创建PdfFormXObject
:
var temp = new PdfFormXObject(new Rectangle(rect.GetWidth(), rect.GetHeight()));
因此,该矩形在xobject坐标系形式的原点具有左下角,即左下角为(0,0),右上角为(200,200)。
在此区域,您将200×200的图像放置在(100,100):
img.SetFixedPosition(rect.GetLeft(), rect.GetBottom());
img.ScaleAbsolute(rect.GetWidth(), rect.GetHeight());
ca.Add(img);
因此,大多数图像在xobject外部,只有左下象限在内部,即您在屏幕快照中看到的象限。
然后将这个xobject添加到文档中而不进行定位:
doc.Add(new Image(temp));
因此,您要求itext将200×200 xobject放置在适合现有内容的位置。因此它将比您想要的更远。
因此,要解决问题,请布置xobject区域和图像位置,以使图像位于该区域中,然后根据需要定位xobject。