我正在使用PDFFormxObject
而不是PDFCanvas
将背景、边框和/或背景色应用到页面的某个区域(主要是因为PDFCanvas
需要页面来构建,而PDFFormxObject
不需要。因为我的内容可能会持续几页)。问题是,如果坐标(x=0,y=0)意味着左下角,则图像的位置不会像预期的那样。我还想将画布定位到一个固定的位置,但是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的方向后的工作代码。但画布无法设置边框/背景色:
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
首先,使用只定义宽度和高度的矩形创建PDFFormxObject
:
var temp = new PdfFormXObject(new Rectangle(rect.GetWidth(), rect.GetHeight()));
因此,矩形在form 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添加到文档中,而不进行定位:
doc.Add(new Image(temp));
因此,您要求itext将200×200xobject放置在给定现有内容的位置。所以它的位置会比你想要的更高。
因此,要解决您的问题,请安排xobject区域和图像位置,使图像位于该区域中,并根据需要定位xobject。
我在FrameLayout中的SurfaceView画布上画线。我从相机预览中接收图像,对其进行处理,获取矩形的坐标并在画布上绘制线条。绘制时,我得到这些线在y轴上的位移,线越低,位移越大(见下面的照片): 用红线标记(使用Paint程序,而不是实际的应用程序)下线坐标坐标在位图上的大致位置,矩形的下部绿线(由实际的应用程序放置,在画布上绘制)以及红线显示,坐标移位了多少。顶部的坐标不能穿过屏幕,
显示网格 若要在图表画布启用网格,从菜单栏选择“图表”->“显示网格”。 对齐网格 若要在画布对齐对象到网格,从菜单栏选择“图表”->“对齐网格”。 更改图表符号 若要更改图表的符号,从菜单栏选择“图表”->“图表符号”。 【注意】下列选项会根据你所选择的图表类型而有所不同。 选项 描述 默认 Navicat Data Modeler 使用的默认符号样式。 简单 一个简单的符号样式。表、视图或实体
显示网格 若要在图表画布启用网格,从菜单栏选择“查看”->“显示网格”。 对齐网格 若要在画布对齐对象到网格,从菜单栏选择“查看”->“对齐网格”。 更改图表符号 若要更改图表的符号,从菜单栏选择“图表”->“图表符号”。 【注意】下列选项会根据你所选择的图表类型而有所不同。 选项 描述 默认 Navicat Data Modeler 使用的默认符号样式。 简单 一个简单的符号样式。表、视图或实体
显示网格 若要在图表画布启用网格,从菜单栏选择“查看”->“显示网格”。 对齐网格 若要在画布对齐对象到网格,从菜单栏选择“查看”->“对齐网格”。 更改图表符号 若要更改图表的符号,从菜单栏选择“图表”->“图表符号”。 【注意】下列选项会根据你所选择的图表类型而有所不同。 选项 描述 默认 Navicat 使用的默认符号样式。 简单 一个简单的符号样式。表或视图只显示名。 IE (Crow's
显示网格 若要在图表画布启用网格,从菜单栏选择“图表”->“显示网格”。 对齐网格 若要在画布对齐对象到网格,从菜单栏选择“图表”->“对齐网格”。 更改图表符号 若要更改图表的符号,从菜单栏选择“图表”->“图表符号”。 【注意】下列选项会根据你所选择的图表类型而有所不同。 选项 描述 默认 Navicat 使用的默认符号样式。 简单 一个简单的符号样式。表或视图只显示名。 IDEF1X ICA
显示网格 若要在图表画布启用网格,从菜单栏选择“查看”->“显示网格”。 对齐网格 若要在画布对齐对象到网格,从菜单栏选择“查看”->“对齐网格”。 更改图表符号 若要更改图表的符号,从菜单栏选择“图表”->“图表符号”。 【注意】下列选项会根据你所选择的图表类型而有所不同。 选项 描述 默认 Navicat 使用的默认符号样式。 简单 一个简单的符号样式。表或视图只显示名。 IE (Crow's