在使用.net core进行跨平台编程的时候,经常要遇到一些平台兼容的问题。比如在开发环境,我们一般是在windows下面编程,单元测试,当开发测试通过之后,发布到linux上之后,就会发现有问题。比如最近同事在开发一个功能,其中涉及到要将pdf转换成图片的一个步骤。这个在.net里面有着非常多的成熟的工具可以转换,在java里面也同样有,但一旦用.net core然后发布至linux就不行。那么应该如何解决呢?
1. 首先要改变一个开发的观点:即在做.net开发时,一定要找到对号入座的nuget包。比如上述的功能,一根筋想要找到这个nuget包,往往会让开发者失望。以往能找到对号入座的nuget包,只能说开发者的需求是普遍性的,如是不是普遍性的只能说自己的运气不错;
2. 要有包容的心态:不再局限于.net的生态环境,linux环境下肯定有着非常丰富的可以满足某些功能的工具,比如这个pdf转图片,一搜索果然很多
ImageMagick convert简单的命令即可解决问题,还有ImageMagick工具使用的原生脚本语言,ghostscript。
有了以上的准备,我们首先在linux环境下尝试执行ghostscrip进行转换,在网上搜索一个命令: gs -dBATCH -dNOPAUSE -r400 -sDEVICE=pngalpha -sOutputFile="test.png" test.pdf, PDF转成PNG,nice work!
我们最终还是要在.net core程序去实行, convert pdf to png。非常简单,用.net core 程序去执行linux 命令即可。
var sdkVersion = string.Empty; var psi = new System.Diagnostics.ProcessStartInfo("dotnet", " -v"); psi.RedirectStandardOutput = true; using (var process = System.Diagnostics.Process.Start(psi)) { var output = process.StandardOutput.ReadToEnd(); sdkVersion = output.Split(' ') .Where(line => line.StartsWith(".NET Command Line Tools")) .FirstOrDefault(); } return Content(sdkVersion);
上面是简单地执行了,查看dotnet版本的命令
换一下:
var psi = new System.Diagnostics.ProcessStartInfo("ghostscript", "gs -dBATCH -dNOPAUSE -r400 -sDEVICE=pngalpha -sOutputFile='test.png' test.pdf");