结合两个现有的注释元素(PDFTron网络SDK)

问题描述:

我想创建一个自定义注释元素结合箭头和自由文本框元素。 Arrow元素我希望它具有最初在SDK中分配的默认行为,尽管我希望有一个默认的大小,预定义的文本,并且在箭头移动或调整大小后立即跟随箭头尾部(我想禁用文本框的选择,缩放转换)。目前我已经设法绘制出现在其尾部的自由文本元素的箭头,但我不知道如何让自由文本元素在其位置更改并禁用其所有功能(选择,缩放变换,文本输入等)。有没有办法将两个现有的注释元素分组为一个,还是有另一种更简单的方法创建一个带有文本框的箭头,其尾部包含预定义的文本?先谢谢你。结合两个现有的注释元素(PDFTron网络SDK)

+0

欢迎来到StackOverflow。正如目前所写,您的问题难以阅读和理解,而且几乎不可能在没有看到您编写的某些代码的情况下回答。我建议你阅读[我如何问一个好问题?](https://stackoverflow.com/help/how-to-ask),然后回来编辑你的问题,并考虑到那里的建议。 – DaveyDaveDave

下面的代码显示了如何将文本添加到PDFNet将生成的默认外观。基本上你正在装饰默认的外观。

最好的办法是使用我们的默认外观,然后覆盖您自己的内容。

调用Annot.RefreshAppearance之后,您可以调用以下内容。

static public void AddDecorations(Annots.Line line, PDFDoc doc) 
{ 
ElementReader reader = new ElementReader(); 
ElementWriter writer = new ElementWriter(); 
ElementBuilder builder = new ElementBuilder(); 


writer.Begin(doc); // start new content stream 


SDF.Obj old_app_stm = line.GetAppearance(); 
reader.Begin(old_app_stm); 


Element element; 
// isolate PDFNet default appearance in group 
writer.WriteElement(builder.CreateGroupBegin()); 
while ((element = reader.Next()) != null) 
{ 
    writer.WriteElement(element); 
} 
element = builder.CreateGroupEnd(); 
writer.WriteElement(element); 


///////////////////////////////////////////////////// 
// Create matrix to position and rotate new text 
Point start_pt = line.GetStartPoint(); 
Point end_pt = line.GetEndPoint(); 
double xDiff = end_pt.x - start_pt.x; 
double yDiff = end_pt.y - start_pt.y; 
double angle = Math.Atan2(yDiff, xDiff); 
Matrix2D mtx = Matrix2D.RotationMatrix(-angle); 
mtx.m_h = start_pt.x; 
mtx.m_v = start_pt.y; 
///////////////////////////////////////////////////// 


element = builder.CreateTextBegin(Font.Create(doc, Font.StandardType1Font.e_helvetica_bold), 8); 
writer.WriteElement(element); 
element = builder.CreateTextRun(String.Format("{0}", line.GetSDFObj().GetObjNum())); 
element.SetTextMatrix(mtx); 
writer.WriteElement(element); 
Rect new_bbox = new Rect(); 
element.GetBBox(new_bbox); 
element = builder.CreateTextEnd(); 
writer.WriteElement(element); 

// update bounding boxes 
Rect old_bbox = new Rect(old_app_stm.FindObj("BBox")); 
old_bbox.Normalize(); // make sure x1,y1 is bottom left 
new_bbox.Normalize(); 
new_bbox = new Rect(Math.Min(new_bbox.x1, old_bbox.x1), Math.Min(new_bbox.y1, old_bbox.y1), Math.Max(new_bbox.x2, old_bbox.x2), Math.Max(new_bbox.y2, old_bbox.y2)); 
SDF.Obj new_app_stm = writer.End(); 
new_app_stm.PutRect("BBox", new_bbox.x1, new_bbox.y1, new_bbox.x2, new_bbox.y2); 
line.SetRect(new_bbox); 

line.SetAppearance(new_app_stm); 
} 

总之,您将预先存在的绘图元素包装在一个组中,然后编写自己的新内容。然后更新边界框矩形,并更新外观流和注记边界框。

+0

非常感谢您的回复Ryan,这非常有帮助。我遵循了装饰默认外观的建议,基本上,我还添加了一个矩形,以围绕箭头结尾处的文本内容。我想问问是否有能力设置添加的文本的颜色,如定义字体和字体大小。 – Illusioner