往期回顾

  .Net初次使用FlashPaper主要讲述了.Net使用FlashPaper来进行文档转换,同时也留下了一些问题等待我们解决:

  1. 不能同时转换多个文件,否则将导致失败
  2. 如果转换失败导致进程不结束,将会照成死循环
  3. Office文件总转换失败,之前能成功

不能同时转换多个文件,否则将导致失败

  因为我的需求是小数量人员使用系统,所以用了加锁的形式来保证同一时刻只有一个转换进程。

//创建一个静态类,静态变量,供锁使用
public class PageHelper : System.Web.UI.Page
{
public static Object LockObject = 0;
}
//调用转换代码
protected void btnConvertFile_Click(object sender, EventArgs e)
{
  if (Monitor.TryEnter(LockObject))
{
//转换操作
    if(ConvertFile("Test.doc"))
ShowMessage("转换成功!");
    else
ShowMessage("转换失败!");
Monitor.Exit(PageHelper.LockObject);
}
  else
{
//告知请稍等
ShowMessage("有操作正在进行,请稍后再试!")
}
}   

如果转换失败导致进程不结束,将会照成死循环

  当转换进程不结束时 pss.HasExited 一直为false。所以代码更改如下。

        protected Boolean ConvertFile(string fileName)
{
//FlashPaper文件安装路径 可自行设置
string flashPrinter = Server.MapPath("~/FlashPaper/FlashPrinter.exe");
string inFile = GetFilePath(fileName);
string outFile = GetFlashPath(GetFlashName(fileName));
//进程操作
Process pss = new Process();
pss.StartInfo.CreateNoWindow = false;
pss.StartInfo.FileName = flashPrinter;
pss.StartInfo.Arguments = string.Format("{0} {1} -o {2}", flashPrinter, inFile, outFile);
try
{
pss.Start();
//设置300*200毫秒不结束则退出循环
for (int i = 0; i < 300 && !File.Exists(outFile); i += 1)
System.Threading.Thread.Sleep(200);
//返回输出文件是否存在
return File.Exists(outFile);
}
catch (Exception)
{
//如果报错 将输出文件删除
if (File.Exists(outFile)) File.Delete(outFile);
return false;
}
}

Office文件总转换失败,之前能成功

  发布后使用时发现Office总是转换失败,本地测试完全正常。调查中发现服务器任务管理器中有很多FlashPaper进程和Office各各组件的进程,结合FlashPaper转换原理。得出结论:Office组件被FlashPaper打开后,未正常关闭,导致进程长期驻留在任务管理器中,导致后续转换无法进行。

心想难道在服务器端,进程无法自动关闭。于是在代码中增加了杀死进程树的功能

        protected Boolean ConvertFile(string fileName)
{
//FlashPaper文件安装路径 可自行设置
string flashPrinter = Server.MapPath("~/FlashPaper/FlashPrinter.exe");
string inFile = GetFilePath(fileName);
string outFile = GetFlashPath(GetFlashName(fileName));
//进程操作
Process pss = new Process();
pss.StartInfo.CreateNoWindow = false;
pss.StartInfo.FileName = flashPrinter;
pss.StartInfo.Arguments = string.Format("{0} {1} -o {2}", flashPrinter, inFile, outFile);
try
{
pss.Start();
//设置300*200毫秒不结束则退出循环
for (int i = 0; i < 300 && !File.Exists(outFile); i += 1)
System.Threading.Thread.Sleep(200);
//返回输出文件是否存在
return File.Exists(outFile);
}
catch (Exception)
{
//如果报错 将输出文件删除
if (File.Exists(outFile)) File.Delete(outFile);
return false;
}
finally
{
//如果进程还未结束,杀死进程树
if (!pss.HasExited) KillProcess(pss.Id);
}
}
//杀死进程树
private static bool KillProcess(int pid)
{
Process[] procs = Process.GetProcesses();
for (int i = 0; i < procs.Length; i++)
{
if (GetParentProcess(procs[i].Id) == pid)
KillProcess(procs[i].Id);
}
try
{
Process myProc = Process.GetProcessById(pid);
myProc.Kill();
}
catch (ArgumentException)
{
;
}
return true;
}
//获取父进程
private static int GetParentProcess(int Id)
{
int parentPid = 0;
using (ManagementObject mo = new ManagementObject("win32_process.handle='" + Id.ToString(CultureInfo.InvariantCulture) + "'"))
{
try
{
mo.Get();
}
catch (ManagementException)
{
return -1;
}
parentPid = Convert.ToInt32(mo["ParentProcessId"], CultureInfo.InvariantCulture);
}
return parentPid;
}

发布后,跟踪发现,转换完成后FlashPaper真的没有了,但是Office进程却依然存在,好郁闷啊。随后在网络收集各种方法,都未能达到想要的效果。这可是真真的郁闷啊。

最后无奈在服务器上闲逛,想看看是不是设置的问题。在服务器端打开Office组件查看,谁知竟弹出窗口:

难道是因为这个对话框导致Office未正常关闭。和很多药品广告一样:“我抱着试试看的态度”用Office Toolkit把Office2010激活。

手动杀死所有已开阻拦进程,启动系统,转换开始。

