FreeTextAnnotation在pdf中增加一个文本注释,文本框区域显示异常

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)