使用Aspose.Words处理word模板
起因
公司项目中,大多模板都是Word格式,处理word也是一直是Office COM组件处理,最近是在一台机器上老是遇到打印假死,且异常捕捉不到,即使捕捉到也是RPC不可用.在我电脑上一直没遇到这种情况,所以就有换替换处理Word组件的想法.因为公司项目是很早的项目,还是使用.Net Framework 3.5,所以最终尝试使用Aspose.Words组件.
处理Word组件大体有这几类:
- Microsoft.Office.Interop COM,要创建word/execl进程,使用中会遇到各种问题.
- OpenXml 微软开源的Office组件,在项目中引用不可用.对.Net Framework 4.0支持较好.
- NPOI 开源组件,基于Java POI组件移植,处理Excel比较好,对Word不太好.
- DocX 开源组件,支持.Net Framework 4.0及更高版本.
在 word转pdf 中,简单使用了替换文本,书签替换. 这里主要简绍怎么使用处理长文本替换和插入图片.
长文本替换(主要是使用创建表格方式实现)
/// <summary>
/// 长文本要用书签替换内容
/// </summary>
/// <param name="doc">文档</param>
/// <param name="bookmarkName">书签名</param>
/// <param name="content">长文本</param>
public static void replaceLongTxt(Document doc, string bookmarkName, string content)
{
if (doc.Range.Bookmarks[bookmarkName] != null)
{
DocumentBuilder builder = new DocumentBuilder(doc);
builder.MoveToBookmark(bookmarkName);
doc.Range.Bookmarks[bookmarkName].Text = "";
builder.StartTable(); //创建table
builder.CellFormat.Width = 480; //设置单元格宽度
builder.CellFormat.Borders.LineStyle = LineStyle.None; //设置单元格边框
Cell cell = builder.InsertCell();
builder.Write(content);
builder.EndTable(); //结束table创建
}
}
插入图片
/// <summary>
/// 插入图片,指定宽度和高度
/// </summary>
/// <param name="doc">文档</param>
/// <param name="imgName">图片名称</param>
/// <param name="width">宽度</param>
/// <param name="height">高度</param>
public static void insertImg(Document doc, string imgName, double width, double height)
{
DocumentBuilder builder = new DocumentBuilder(doc);
builder.InsertImage(imgName,width,height);
}
/// <summary>
/// 根据书签位置,插入图片
/// </summary>
/// <param name="doc">文档</param>
/// <param name="bookMarkName">书签</param>
/// <param name="imgName">图片名称(包含图片地址)</param>
/// <param name="width">宽度</param>
/// <param name="height">高度</param>
private static void insertImg(Document doc, string bookMarkName, string imgName, double width, double height)
{
if (doc.Range.Bookmarks[bookMarkName] != null)
{
DocumentBuilder builder = new DocumentBuilder(doc);
builder.MoveToBookmark(bookMarkName);
builder.InsertImage(imgName,width,height);
}
}
测试代码
static void Main(string[] args)
{
Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff"));
//长文本内容
string longStr = @"逆向合成的基本原则是“逆向思维”,将目标化合物分子分解成基本的、可获得的组分,然后分析可以用哪些容易得到的试剂、通过哪些已知的化学反应步骤来合成。提出这一方法的美国哈佛大学教授E.J。科里曾获1990年诺贝尔化学奖。
“逆向合成是有机化学的终极学科,化学家需要数年才能掌握它——就如同下棋一样,除了学习专业知识,还需要很好的直觉和创造性。";
Document doc = new Document("提取pdf.docx"); //加载docx文档
DocumentBuilder builder = new DocumentBuilder(doc);
builder.MoveToBookmark("jcbg"); //先将光标移动书签位置
insertImg(doc, "insert.png", 485, 560); //插入图片1
insertImg(doc, "insert2.jpg", 485, 560); //插入图片2
replaceLongTxt(doc, "jcbg", longStr); //替换长文本
insertImg(doc, "qm1", "1.jpg", 50, 30); //直接根据书签插入图片
Guid guid = Guid.NewGuid();
doc.Save(string.Format("{0}.pdf", guid), SaveFormat.Pdf); //生成pdf
Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff"));
Console.ReadKey();
}
以上只是一个模板所需的功能,还没有在正式的项目经过测试.以后用到那些在补充吧!
秋风
2018-04-15