image.png (2.2 KB)
用的就是官方mode代码,然后显示应该是pdf批注文本,加个指向问题的引线箭头,现在是文本框把整个引线都圈起来了:
var da = new Aspose.Pdf.Annotations.DefaultAppearance();
da.TextColor = System.Drawing.Color.Red;
da.FontSize = 10;
var fta = new Aspose.Pdf.Annotations.FreeTextAnnotation(page, new Aspose.Pdf.Rectangle(422.25, 645.75, 583.5, 702.75), da);
fta.Intent = Aspose.Pdf.Annotations.FreeTextIntent.FreeTextCallout;
fta.EndingStyle = Aspose.Pdf.Annotations.LineEnding.OpenArrow;
fta.Callout = new Aspose.Pdf.Point[]
{
new Aspose.Pdf.Point(428.25, 651.75),
new Aspose.Pdf.Point(462.75, 681.375),
new Aspose.Pdf.Point(474, 681.375)
};
// Add the annotation to the page
page.Annotations.Add(fta);
// Set rich text for the annotation
fta.RichText = "<body xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:xfa=\"http://www.xfa.org/schema/xfa-data/1.0/\" xfa:APIVersion=\"Acrobat:11.0.23\" xfa:spec=\"2.0.2\" style=\"color:#FF0000;font-weight:normal;font-style:normal;font-stretch:normal\"><p dir=\"ltr\"><span style=\"font-size:9.0pt;font-family:Helvetica\">This is a sample</span></p></body>";
@hujun2026
下午好,很抱歉回复晚了。
我已经调查过这个问题,以下代码似乎可以解决它。请尝试一下,并告诉我这种方法是否有效。
static void freetext_callout_textrectangle_issue()
{
string output = OutputFolder + "freetext_callout_textrectangle_fixed_out.pdf";
var doc = new Aspose.Pdf.Document();
var page = doc.Pages.Add();
var da = new Aspose.Pdf.Annotations.DefaultAppearance();
da.TextColor = System.Drawing.Color.Red;
da.FontSize = 10;
var textBoxRect = new Aspose.Pdf.Rectangle(474, 645.75, 583.5, 702.75);
var fta = new Aspose.Pdf.Annotations.FreeTextAnnotation(
page,
textBoxRect,
da);
// FreeTextAnnotation 仅用于显示文本。
// 禁用其自带边框,因为当前 FreeText 标注的渲染逻辑
// 会在整个有效标注区域周围绘制边框,从而把引线也包进去。
fta.TextRectangle = new Aspose.Pdf.Rectangle(0, 0, 0, 0);
fta.Border = new Aspose.Pdf.Annotations.Border(fta)
{
Width = 0
};
fta.RichText =
"<body xmlns=\"http://www.w3.org/1999/xhtml\" " +
"xmlns:xfa=\"http://www.xfa.org/schema/xfa-data/1.0/\" " +
"xfa:APIVersion=\"Acrobat:11.0.23\" xfa:spec=\"2.0.2\" " +
"style=\"color:#FF0000;font-weight:normal;font-style:normal;font-stretch:normal\">" +
"<p dir=\"ltr\"><span style=\"font-size:9.0pt;font-family:Helvetica\">" +
"This is a sample" +
"</span></p></body>";
page.Annotations.Add(fta);
// 单独绘制文本框边框。
var textBoxBorder = new Aspose.Pdf.Annotations.SquareAnnotation(page, textBoxRect)
{
Color = Aspose.Pdf.Color.Red
};
textBoxBorder.Border = new Aspose.Pdf.Annotations.Border(textBoxBorder)
{
Width = 1
};
page.Annotations.Add(textBoxBorder);
// 单独绘制标注引线,使其保持在文本框矩形之外。
// 这样可以保留 callout 的视觉效果,
// 同时避免 FreeText 的边框把引线也包进去。
var arrowStart = new Aspose.Pdf.Point(428.25, 651.75);
var bend = new Aspose.Pdf.Point(462.75, 681.375);
var textBoxEdge = new Aspose.Pdf.Point(476, 681.375);
var arrowSegment = new Aspose.Pdf.Annotations.LineAnnotation(
page,
new Aspose.Pdf.Rectangle(422.25, 645.75, 468, 686),
arrowStart,
bend)
{
Color = Aspose.Pdf.Color.Red,
Width = 1,
StartingStyle = Aspose.Pdf.Annotations.LineEnding.OpenArrow
};
page.Annotations.Add(arrowSegment);
// 将较短的水平连接线直接绘制到页面内容流中。
// 此处如果使用单独的水平 LineAnnotation 并不稳定:
// 根据外观生成方式的不同,当线段非常短或完全水平时,
// 该线段可能不会被绘制出来。
page.Contents.Add(new Aspose.Pdf.Operators.GSave());
page.Contents.Add(new Aspose.Pdf.Operators.SetRGBColorStroke(1, 0, 0));
page.Contents.Add(new Aspose.Pdf.Operators.SetLineWidth(1));
page.Contents.Add(new Aspose.Pdf.Operators.MoveTo(462.75, 681.375));
page.Contents.Add(new Aspose.Pdf.Operators.LineTo(476, 681.375));
page.Contents.Add(new Aspose.Pdf.Operators.Stroke());
page.Contents.Add(new Aspose.Pdf.Operators.GRestore());
doc.Save(output);
}
freetext_callout_textrectangle_fixed_out.pdf (5.7 KB)