记录日常操作。而且发现Aspose.Words.dll 关于U3D 的帖子不是太多,再此分享下,也算记录下防止自己日后忘记。
直接展示用法和代码
dll:
Aspose.Words.dll 解析word的核心
I18N.dll、I18N.CJK.dll、I18N.West.dll 这三个为辅助,否则打包后会报错。
ReplaceAndInsertImage 类 引用其他帖子,不过我又加了改进,新增了重载及宽高
public class ReplaceAndInsertImage : IReplacingCallback
{
public enum ImageType
{
File,
Byte,
Stream
}
public ImageType type;
/// <summary>
/// 需要插入的图片路径
/// </summary>
public string url { get; set; }
public byte[] Byt { get; set; }
public Stream Strea { get; set; }
public double W { get; set; }
public double H { get; set; }
public ReplaceAndInsertImage( string url,double w=20d,double h = 20d, ImageType imageType=ImageType.File)
{
this.W = w;
this.H = h;
this.url = url;
this.type = imageType;
}
public ReplaceAndInsertImage( byte[] byt, double w = 20d, double h = 20d, ImageType imageType=ImageType.Byte)
{
this.W = w;
this.H = h;
this.Byt = byt;
this.type = imageType;
}
public ReplaceAndInsertImage(Stream stre, double w = 20d, double h = 20d, ImageType imageType=ImageType.Stream)
{
this.W = w;
this.H = h;
this. Strea = stre;
this.type = imageType;
}
public ReplaceAction Replacing(ReplacingArgs e)
{
//获取当前节点
var node = e.MatchNode;
//获取当前文档
Document doc = node.Document as Document;
DocumentBuilder builder = new DocumentBuilder(doc);
//将光标移动到指定节点
builder.MoveTo(node);
//插入图片
switch (type)
{
case ImageType.File:
builder.InsertImage(url, W, H);
break;
case ImageType.Byte:
builder.InsertImage(Byt, W, H);
break;
case ImageType.Stream:
builder.InsertImage(Strea, W, H);
break;
default:
break;
}
return ReplaceAction.Replace;
}
}
下边是使用方法:
1.导出word
/// <summary>
/// Aspose.Words 导出word 示例,
/// 已打包测试没问题
/// 利用替换法 快速替换word模板中的内容, (文字 或者图片)
/// </summary>
public class WordTemplateReadandWrite : MonoBehaviour
{
void Start()
{
Load();
}
public Text t;
Document Doc;
public void Load()
{
//前提 模板不 能是打开状态,不能被任何进程占用
// try 只是我测试的时候随便加的
try
{
string path = Application.streamingAssetsPath + "/WordTemplateOne.doc";
Doc = new Aspose.Words.Document(path);
t.text = "成功";
}
catch (System.Exception e)
{
t.text = e.Message;
}
FindReplaceOptions findReplaceOptions = new FindReplaceOptions();
//替换特殊标志形式 替换 &施工单位& 为 安筑1
Doc.Range.Replace("&施工单位&", "安筑1", findReplaceOptions);
//替换特殊标志形式 替换 &工程名称& 为 安筑
Doc.Range.Replace("&工程名称&","安筑", findReplaceOptions);
//这里只是展示了 Regex 和string 两个参数的用法,并非是一定要用某个
//下边展示了图片插入的三种方法。完整路径----字节byte[]-----文件流Stream
Regex regex = new Regex("&Image&");
FindReplaceOptions findReplaceOptions1 = new FindReplaceOptions(new ReplaceAndInsertImage(@"C:\Users\Miggle\Desktop\111.png"));
Doc.Range.Replace(regex,"", findReplaceOptions1);
FindReplaceOptions findReplaceOptions2 = new FindReplaceOptions(new ReplaceAndInsertImage(File.ReadAllBytes(@"C:\Users\Miggle\Desktop\111.png")));
Doc.Range.Replace("&Image1&", "", findReplaceOptions2);
FindReplaceOptions findReplaceOptions3 = new FindReplaceOptions(new ReplaceAndInsertImage(new FileStream(@"C:\Users\Miggle\Desktop\111.png", FileMode.Open)));
Doc.Range.Replace("&Image2&", "", findReplaceOptions3);
string Savepath1 = Application.streamingAssetsPath + "/WordTemplateOne1.doc";
// 覆盖保存
Doc.Save(Savepath1);
}
}
2.word 转图片
#region Word
/// <summary>
/// Word 转图片
/// </summary>
/// <param name="path">word 路径</param>
/// <param name="Resolution">图片分辨率</param>
/// <returns></returns>
public static List<Texture2D> WordToTextures(string path,float Resolution=96)
{
List<Texture2D> textures = new List<Texture2D>();
try
{
var doc = new Aspose.Words.Document(path);
Aspose.Words.Saving.ImageSaveOptions imageOptions = new Aspose.Words.Saving.ImageSaveOptions(Aspose.Words.SaveFormat.Png);
imageOptions.PrettyFormat = true;
imageOptions.Resolution = Resolution;//设置图片质量(越大越清晰)
for (int i = 0; i < doc.PageCount; i++)
{
imageOptions.PageIndex = i;
using (MemoryStream stream = new MemoryStream())
{
try
{
doc.Save(stream, imageOptions);
System.Drawing.Image image = System.Drawing.Image.FromStream(stream);
int width = image.Width; int height = image.Height;
image.Dispose();
Texture2D texture2D = new Texture2D(width, height);
texture2D.LoadImage(stream.ToArray());
textures.Add(texture2D);
}
catch (Exception e)
{
ToolMessageManager.OutputMessage(e.Message);
textures.Add(null);
}
}
}
}
catch (Exception e)
{
ToolMessageManager.OutputMessage(e.Message);
}
return textures;
}
/// <summary>
/// 加载word 后保存的临时变量
/// </summary>
private static Aspose.Words.Document Doc = null;
private static Aspose.Words.Saving.ImageSaveOptions ImageOptions = null;
/// <summary>
/// 临时word页码长度
/// </summary>
public static int? WordPageCount
{
get
{
try
{
return Doc?.PageCount;
}
catch (Exception e)
{
ToolMessageManager.OutputMessage(e.Message);
}
return 0;
}
}
/// <summary>
/// 加载Word
/// </summary>
/// <param name="path">路径</param>
/// <param name="Resolution">分辨率</param>
/// <returns></returns>
public static bool LoadWord(string path, float Resolution = 96)
{
Doc = null;
ImageOptions = null;
try
{
Doc = new Aspose.Words.Document(path);
ImageOptions = new Aspose.Words.Saving.ImageSaveOptions(Aspose.Words.SaveFormat.Png);
ImageOptions.PrettyFormat = true;
ImageOptions.Resolution = Resolution;//设置图片质量(越大越清晰)
return Doc != null;
}
catch (Exception e)
{
ToolMessageManager.OutputMessage(e.Message);
}
return false;
}
/// <summary>
/// 卸载临时Word
/// </summary>
public static void ReleaseWord()
{
Doc = null;
}
/// <summary>
/// 加载Word(指定页码) 并转换为图片
/// </summary>
/// <param name="index">索引</param>
/// <returns></returns>
public static Texture2D WordToTexture(int index = 0)
{
if (Doc == null || Doc.PageCount <= index)
return null;
try
{
ImageOptions.PageIndex = index;
using (MemoryStream stream = new MemoryStream())
{
try
{
Doc.Save(stream, ImageOptions);
System.Drawing.Image image = System.Drawing.Image.FromStream(stream);
int width = image.Width; int height = image.Height;
image.Dispose();
Texture2D texture2D = new Texture2D(width, height);
texture2D.LoadImage(stream.ToArray());
return texture2D;
}
catch (Exception e)
{
ToolMessageManager.OutputMessage(e.Message);
}
}
return null;
}
catch (Exception e)
{
ToolMessageManager.OutputMessage(e.Message);
}
return null;
}
#endregion
一上方法亲测有效,仅限于win平台,其他平台可去Aspose官网找相关sdk