为有中文需求的客户提供多渠道中文技术支持.

Wed Oct 19, 2022 3:05 am

你好,

我需要大量修改【字符底纹】和【段落底纹】的操作, 能提供如下几种情况的示例代码吗? 谢谢! 示例文件和处理后文件在附件中

1.把【既没有出现字符底纹, 也没有设置段落底纹】的段落中的文字 --> 示例文件中的 段落3
黑颜色的字改为蓝色(0.0.255)
灰颜色(白色, 背景1, 深色50%)文字改为绿色(0.255.0)
其它颜色的字不变

2.取消所有【段落底纹】, 之后再将这些段落中【没有设置字符底纹】的文字 --> 示例文件中的 段落2 和 4
黑颜色的字改为蓝色(0.0.255)
灰颜色(白色, 背景1, 深色50%)文字改为绿色(0.255.0)
其它颜色的字不变

3.取消所有段落中的 【字符底纹】, 然后修改这些字符 --> 示例文件中的 段落1 和 2 和 4 和 5
黑颜色的字改为蓝色(0.0.255)
灰颜色(白色, 背景1, 深色50%)文字改为绿色(0.255.0)
其它字的颜色不变

4.我在word中自定义了一个样式, 具体格式如下:
字符样式: 字体: 微软雅黑, 字号: 11 , 加粗
段落样式: 段前: 8磅, 段后: 8磅, 行距: 固定值, 10磅
把完全满足上面样式要求的段落添加【段落底纹: 填充设黄色】 --> 示例文件中的 段落6 和 7

kervinLi
 
Posts: 8
Joined: Wed Oct 12, 2022 3:15 am

Wed Oct 19, 2022 9:55 am

Hello,
您好,

感谢您的留言。
目前我们产品暂不支持获取和设置“字符底纹“,不过我已将此作为一个新功能记录到我们的产品更新系统中了,其编号为” SPIREDOC-8591 “,我们的开发团队将会实现它。一旦该功能被实现了,我会立即通知您。
另外,对于您的“需求4“,我把相关代码放在下面供您参考。如果您还有任何问题,欢迎随时联系。

Code: Select all
 Document doc = new Document();

            doc.LoadFromFile(@"../../data/原文件.docx");

            //遍历每个section
            foreach (Section section in doc.Sections)
            {
                //遍历Section中body内的每个段落
                foreach (Paragraph paragraph in section.Body.Paragraphs)
                {
                    //判断段前段后是否满足要求
                    if (paragraph.Format.AfterSpacing == 8f && paragraph.Format.BeforeSpacing == 8f && paragraph.Format.LineSpacing == 10f && paragraph.Format.LineSpacingRule == LineSpacingRule.Exactly)
                    {
                   
                   
                       //遍历每个段落的child
                        foreach (DocumentObject paraChildObject in paragraph.ChildObjects)
                        {
                            Boolean b = true;
                            //当paraChildObject对象为textrange时
                            if (paraChildObject.DocumentObjectType == DocumentObjectType.TextRange)
                            {
                                TextRange textRange = paraChildObject as TextRange;
                                //判断字体格式是否满足要求
                                if (textRange.CharacterFormat.FontName != "微软雅黑" || textRange.CharacterFormat.FontSize != 11f || textRange.CharacterFormat.Bold == false)
                                {
                                    b = false;
                                }
                                                               
                            }
                            if (b)
                            {
                                //设置段落背景颜色
                                paragraph.Format.BackColor = Color.Yellow;
                            }
                           
                        }

                    }

                }
            }

            //保存结果文档
            doc.SaveToFile(@"../../output/result1.docx", FileFormat.Docx);


Sincerely
Abel
E-iceblue support team
User avatar

Abel.He
 
Posts: 1010
Joined: Tue Mar 08, 2022 2:02 am

Thu Oct 20, 2022 2:09 am

感谢您的帮助

默认的格式工具栏上的 【字符底纹】 颜色是灰色的, 它实际上也可以用下面的操作方法替代:

它是在 Word 设计标签页下, 手动操作步骤如下:
选定要设置字符底纹的文本 -> 设计标签页 -> 页面边框 -> 底纹 -> 选填充颜色 -> 应用于文字
这样一来:我提到的【字符底纹】其实就是【文字底纹】

我在官网帮助网页中找到一篇设置文字底纹的文章, 文字底纹的相关代码如下:

//为第三段里查找的特定文字添加底色
paragaph = document.Sections[0].Paragraphs[2];
TextSelection selection = paragaph.Find("Spire.Doc for .NET", false, true);
TextRange range = selection.GetAsOneRange();
range.CharacterFormat.TextBackgroundColor = Color.Yellow;

另外取消底纹的方法没有找到, 测试设为透明色能折中实现
paragraph.Format.BackColor = Color.Transparent;

对于我的示例文件中, 【文字底纹和段落底纹】交叉处理的逻辑, 看了一些代码,还不是很清楚,
如果上面参考代码有用, 能折中实现, 麻烦您提供一下示例代码并加上注释就太感谢了


Abel.He wrote:Hello,
您好,

