结合两个现有的注释元素(PDFTron网络SDK)
问题描述:
我想创建一个自定义注释元素结合箭头和自由文本框元素。 Arrow元素我希望它具有最初在SDK中分配的默认行为,尽管我希望有一个默认的大小,预定义的文本,并且在箭头移动或调整大小后立即跟随箭头尾部(我想禁用文本框的选择,缩放转换)。目前我已经设法绘制出现在其尾部的自由文本元素的箭头,但我不知道如何让自由文本元素在其位置更改并禁用其所有功能(选择,缩放变换,文本输入等)。有没有办法将两个现有的注释元素分组为一个,还是有另一种更简单的方法创建一个带有文本框的箭头,其尾部包含预定义的文本?先谢谢你。结合两个现有的注释元素(PDFTron网络SDK)
答
下面的代码显示了如何将文本添加到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
欢迎来到StackOverflow。正如目前所写,您的问题难以阅读和理解,而且几乎不可能在没有看到您编写的某些代码的情况下回答。我建议你阅读[我如何问一个好问题?](https://stackoverflow.com/help/how-to-ask),然后回来编辑你的问题,并考虑到那里的建议。 – DaveyDaveDave