红古微信网站建设,构建电子商务网站的步骤,国际网站建设与维护,做怎样的网站能赚钱在程序开发中经常需要将Office文件转换成PDF#xff0c;著名的Aspose的三大组件可以很容易完成这个功能#xff0c;但是Aspose的每个组件都单独收费#xff0c;而且每个都卖的不便宜。在老大的提示下#xff0c;换了一种思路来解决这个问题。环境dotNetCore:2.1CentOS:7.5D… 在程序开发中经常需要将Office文件转换成PDF著名的Aspose的三大组件可以很容易完成这个功能但是Aspose的每个组件都单独收费而且每个都卖的不便宜。在老大的提示下换了一种思路来解决这个问题。环境dotNetCore:2.1CentOS:7.5Docker:18.06.1-ce步骤1、Docker中安装libreoffice和dotNetCore2、编写转换程序3、程序以服务的方式部署在Docker中。配置Docker环境因为需要部署dotNetCore的程序开始的想法是依赖microsoft/dotnet:2.1-aspnetcore-runtime镜像创建容器然后在容器中安装libreoffice后来发现容器中没法执行yum命令可能是没找到方法。最后换了一种思路依赖centos镜像创建容器在容器中安装dotNetCore2.1和libreoffice。安装libreofiicieyum install libreoffice 安装dotnetCore2.1sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpmsudo yum updatesudo yum install aspnetcore-runtime-2.1sudo yum updatesudo yum install aspnetcore-runtime-2.1转换程序编写在C#中使用libreoffice转换office为pdf网上有很多的代码示例在这里还需要引入消息队列整个程序是一个消息队列的消费者。简单说就是用户上传了一个office文件上传成功后会发一个消息该程序中接收到消息就进行转换。消息监听 class Program { static IPowerPointConverter converter new PowerPointConverter(); static void Main(string[] args) { var mqManager new MQManager(new MqConfig { AutomaticRecoveryEnabled true, HeartBeat 60, NetworkRecoveryInterval new TimeSpan(60), Host ConfigurationManager.AppSettings[mqhostname], UserName ConfigurationManager.AppSettings[mqusername], Password ConfigurationManager.AppSettings[mqpassword], Port ConfigurationManager.AppSettings[mqport] }); if (mqManager ! null mqManager.Connected) { Console.WriteLine(RabbitMQ连接初始化成功。); Console.WriteLine(RabbitMQ消息接收中...); mqManager.SubscribePowerPointConvertMessage(message { if (message ! null) { converter.OnWork(message); Console.WriteLine(message.FileInfo); } }); } else { Console.WriteLine(RabbitMQ连接初始化失败,请检查连接。); Console.ReadLine(); } } }Program { static IPowerPointConverter converter new PowerPointConverter(); static void Main(string[] args) { var mqManager new MQManager(new MqConfig { AutomaticRecoveryEnabled true, HeartBeat 60, NetworkRecoveryInterval new TimeSpan(60), Host ConfigurationManager.AppSettings[mqhostname], UserName ConfigurationManager.AppSettings[mqusername], Password ConfigurationManager.AppSettings[mqpassword], Port ConfigurationManager.AppSettings[mqport] }); if (mqManager ! null mqManager.Connected) { Console.WriteLine(RabbitMQ连接初始化成功。); Console.WriteLine(RabbitMQ消息接收中...); mqManager.SubscribePowerPointConvertMessage(message { if (message ! null) { converter.OnWork(message); Console.WriteLine(message.FileInfo); } }); } else { Console.WriteLine(RabbitMQ连接初始化失败,请检查连接。); Console.ReadLine(); } } }文件转换 public bool OnWork(MQ.Messages Message) { PowerPointConvertMessage message (PowerPointConvertMessage)Message; string sourcePath string.Empty; string destPath string.Empty; try { if(message null) return false; Stream sourceStream fileOperation.GetFile(message.FileInfo.FileId); string filename message.FileInfo.FileId; string extension System.IO.Path.GetExtension(message.FileInfo.FileName); sourcePath System.IO.Path.Combine(Directory.GetCurrentDirectory(), filename extension); destPath System.IO.Path.Combine(Directory.GetCurrentDirectory(), string.Format({0}.pdf, filename)); if (!SaveToFile(sourceStream, sourcePath)) return false; var psi new ProcessStartInfo(libreoffice, string.Format(--invisible --convert-to pdf {0}, filename extension)) { RedirectStandardOutput true }; // 启动 var proc Process.Start(psi); if (proc null) { Console.WriteLine(不能执行.); return false; } else { Console.WriteLine(-------------开始执行--------------); //开始读取 using (var sr proc.StandardOutput) { while (!sr.EndOfStream) { Console.WriteLine(sr.ReadLine()); } if (!proc.HasExited) { proc.Kill(); } } Console.WriteLine(---------------执行完成------------------); Console.WriteLine($退出代码 {proc.ExitCode}); } } catch (Exception ex) { Console.WriteLine(ex.Message); return false; } finally { if (File.Exists(destPath)) { var destFileInfo UploadFile(destPath, string.Format({0}.pdf, Path.GetFileNameWithoutExtension(message.FileInfo.FileName))); } if (File.Exists(destPath)) { System.IO.File.Delete(destPath); } } return true; } PowerPointConvertMessage message (PowerPointConvertMessage)Message; string sourcePath string.Empty; string destPath string.Empty; try { if(message null) return false; Stream sourceStream fileOperation.GetFile(message.FileInfo.FileId); string filename message.FileInfo.FileId; string extension System.IO.Path.GetExtension(message.FileInfo.FileName); sourcePath System.IO.Path.Combine(Directory.GetCurrentDirectory(), filename extension); destPath System.IO.Path.Combine(Directory.GetCurrentDirectory(), string.Format({0}.pdf, filename)); if (!SaveToFile(sourceStream, sourcePath)) return false; var psi new ProcessStartInfo(libreoffice, string.Format(--invisible --convert-to pdf {0}, filename extension)) { RedirectStandardOutput true }; // 启动 var proc Process.Start(psi); if (proc null) { Console.WriteLine(不能执行.); return false; } else { Console.WriteLine(-------------开始执行--------------); //开始读取 using (var sr proc.StandardOutput) { while (!sr.EndOfStream) { Console.WriteLine(sr.ReadLine()); } if (!proc.HasExited) { proc.Kill(); } } Console.WriteLine(---------------执行完成------------------); Console.WriteLine($退出代码 {proc.ExitCode}); } } catch (Exception ex) { Console.WriteLine(ex.Message); return false; } finally { if (File.Exists(destPath)) { var destFileInfo UploadFile(destPath, string.Format({0}.pdf, Path.GetFileNameWithoutExtension(message.FileInfo.FileName))); } if (File.Exists(destPath)) { System.IO.File.Delete(destPath); } } return true; }上面只是一些代码片段完整示例会上传到Github上文章末尾会给出地址。部署代码到Docker此程序是dotNetCore编写的控制台程序希望以服务的方式在后台运行下面介绍怎样将控制台程序以服务的方式运行1、将发布后的代码放在容器的/root/officetopdf/publish目录中2、在 /lib/systemd/system目录中创建文件officetopdf.service3、文件内容如下[Unit]Descriptionoffice to pdf service[Service]ExecStart/usr/bin/dotnet /root/officetopdf/publish/Office2PDF.dll[Install]WantedBydefault.targetDescriptionoffice to pdf service[Service]ExecStart/usr/bin/dotnet /root/officetopdf/publish/Office2PDF.dll[Install]WantedBydefault.target4、使用下面命令创建和启动服务systemctrl daemon-reloadsystemctrl start officetopdfsystemctrl start officetopdf示例https://github.com/oec2003/StudySamples/tree/master/Office2PDF