感谢您的留言。
目前我们产品暂不支持获取和设置“字符底纹“,不过我已将此作为一个新功能记录到我们的产品更新系统中了,其编号为” SPIREDOC-8591 “,我们的开发团队将会实现它。一旦该功能被实现了,我会立即通知您。
另外,对于您的“需求4“,我把相关代码放在下面供您参考。如果您还有任何问题,欢迎随时联系。

Code: Select all
 Document doc = new Document();

            doc.LoadFromFile(@"../../data/原文件.docx");

            //遍历每个section
            foreach (Section section in doc.Sections)
            {
                //遍历Section中body内的每个段落
                foreach (Paragraph paragraph in section.Body.Paragraphs)
                {
                    //判断段前段后是否满足要求
                    if (paragraph.Format.AfterSpacing == 8f && paragraph.Format.BeforeSpacing == 8f && paragraph.Format.LineSpacing == 10f && paragraph.Format.LineSpacingRule == LineSpacingRule.Exactly)
                    {
                   
                   
                       //遍历每个段落的child
                        foreach (DocumentObject paraChildObject in paragraph.ChildObjects)
                        {
                            Boolean b = true;
                            //当paraChildObject对象为textrange时
                            if (paraChildObject.DocumentObjectType == DocumentObjectType.TextRange)
                            {
                                TextRange textRange = paraChildObject as TextRange;
                                //判断字体格式是否满足要求
                                if (textRange.CharacterFormat.FontName != "微软雅黑" || textRange.CharacterFormat.FontSize != 11f || textRange.CharacterFormat.Bold == false)
                                {
                                    b = false;
                                }
                                                               
                            }
                            if (b)
                            {
                                //设置段落背景颜色
                                paragraph.Format.BackColor = Color.Yellow;
                            }
                           
                        }

                    }

                }
            }

            //保存结果文档
            doc.SaveToFile(@"../../output/result1.docx", FileFormat.Docx);


Sincerely
Abel
E-iceblue support team

kervinLi
 
Posts: 8
Joined: Wed Oct 12, 2022 3:15 am

Thu Oct 20, 2022 10:35 am

您好,

感谢您的反馈。
取消底纹的代码如下:
Code: Select all
TextRange textRange = paraChildObject as TextRange;
textRange.CharacterFormat.ClearBackground();


是的,目前产品不支持“字符底纹”,可以使用文字背景颜色代替。为了帮助我们为您的需求提供更准确的demo,请重新提供将“字符底纹”更换为“背景颜色“后的文档,感谢您的帮助。

Sincerely
Abel
E-iceblue support team
User avatar

Abel.He
 
Posts: 1010
Joined: Tue Mar 08, 2022 2:02 am

Fri Oct 21, 2022 6:40 am

感谢您的回复!

段落1的字符底纹 颜色信息: (白色, 背景1, 深色25%)
段落2和4的字符底纹 颜色信息: 白色
段落5的字符底纹 颜色信息: 标准色, 深红

另外: 示例文件中: 删除某段落中的 字符底纹时, 是删除该段中的所有底纹颜色, 不是删除某个指定的颜色的底纹
这样一来应该不需要判断上面的颜色信息, 是否可以判断Argb是不是有值?

最后: 不知道格式工具栏的 字符底纹 颜色值是不是固定的, 如果不是固定的, 想取消 格式中的 【字符底纹】 还是要等开发实现了该功能才行

修改后的示例文件在下面的附件中


Abel.He wrote:您好,

感谢您的反馈。
取消底纹的代码如下:
Code: Select all
TextRange textRange = paraChildObject as TextRange;
textRange.CharacterFormat.ClearBackground();


是的,目前产品不支持“字符底纹”,可以使用文字背景颜色代替。为了帮助我们为您的需求提供更准确的demo,请重新提供将“字符底纹”更换为“背景颜色“后的文档,感谢您的帮助。

Sincerely
Abel
E-iceblue support team

kervinLi
 
Posts: 8
Joined: Wed Oct 12, 2022 3:15 am

Fri Oct 21, 2022 9:59 am

您好,

感谢您的反馈。
我将符合您需求的代码放在附件中了,该代码生成的结果文档没有完全和您期望的一样。
1) 您的几个需求之间有逻辑交汇的地方。如下面截图中的段落都符合您需求1,所以字体被设置为蓝色。

2) 关于文档中黑色字体颜色,经过我初步测试,您文档中黑色字体有三种。
a. word中创建文本后没有设置字体颜色时,默认就为黑色,但此时通过代码获取其颜色为empty。
b. 颜色rgb值为(0,0,0)和(51,51,51)都表现为黑色。
c. 在代码中我只对(0,0,0)和默认黑色字体做了处理。

Sincerely
Abel
E-iceblue support team
User avatar

Abel.He
 
Posts: 1010
Joined: Tue Mar 08, 2022 2:02 am

Mon Oct 24, 2022 2:09 am

感谢您的帮助!

不好意思, 有点疏忽, 确实存在您指出的问题

现在还有两个问题想继续请教:

1.如何用代码获取某些字的颜色值或背景色值, 用来方便逻辑判断
例如取下面图片中第一行文字的背景色值, 取其它行文字的颜色值
取色值.png


