Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 512|回复: 0

c# asp.net Pdf 转换图片 在线预览 发布到iis中问题 最终解决篇—_—!

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-5-13 16:00:28 | 显示全部楼层 |阅读模式

    关于:excel和word 预览 请看我的博文:

    excel和word 在线预览  详细配置及代码

     

    使用Adobe 组件 在本机vs中调试成功

    发布到iis中  在  代码中涉及到  剪贴板的地方  会不成功  莫名其妙的没有数据   也不报错      设置iis权限 、com组件权限+各种搞    均无果.....    -_-!  很是郁闷    

     

    最终放弃

    改用 Ghostscript  

    须安装  gs861w32.exe  (高版本 貌似 还有问题......)

    在安装目录 bin 下 找到gsdll32.dll

    下在 dll

    itextsharp.dll

    PDFView.dll

    把三个dll放入 项目dll(新建)文件夹中   

    引入

    itextsharp.dll

    PDFView.dll

    gsdll32.dll无法引入   拷贝到项目bin 目录下

    上代码:

    View Code
     1  /// <summary>
     2         /// 将PDF 相应的页转换为图片
     3         /// </summary>
     4         /// <param name="strPDFpath">PDF 路径</param>
     5         /// <param name="Page">需要转换的页页码</param>
     6         private string GetImage(string strPDFpath, string imgDire, ImageFormat imgeF)
     7         {
     8             StringBuilder b = new StringBuilder();
     9 
    10             PdfReader reader = new PdfReader(strPDFpath);
    11             // 获得文档页数
    12             int pageCount = reader.NumberOfPages;
    13 
    14             System.IO.MemoryStream Ms = new MemoryStream();
    15             try
    16             {
    17                 b = b.AppendLine("<ul style='azimuth:center; list-style-type:none;' >");
    18                 for (int page = 1; page <= pageCount; page++)
    19                 {
    20                     System.Drawing.Image img = PDFView.ConvertPDF.PDFConvert.GetPageFromPDF(strPDFpath, page, 100, "", true);
    21                     img.Save(Ms, imgeF);
    22 
    23                     Bitmap returnImage = (Bitmap)Bitmap.FromStream(Ms);
    24 
    25                     string strImgPath = Request.MapPath("..\\" + imgDire + "\\" + page.ToString("0000") + ".jpg");
    26 
    27                     returnImage.Save(strImgPath);
    28 
    29                     Ms.Position = 0;
    30 
    31 
    32                     b = b.AppendLine("<li>  <img src='..\\" + imgDire + "\\" + page.ToString("0000") + ".jpg'  />       </li><span>第" + (page) + "页</span>");
    33                 }
    34 
    35                 Ms.Close();
    36                 b = b.AppendLine("</ul>");
    37 
    38             }
    39             catch (Exception ex)
    40             {
    41                 // b.Clear();
    42                 //  b.AppendLine(ex.ToString());
    43                 throw;
    44             }
    45 
    46 
    47             return b.ToString();
    48 
    49 
    50         }

    vs 运行  成功

    发布到服务器iis 中   设置 iis 对应应用程序池   启用32为应用程序  为true

    -_-! 报错

    System.InvalidOperationException: 当应用程序不是以 UserInteractive 模式运行时显示模式对话框或窗体是无效操作。请指定 ServiceNotification 或 DefaultDesktopOnly 样式,以显示服务应用程序发出的通知。

     

     

     

    换一种调用方法    :在web中调用外部的控制台程序 

    将上面方法 放入控制台程序中

    mian函数如下:

    View Code
     1 [STAThread]
     2         static void    Main(string[] args)
     3         {
     4             #region MyRegion
     5             /*
     6             if (args != null && args.Length > 0)
     7             {
     8                 string PdfPath = args[0].ToString();
     9                 string ImgPath = args[1].ToString();
    10                 string imgDire = args[2].ToString();
    11                 string b = PDFToPic(PdfPath,ImgPath ,imgDire, ImageFormat.Jpeg);
    12 
    13                 if (string.IsNullOrEmpty(b))
    14                 {
    15                     b = "出错";
    16                 }
    17 
    18                 Console.WriteLine(b);
    19                 Console.ReadKey();
    20                 
    21             }
    22             else
    23             {
    24                 Console.WriteLine("无参数");
    25                 Console.ReadKey();
    26             }
    27             */
    28             
    29             #endregion
    30 
    31      
    32             #region gs
    33 
    34             if (args != null && args.Length > 0)
    35             {
    36                 string PdfPath = args[0].ToString();
    37                 string HtmlDic = args[1].ToString();
    38                 string ImgPath = args[2].ToString();
    39                
    40                 string b = GetImage(PdfPath, HtmlDic, ImgPath, ImageFormat.Jpeg);
    41 
    42                 if (string.IsNullOrEmpty(b))
    43                 {
    44                     b = "出错";
    45                 }
    46                 Console.WriteLine(b);
    47             }
    48             else
    49             {
    50                 Console.WriteLine("无参数");
    51             }
    52             #endregion
    53            // GetImage(@"C:\Users\Administrator.DVT\Desktop\fu.pdf", @"C:\Users\Administrator.DVT\Desktop\imgs", @"C:\Users\Administrator.DVT\Desktop\imgs",ImageFormat.Jpeg);
    54 
    55         }

    生成   拿到Debug 下  控制台.exe  和三个组件(

    itextsharp.dll

    PDFView.dll

    gsdll32.dll

    放入web项目中  (必须放在 同一文件夹下)

     

     

    在web中调用方法的地方    改写成   调用控制台程序
    代码如下:

    View Code
     1   try
     2                 {
     3                     Process pro = new Process();
     4                     pro.StartInfo.RedirectStandardOutput = true;
     5                     pro.StartInfo.RedirectStandardInput = false;
     6                     //不显示窗口
     7                     pro.StartInfo.CreateNoWindow = true;
     8                     pro.StartInfo.UseShellExecute = false;
     9                     //要调用的控制台程序
    10                     pro.StartInfo.FileName = Request.MapPath("../FileUpload/ConsoleApplication1.exe");
    11                     //给控制台程序的参数传递值
    12                     pro.StartInfo.Arguments = filePath+"  "+HtmlDic+"  "+imgDire;
    13                     pro.Start();
    14 
    15 
    16                     string b=    pro.StandardOutput.ReadToEnd();
    17 
    18                     pro.WaitForExit();
    19                     pro.Close();
    20                     pro.Dispose();
    21                     result = b;
    22                 }
    23                 catch (Exception)
    24                 {
    25                     
    26                     throw;
    27                 }

    vs中测试 通过

    发布到iis中  的配置:

    iis 中 应用程序池  设置中  启用 32位应用程序

     

     

    ok,终于解决了   (-_-! 调了两周)

     最近改功能上线   又发现些问题...并解决

    1,EXCLE文件生成html 预览

    xlsx文件 生成html后  打开html 会有  警告 或提示 

    导致进程卡死(因为再程序中打开 ,无法响应)

    2,docx文件生成html 预览   问题同上 、

    解决方法:只需设置 两个属性 即可

       repExcel.DisplayAlerts = false;

    word.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone;   

     

     另外 要做进程回收

    excel事例:

    System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
                workbook = null;
                GC.Collect();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(repExcel.Application.Workbooks);
                GC.Collect();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(repExcel);
                repExcel = null;
                GC.Collect();
                //根据时间杀进程
                System.Diagnostics.Process[] process = System.Diagnostics.Process.GetProcessesByName("EXCEL");//依据时间杀灭进程
                foreach (System.Diagnostics.Process p in process)
                {
                    if (DateTime.Now.Second - p.StartTime.Second > 0 && DateTime.Now.Second - p.StartTime.Second < 5)
                    {
                        p.Kill();
                    }
                }
                Thread.Sleep(3000);//保证完全关闭

     

        /// <summary>
            /// 杀掉进程
            /// </summary>
            /// <param name="hwnd"></param>
            /// <param name="id"></param>
            /// <returns></returns>
    
            [DllImport("user32.dll")]
            private static extern int GetWindowThreadProcessId(IntPtr hwnd, out int id);
            public void killexcel(Excel.Application xlapp)
            {
                try
                {
                    IntPtr app = new IntPtr(xlapp.Hwnd);
                    int processid;
                    GetWindowThreadProcessId(app, out processid);
                    System.Diagnostics.Process.GetProcessById(processid).Kill();
                }
                catch
                { }
            }

     

    pdf  同样要 回收资源   杀掉进程

    ....................................擦   ,貌似解决了。。。

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-23 02:33 , Processed in 0.060447 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表