使用 C# 和魔术将HTML转换为 PDF !

分享于 

6分钟阅读

Web开发

  繁體

在某些时候,每个人都需要将HTML页面转换为 PDF,原因或者其他原因。 为此,我一直在使用一个在( 距离现在还远) 时便宜的组件。 这个组件在最近的8年中运行得很好,最基本的是最后一年,因为它没有很好地。 他们联系供应商时,他们说hey但是我们的最新版本可以预期,因为 8 years,那就是 $ 笑脸 最后一个问题是,我使用的组件在Azure中不工作。 这让我找到了一些调查最后这篇文章。

问题出在哪儿?

我们有 3个问题:

如果你需要这个组件,但是如果你有 40分钟浏览 of,那么就可以成功了。 打开mouthed微笑

主要组件是什么?

magic的组件是 ,它是一个开放源码项目,它是在LGPLv3许可协议下授权的。 组件是 命令行,它使用 Qt webkit 呈现引擎将HTML呈现为 PDF。 它运行完全"无头",不需要显示或者显示服务。

例如,你可以使用脚本 below 在google页面的页面生成一个 PDF:


wkhtmltopdf.exe"https://google.com""google.pdf"



这将会消失并且想到几秒钟,然后返回 PDF。 笑脸

image

Super simplearguments arguments EXE 项目站点你可以向项目站点中传递一些参数,这些参数是你想为你想生成pdf的认证页面提供的一个用户名和密码。

我们正怎样地使用这些资源

正如所提到的,这是一个 命令行 实用程序,所以我们基本上将它包装到从 C# 到 上面的标准执行。


using System;


using System.IO;


using System.Threading.Tasks;


using System.Web;



namespace Html2Pdf.Lib


{


 public static class TheMagic


 {


 public static async Task<byte[]> Go(string url, int timeoutInSeconds = 30, 


 string pathToExe = null)


 {


 if (pathToExe == null)


 {


 pathToExe = $@"{Path.GetDirectoryName


 (typeof(TheMagic).Assembly.Location)}wkhtmltopdf.exe";


 if (!File.Exists(pathToExe))


 {


 pathToExe = HttpContext.Current.Server.MapPath("~/bin/wkhtmltopdf.exe");


 }


 }



 var timeout = DateTime.UtcNow.AddSeconds(timeoutInSeconds);


 var savePdfTo = Path.GetTempFileName();


 var t = Task.Run(() => GeneratePdf(url, savePdfTo, pathToExe));


 while (!t.IsCompleted)


 {


 if (timeout < DateTime.UtcNow)


 {


 break;


 }


 await Task.Delay(250);


 }


 while (!File.Exists(savePdfTo))


 {


 if (timeout < DateTime.UtcNow)


 {


 break;


 }


 await Task.Delay(250);


 }


 while (File.GetLastWriteTimeUtc(savePdfTo).AddSeconds(2) >= DateTime.UtcNow)


 {


 if (timeout < DateTime.UtcNow)


 {


 break;


 }


 await Task.Delay(250);


 }


 var bytes = File.ReadAllBytes(savePdfTo);


 try


 {


 File.Delete(savePdfTo);


 }


 catch


 {


 // oh well we tried


 }


 return bytes;


 }



 private static void GeneratePdf(string url, string targetLocation, string pathToExe)


 {


 ExecuteCommand(pathToExe, $@"""{url}"" 


""{targetLocation}""");


 }



 public static string ExecuteCommand(string pathToExe, string args)


 {


 try


 {


 System.Diagnostics.ProcessStartInfo procStartInfo = 


 new System.Diagnostics.ProcessStartInfo(pathToExe, args);


 procStartInfo.UseShellExecute = false;


 procStartInfo.CreateNoWindow = true;


 System.Diagnostics.Process proc = new System.Diagnostics.Process();


 procStartInfo.RedirectStandardOutput = true;


 proc.StartInfo = procStartInfo;


 proc.Start();


 proc.WaitForExit();


 }


 catch


 {


 }


 return null;


 }


 }


}



你将这里代码称为 below 示例:


public async Task<ActionResult> DownloadHomePageAsPdf()


{


 var bytes = await TheMagic.Go($"{Request.Url.GetLeftPart(UriPartial.Authority)}/Home");



 return File(bytes, "application/pdf");


}



我不确定这个代码在生产中是如何运行的,但是在我做的基本测试中,它完成了。

image

所以我们已经解决了所有的问题。

  • 我们转换 HTML 2 PDF
  • 这是免费的,不能比那个更便宜( 除非你想为我付费。) 用舌头微笑 )
  • 虽然没有在博客( 因为我可以从任何地方得到屏幕截图) 中显示,但是这个代码在Azure中。

结束语

所有的一切都可能。这个解决方案的有趣之处在于你看到了messy的解决方案,但是没有意识到,如果你使用的是一个 3rd的组件,但关键的是,它是在做什么,而关键是它在运行。 打开mouthed微笑

如果你想下载这个示例并看到它工作,那么这个示例中用于这个示例的代码插件将在GitHub上可用。

你知道什么很酷的转换组件? 为什么不在评论中共享 below 呢。 笑脸

快乐转换 !


PDF  Magic  
相关文章