Openxml的使用配合mupdf的识别生成word(三)
图文框
一种框架,可调整其大小并置于页面任意位置的容器,可以放置包含批注、脚注、尾注或特定域的文字或图形,一定要注意设定图文框的环绕形式。不然会因为插入图文框的问题,导致已经写入的图片信息位置发生变化。
废话少说,作为一个开发,最喜华的是看代码,那就直接上代码:
/// <summary>
/// 以图文框的形式加入文字信息
/// </summary>
/// <param name="text">写入的文字信息</param>
/// <param name="textFonts">字体</param>
/// <param name="textSize">字大小(磅)</param>
/// <param name="textColor">字颜色</param>
/// <param name="leftTopX">左上方的X坐标</param>
/// <param name="Y">Y坐标</param>
public int AddGraphicTextBox(string text, string textFonts, float textSize, string textColor, float leftTopX, float Y)
{
try
{
var paragraphText = new Paragraph();
leftTopX *= 20; Y *= 20;
LogInfo.WriteLogFile("写入文字信息:text = " + text + "X" + leftTopX.ToString() + "Y" + Y.ToString());
ParagraphProperties ParaProperties = new ParagraphProperties();// { ParagraphStyleId = new ParagraphStyleId() { Val = "Normal" } };
var framProper = new FrameProperties() { Width = "0", Wrap = TextWrappingValues.NotBeside, X = leftTopX.ToString(), Y = Y.ToString() }; //图文框宽度,及坐标
var winContro = new WidowControl() { Val = OnOffValue.FromBoolean(false) };
var autoSpaceEe = new AutoSpaceDE() { Val = OnOffValue.FromBoolean(false) };
var autoSpaceDn = new AutoSpaceDN() { Val = OnOffValue.FromBoolean(false) };
var spacingBetween = new SpacingBetweenLines() { Before = "0", After = "0", Line = "0", LineRule = LineSpacingRuleValues.Exact }; //段落的间距设置
var indentation = new Indentation() { Left = "0", Right = "0", FirstLine = "0" };
var justification = new Justification() { Val = JustificationValues.Left };
textSize *= 2; // openxml写入的字体是实际字体大小的一半,故乘2
RunFonts fonts = new RunFonts() { EastAsia = textFonts };//设置字体
FontSize size = new FontSize() { Val = textSize.ToString() };//设置字体大小
Color color = new Color() { Val = textColor };//
LogInfo.WriteLogFile("textSize = " + textSize.ToString() + "TextFonts" + textFonts.ToString());
runProperties.Append(color);
runProperties.Append(size);
runProperties.Append(fonts);
ParaProperties.Append(framProper);
ParaProperties.Append(winContro);
ParaProperties.Append(autoSpaceEe);
ParaProperties.Append(autoSpaceDn);
ParaProperties.Append(spacingBetween);
ParaProperties.Append(indentation);
ParaProperties.Append(justification);
paragraphText.Append(ParaProperties);
var runend = new Run();
BookmarkEnd bookend = new BookmarkEnd() { Id = "Hb1" };
runend.Append(bookend);
paragraphText.Append(runend);
var run = new Run();
run.Append(runProperties); //字体格式设置
runProperties = new RunProperties(); //重新创建新的实例
run.Append(new Text(text));
paragraphText.Append(run);
objWordDocument.MainDocumentPart.Document.Body.Append(paragraphText);
return 0;
}
catch (Exception ex)
{
LogInfo.WriteLogFile("函数AddGraphicTextBox出现异常:" + ex.Message);
objWordDocument.Save();
objWordDocument.Close();
objWordDocument.Dispose();
return -1;
}
}
为了方便我可以循环的调用此接口,我将此功能封装成一个单独的接口。
*=20;为磅值转为缇的转换。我所有接口传入的值单位皆为 (磅),在应用中,不是所有的单位都统一的,后续看代码一定要看好我其中的单位的换算和注释。。
写日志文件的实现没有说明,此处做一下说明。上代码:
namespace 命名空间
{
class LogInfo
{
public static string LOG_PATH = Directory.GetCurrentDirectory();
public static void WriteLogFile(string p_strLogMsg)
{
StackTrace stackTrace = new StackTrace();
StackFrame stackFrame = stackTrace.GetFrame(1);
MethodBase methodBase = stackFrame.GetMethod();
if (Directory.Exists(LOG_PATH) == false)
Directory.CreateDirectory(LOG_PATH);
int iThreadHashCode = Thread.CurrentThread.GetHashCode();
string strPoolThread = Thread.CurrentThread.IsThreadPoolThread ? "poolthread" : "";
string strLogFilename = LOG_PATH + "\\LogFile-" + DateTime.Now.ToString("yyyy-MM-dd") + "-" + iThreadHashCode + strPoolThread + ".txt";
string strMsg = "[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "][" + methodBase.Name + "] " + p_strLogMsg + Environment.NewLine;
System.IO.File.AppendAllText(strLogFilename, strMsg);
}
}
}
会提示出功能的接口调用的时间和接口名称。
总结不易,点个赞啊