啊~成功。没想到真是这个激活窗口导致了这个问题。希望大家引以为戒,以免浪费了青春。

Demo下载

  最后提供Demo下载:在线Flash转换.rar

.Net再次使用FlashPaper相关推荐

  1. 巧用FlashPaper 让Word文档变Flash

    现在网上的教材 课件,许多都是先做成WORD文档然后再用软件转换成Flash,在网上发布!,这类的教材,我们学习得太多了!   这样做的好处是不论对方的平台和语言版本是什么,都可以自由的观看你所制作的 ...

  2. pyqt5点击按钮后关联程序一直运行指导再次点击按钮_揭秘支付宝小程序调试方法...

    本文摘自 https://rax.js.org 本地 IDE 调试 IDE 模拟器中模拟了大部分的真机 API,并且配有调试工具,建议先在模拟器中完成基础功能.样式的调试,然后在真机上验证和调试,当然 ...

  3. 2016 - 1- 21 - RunLoop使用(2016-1-24修改一次)(2016 - 1 - 24 再次修改)

    一:常驻线程 :当需要一个线程一直处理一些耗时操作时,可以让它拥有一个RunLoop.具体代码如下:    1.通过给RunloopMode里加源来保证RunLoop不直接退出. 这里有个很重要得知识 ...

  4. 计算机设备板块超跌,半导体全线拉升,沪指强势突破3600点,午后A股会再次冲高回落吗...

    周四开盘沪指开于3585点,和周三收盘价低开了8个点.上午开盘后沪指呈现低开高走的趋势,10点以后沪指持续拉升上涨不但顺利地突破了3600点而且还创了反弹新高.除了沪指以外深市三大股指也是全线翻红,上 ...

  5. 重磅!教育部再次审批179所高校新增本科AI专业

    整理&责编 | 夕颜 出品 | CSDN(ID:CSDNnews) 好消息!2 月 21 日,教育部官网发布了<教育部关于公布 2019 年度普通高等学校本科专业备案和审批结果的通知&g ...

  6. 25岁Nature狂魔八连杀!曹原再次“一作+通讯”发Nature!

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文来源:量子位(ID:QbitAI)丰色 梦晨.新智元公众号 曹原 ...

  7. 清华旷视:让VGG再次伟大!

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 丰色 发自 凹非寺 量子位 报道 | 公众号 QbitAI CNN经 ...

  8. NLP界的「MVP」再次夺冠,刷新GLUE榜单

    视学算法发布 机器之心编辑部 刷新多项任务分数,百度自研的语义理解技术与平台文心 ERNIE 再次登上了 GLUE 的榜首. 近日,自然语言处理领域权威排行榜--GLUE(通用语言理解评估基准)新排名 ...

  9. 捷报!又一名HIV感染者被治愈,干细胞移植再次立功

    这是目前第二例感染HIV病毒后被治愈的病例.这份病例报告刚刚发布在<柳叶刀·艾滋病病毒>(Lancet HIV)上. 联合出品:腾讯科技.果壳 首发:果壳(ID:Guokr42) 翻译:李 ...

  10. 最新消息!阿里四舍五入无限期延迟复工,字节跳动、腾讯......等企业也再次延迟!...

    点击上方"视学算法",选择右上角"置顶公众号" 因为疫情,大家的生活工作都受到了很大影响,截至目前,全国已经有30个省市自治区启动重大突发公共卫生事件一级响应. ...

最新文章

  1. mysql与access数据库_mysql数据库和access数据库有什么不同吗?
  2. $ppclass php,jquery weui
  3. [for循环之等腰三角形]
  4. Machine Learning from Start to Finish with Scikit-Learn
  5. c# 删除文件,清理删除文件
  6. Ecology 查询某人所有流程待办事项
  7. 规则绝对公平时,社会财富的流向谁?
  8. 《计算机应用基础》测试题,《计算机应用基础》测试题(一)
  9. 改变字体大小的媒体查询代码封装
  10. intptr_t 和 uintptr_t类型使用总结
  11. shell输出毫秒_Shell获取毫秒时间
  12. 电商网站产品结构数据库设计
  13. 如何快速理清大型项目业务逻辑
  14. 教学|3DSMAX的mental ray皮肤,3S材质的制作和使用方法
  15. 地图和地理空间革命:地理学大规模开放在线课堂(MOOC)
  16. java修饰词严格程度_Java修饰词的总结
  17. 全球及中国铁路行业十四五规划目标与投资建设状况分析报告2021版
  18. Android学习---zygote(上)
  19. GEE_List基础总结
  20. Hadoop笔记(5)HA和联邦机制

热门文章

  1. python 爬取财经新闻_Python爬虫并自制新闻网站,太好玩了
  2. matlab 批量导入excel,matlab批量导入excel表格数据-Matlab如何导入excel数据
  3. 安装小企鹅游戏(企5)
  4. 干货丨DolphinDB即时编译(JIT)详解
  5. Tegra X2 系统上安装 openpose
  6. 《星际穿越》关于时间与空间的思考
  7. 手机wps取消不等宽分栏_wps取消分栏怎么设置
  8. python怎么群发邮件_小工具:使用python群发邮件
  9. 趣谈网络协议-应用层(P2P协议)
  10. 查看360极速浏览器保存的密码方法步骤