【问题标题】:How to create PDF in dotnet Core on app deployed on Azure App service?如何在 Azure App 服务上部署的应用程序上的 dotnet Core 中创建 PDF?
【发布时间】:2020-07-24 13:22:03
【问题描述】:

我开发了一个 dotnet 核心应用程序。在我的一个过程中,我需要生成一个 PDF 文件。 我尝试了一些包,我选择了 DinkToPdf 包。

这是我在启动文件中的配置:

services.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools()));

然后,当我想生成 pdf 时,我会加载外部二进制文件(我将二进制文件 libwkhtmltox.dll 和 libwkhtmltox.so 存储在 /lib/x64 中,并将 Build Action 设置为 Content 并始终复制以将它们放入 bin 文件夹中) ):

string libPath = Path.Combine(Directory.GetCurrentDirectory(), $"lib/{architectureFolder}/libwkhtmltox" + fileEx);   
context.LoadUnmanagedLibrary(libPath);

LoadUnmanagedLibrary 函数:

public class CustomAssemblyLoadContext : AssemblyLoadContext
{
public IntPtr LoadUnmanagedLibrary(string absolutePath)
{
    return LoadUnmanagedDll(absolutePath);
}
protected override IntPtr LoadUnmanagedDll(String unmanagedDllName)
{
    return LoadUnmanagedDllFromPath(unmanagedDllName);
}

protected override Assembly Load(AssemblyName assemblyName)
{
    throw new NotImplementedException();
}
}

此过程在我的本地 Windows 中运行良好,但是当我在 Linux 的 Azure 应用服务(B1 计划,但我也尝试过使用 S1)中部署我的应用时,我得到以下异常:

System.DllNotFoundException: Unable to load shared library 'libwkhtmltox' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: liblibwkhtmltox: cannot open shared object file: No such file or directory

我检查了二进制文件,它们被很好地复制到了 bin 文件夹中。 我知道有 a time 在 Azure App 服务中加载此类库被阻止,但现在看起来这是授权的。

你们对这个问题有什么想法吗?

非常感谢您的帮助! :)

多里安

【问题讨论】:

    标签: asp.net-core pdf-generation azure-web-app-service wkhtmltopdf


    【解决方案1】:

    如果您在应用服务中以 Windows 为目标,则 Windows 沙盒对某些 GDI API 有限制。一些 PDF 引擎可以工作,但对于那些需要更高级 GDI API 才能工作的引擎,它们将被阻止。

    但是,一种可能性是在 Azure 应用服务上使用 Windows 容器,因为 Windows 容器是沙箱,所以您不会有任何沙箱限制。

    您可以在此处按照快速入门在应用服务中运行 Windows 容器:

    https://docs.microsoft.com/en-us/azure/app-service/app-service-web-get-started-windows-container

    如果您的目标是 Linux on App Service,那么您将在 Linux 容器中运行。您可以尝试创建自定义 Linux 容器并将其部署到应用服务:

    https://docs.microsoft.com/en-us/azure/app-service/containers/quickstart-docker

    【讨论】:

    • 我的目标是 Linux。如果我创建一个 Linux 容器以在 Azure 应用服务 B1 中运行我的程序,我应该向 Linux 容器添加什么以允许创建 PDF?我还研究了在 Azure 函数中创建 pdf,但在消费计划中看起来也不可能。
    • 由于你是在App Service Linux下运行的,建议开启支持事件:docs.microsoft.com/en-us/azure/azure-portal/supportability/…
    【解决方案2】:

    看起来这个问题正在这里讨论:https://github.com/rdvojmoc/DinkToPdf/issues/3

    根据此链接,没有一种简单的方法可以将 lib libwkhtmltox.so 文件获取到 docker 映像。

    【讨论】:

      猜你喜欢
      • 2020-12-08
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-16
      • 2021-06-02
      相关资源
      最近更新 更多