3

我正在编写一个用于 PDF 转换的 Azure 函数,它依赖于 DataLogics PDF 转换和一个用于密码生成的 Nuget 包 (mlkpwgen)。

功能是

using System.IO;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Azure.WebJobs.Host;
using Newtonsoft.Json;
using System;
using MlkPwgen;
using Datalogics.PDFL;
using System.Diagnostics;

namespace FunctionApp1   
{
public static class Function1
{

    [FunctionName("Function1")]
    public static IActionResult Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequest req, TraceWriter log)
    {
        log.Info("C# HTTP trigger function processed a request.");

        string name = req.Query["name"];
        PDFConversion();
        string requestBody = new StreamReader(req.Body).ReadToEnd();
        dynamic data = JsonConvert.DeserializeObject(requestBody);
        name = name ?? data?.name;

        return name != null
            ? (ActionResult)new OkObjectResult($"Hello, {name}")
            : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
    }

    public static string PDFConversion()
    {
        using (Library lib = new Library())
        {


            String sInput = @"C:\Users\Kunal\Downloads\Indian Management.pdf";
            String sOutput = @"C:\Users\Kunal\Downloads\WatermarkedOutput.pdf";


            Document doc = new Document(sInput);
            string ownerPassword = PasswordGenerator.Generate(length: 32);
            string userPassword = PasswordGenerator.Generate(length: 32);
            doc.Secure(PermissionFlags.Print | PermissionFlags.HighPrint, ownerPassword, userPassword);
            WatermarkParams watermarkParams = new WatermarkParams();
            watermarkParams.Rotation = 45.3f;
            watermarkParams.Opacity = 0.15f;
            watermarkParams.TargetRange.PageSpec = PageSpec.AllPages;
            WatermarkTextParams watermarkTextParams = new WatermarkTextParams();
            Color color = new Color(0.0f / 255.0f, 0.0f / 255.0f, 0.0f / 255.0f);
            watermarkTextParams.Color = color;
            watermarkTextParams.Text = "Centre Code - Unit - 0101";
            Font f = new Font("Arial", FontCreateFlags.Embedded | FontCreateFlags.Subset);
            watermarkTextParams.Font = f;
            watermarkTextParams.FontSize = 80f;
            watermarkTextParams.TextAlign = HorizontalAlignment.Center;
            doc.Watermark(watermarkTextParams, watermarkParams);
            doc.EmbedFonts();
            doc.Save(SaveFlags.Full | SaveFlags.Linearized, sOutput);

            Process.Start(@"C:\Users\Kunal\Downloads\WatermarkedOutput.pdf");

            return sInput;
        }
    }
}
}

我收到以下异常

“System.Private.CoreLib:执行函数时出现异常:Function1。Datalogics.PDFL:“Datalogics.PDFL.PDFLPINVOKE”的类型初始化程序引发异常。Datalogics.PDFL:“SWIGExceptionHelper”的类型初始化程序引发异常。Datalogics。 PDFL:无法加载 DLL 'DL150PDFLPINVOKE':找不到指定的模块。(来自 HRESULT 的异常:0x8007007E)。

相同的代码可以作为控制台应用程序正常工作。我在这里想念什么?

4

3 回答 3

1

如果修复硬编码文件名仍然没有帮助,则该错误听起来像是权限异常。

Azure Functions 在应用服务上运行,该服务具有用于所有代码的沙箱,其中不允许某些调用。例如,PDF 生成库广泛使用的 GDI32。

在Azure Web App 沙盒中了解更多信息。

于 2018-05-28T07:54:28.330 回答
0

感谢您阅读问题并尝试回答。

我发现即使在添加对 Datalogics.PDFL.dll 的引用之后,代码还是失败了。

所以我将所有其他 dll 复制到 bin\debug 文件夹中,现在代码工作正常

DL150ACE.dll

DL150AdobeXMP.dll

DL150AGM.dll

DL150ARE.dll

DL150AXE8SharedExpat.dll

DL150BIB.dll

DL150BIBUtils.dll

DL150CoolType.dll

DL150JP2KLib.dll

DL150PDFL.dll

DL150PDFLPINVOKE.dll

DL150pdfport.dll

DL150pdfsettings.dll

DotNETViewerComponent.dll

于 2018-05-28T09:43:28.323 回答
0

根据这个MS 论坛帖子

Azure Functions 在其当前版本中不支持加载本机二进制文件。即使我们能够安装此软件包,在运行时加载这些原生 dll 时,您仍然可能会遇到错误。

因此,这是尝试调用本机二进制文件时的预期行为。如果您对开始使用 PDF 库有任何疑问,请联系我们的支持部门。

于 2018-06-21T23:19:35.350 回答