2.如何简单的捕获所有从白到灰到黑之间的所有(非彩色)的文字
例如我想把图中所有行中文字的颜色值改为红色

Abel.He wrote:您好,

感谢您的反馈。
我将符合您需求的代码放在附件中了,该代码生成的结果文档没有完全和您期望的一样。
1) 您的几个需求之间有逻辑交汇的地方。如下面截图中的段落都符合您需求1,所以字体被设置为蓝色。

2) 关于文档中黑色字体颜色,经过我初步测试,您文档中黑色字体有三种。
a. word中创建文本后没有设置字体颜色时,默认就为黑色,但此时通过代码获取其颜色为empty。
b. 颜色rgb值为(0,0,0)和(51,51,51)都表现为黑色。
c. 在代码中我只对(0,0,0)和默认黑色字体做了处理。

Sincerely
Abel
E-iceblue support team

kervinLi
 
Posts: 8
Joined: Wed Oct 12, 2022 3:15 am

Mon Oct 24, 2022 10:03 am

您好,

感谢您的反馈。
对于的您的需求请参考下面的代码。另外,有几点信息要告知您:
1) 对于您需求1获取第一行文字的背景色值,您提供的文档中第一行是设置了“字符底纹”,抱歉目前,我们不支持获取设置了“字符底纹”的文字的背景颜色。仅支持获取通过设置背景颜色的文字的颜色,如您之前提到的(下面的截图)。因此,我在您原文档中增加了一行设置了背景颜色的段落,并在我提供的代码中获取其背景颜色。我把修改过的原文档放在附件中。

2)对于段落的文字根据一定的规则是放在textRange对象中的,文字的各种基本属性(字体大小、名称、颜色等等)都保存在该对象中。包含文本的段落有一个或多个textRange,所以不能直接获取整个段落的字体颜色,只能获取到段落中每个textRange中字体的颜色。

Code: Select all
using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ParaColor31222
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Document doc = new Document();
            doc.LoadFromFile(@"../../data/取色值.docx");

            //获取第二个段落
            Paragraph paragraph = doc.Sections[0].Paragraphs[1];
           
                foreach (DocumentObject paraChildObject in paragraph.ChildObjects)
                {
                    if (paraChildObject.DocumentObjectType == DocumentObjectType.TextRange)
                    {
                        TextRange textRange = (TextRange)paraChildObject;
                        //需求1(获取TextRange中文本的背景颜色):包含文本的段落中包含1个或多个textrange,文本的各种参数都在textRange对象中。
                        Color textColor = textRange.CharacterFormat.TextBackgroundColor;
                        Console.WriteLine(textRange.Text + "       的字体颜色的RGB值:" + textColor);

                    }
                }
           


            foreach (Section section in doc.Sections)
            {
                foreach(Paragraph para in section.Body.Paragraphs )
                {
                    foreach(DocumentObject paraChildObject in para.ChildObjects)
                    {
                        if(paraChildObject.DocumentObjectType ==  DocumentObjectType.TextRange)
                        {
                            TextRange textRange = (TextRange)paraChildObject;
                            //需求1(获取TextRange中文本的字体颜色):包含文本的段落中包含1个或多个textrange,文本的各种参数都在textRange对象中。
                            Color textColor = textRange.CharacterFormat.TextColor;
                            Console.WriteLine(textRange.Text+"       的字体颜色的RGB值:"+textColor);

                            //需求2:黑、白、灰的RGB值对应的 R、G、B值三者是相等的
                           if(textColor.R == textColor.G && textColor.R == textColor.B && textColor.G == textColor.B)
                            {
                                //设置文本颜色
                                textRange.CharacterFormat.TextColor = Color.FromArgb(255, 0, 0);
                               
                            }
                        }
                    }
                }
            }
            doc.SaveToFile(@"../../output/result.docx", FileFormat.Docx);
        }
    }
}


Sincerely
Abel
E-iceblue support team
User avatar

Abel.He
 
Posts: 1010
Joined: Tue Mar 08, 2022 2:02 am

Tue Oct 25, 2022 4:27 am

感谢您的耐心解释, 之前我理解错误了, 看来要操作格式中的字符底纹,只能功能开发出来了, 我会关注此贴的

kervinLi
 
Posts: 8
Joined: Wed Oct 12, 2022 3:15 am

Tue Oct 25, 2022 6:11 am

您好,

感谢您的反馈,一旦该功能被实现了。我会第一时间通知您。

Sincerely
Abel
E-iceblue support team
User avatar

Abel.He
 
Posts: 1010
Joined: Tue Mar 08, 2022 2:02 am

Tue Oct 25, 2022 7:52 am

您好, 刚看到回复, 执行结果达到了预计的效果, 很不错!

kervinLi
 
Posts: 8
Joined: Wed Oct 12, 2022 3:15 am

Tue Oct 25, 2022 9:55 am

好的,感谢您的反馈。

Sincerely
Abel
E-iceblue support team
User avatar

Abel.He
 
Posts: 1010
Joined: Tue Mar 08, 2022 2:02 am

Return to 中文技术支持