使用 PdfFormXObject 的位置 Canvas 和图像
Position Canvas and Image with PdfFormXObject
我使用 PdfFormXObject
而不是 PdfCanvas
来将背景、边框、and/or 背景色应用于页面的特定区域(主要是因为 PdfCanvas
需要要构建的页面,PdfFormXObject
不会。因为我的内容可能会持续几页)。问题是如果坐标 (x = 0, y = 0) 表示左下角,则图像未按预期定位。我也想将 Canvas 定位到固定位置,但 canvas.SetFixedPosition()
似乎不起作用。请参阅附加的原始图像和位于 {x, y, width, height} = {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 指导后的工作代码。但是canvas无法设置border/background color:
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();
}
- 更新
我在 ca 中添加了一个 Div 并将边框和背景颜色设置为 Div。完美运行。
TIA
首先,您使用仅定义宽度和高度的矩形创建一个 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。
我使用 PdfFormXObject
而不是 PdfCanvas
来将背景、边框、and/or 背景色应用于页面的特定区域(主要是因为 PdfCanvas
需要要构建的页面,PdfFormXObject
不会。因为我的内容可能会持续几页)。问题是如果坐标 (x = 0, y = 0) 表示左下角,则图像未按预期定位。我也想将 Canvas 定位到固定位置,但 canvas.SetFixedPosition()
似乎不起作用。请参阅附加的原始图像和位于 {x, y, width, height} = {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 指导后的工作代码。但是canvas无法设置border/background color:
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(); }
- 更新 我在 ca 中添加了一个 Div 并将边框和背景颜色设置为 Div。完美运行。
TIA
首先,您使用仅定义宽度和高度的矩形创建一个 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。