解决服务器上swftools中pdf2swf.exe无法工作的故障

时间:2010-11-14 阅读:
1、将swftools原安装包解压后全部放置在C:\swftools(其实只需要fonts目录就行了,反正也不占多大空间,就都放上去吧)
2、对C:\swftools目录设置NETWORK SERVICE的访问权限。
3、pdf2swf.exe复制到应用程序响应的目录下,如bin。
这样就可以了。顺便贴出转换代码:
using System;
using System.Web;
using System.Text;
namespace JumbotCms.Utils
{
       

一开始我只复制了pdf2swf.exe,结果死活不运行。起初怀疑是权限问题,但查了半天也查不到。后来我就直接调用cmd去运行一下,发现报错,原因是没找到C:\swftools\Fonts下的某个文件,这是才恍然大悟,原来但靠pdf2swf.exe是不运行的(PS:那是否意味着虚拟主机下用这个工具彻底没戏???)

幸好我是自己服务器,下面说说完整步骤:

1、将swftools原安装包解压后全部放置在C:\swftools(其实只需要fonts目录就行了,反正也不占多大空间,就都放上去吧)

2、对C:\swftools目录设置NETWORK SERVICE的访问权限。

3、pdf2swf.exe复制到应用程序响应的目录下,如bin。

这样就可以了。顺便贴出转换代码:

using System;
using System.Web;
using System.Text;
namespace JumbotCms.Utils
{
    ///


    /// pdf2swf.exe调用
    ///
    public static class swftoolsHelp
    {
        ///
        /// PDF格式转为SWF
        ///
        /// 原视频文件地址,如/a/b/c.pdf
        /// 生成后的FLV文件地址,如/a/b/c.swf
        /// 转换的前N页
        ///
        public static bool PDF2SWF(string pdfPath, string swfPath, int page)
        {
            string exe = HttpContext.Current.Server.MapPath("~/Bin/pdf2swf.exe");
            pdfPath = HttpContext.Current.Server.MapPath(pdfPath);
            swfPath = HttpContext.Current.Server.MapPath(swfPath);
            if (!System.IO.File.Exists(exe) || !System.IO.File.Exists(pdfPath) || System.IO.File.Exists(swfPath))
            {
                return false;
            }
            StringBuilder sb = new StringBuilder();
            sb.Append(" \"" + pdfPath + "\"");//input
            sb.Append(" -o \"" + swfPath + "\"");//output
            //sb.Append(" -z");
            sb.Append(" -s flashversion=9");//flash version
            //sb.Append(" -s disablelinks");//禁止PDF里面的链接
            sb.Append(" -p " + "\"1" + "-" + page + "\"");//page range
            sb.Append(" -j 100");//SWF中的图片质量
            string Command = sb.ToString();
            System.Diagnostics.Process p = new System.Diagnostics.Process();
            p.StartInfo.FileName = exe;
            p.StartInfo.Arguments = Command;
            p.StartInfo.WorkingDirectory = HttpContext.Current.Server.MapPath("~/Bin/");
            p.StartInfo.UseShellExecute = false;//不使用操作系统外壳程序 启动 线程
            //p.StartInfo.RedirectStandardInput = true;
            //p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;//把外部程序错误输出写到StandardError流中(这个一定要注意,pdf2swf.exe的所有输出信息,都为错误输出流,用 StandardOutput是捕获不到任何消息的...
            p.StartInfo.CreateNoWindow = false;//不创建进程窗口
            p.Start();//启动线程
            p.BeginErrorReadLine();//开始异步读取
            p.WaitForExit();//等待完成
            //p.StandardError.ReadToEnd();//开始同步读取
            p.Close();//关闭进程
            p.Dispose();//释放资源
            return true;
        }
        public static bool PDF2SWF(string pdfPath, string swfPath)
        {
            return PDF2SWF(pdfPath, swfPath, GetPageCount(HttpContext.Current.Server.MapPath(pdfPath)));
        }

        public static int GetPageCount(string pdfPath)
        {
            //try
            //{
            byte[] buffer = System.IO.File.ReadAllBytes(pdfPath);
            int length = buffer.Length;
            if (buffer == null)
                return -1;
            if (buffer.Length <= 0)
                return -1;
            string pdfText = Encoding.Default.GetString(buffer);
            System.Text.RegularExpressions.Regex rx1 = new System.Text.RegularExpressions.Regex(@"/Type\s*/Page[^s]");
            System.Text.RegularExpressions.MatchCollection matches = rx1.Matches(pdfText);
            return matches.Count;
            //}
            //catch (Exception ex)
            //{
            //    throw ex;
            //}
        }
    }
}
 

[责任编辑:jumbot]

[发表评论] [收藏本页]