2017-03-01 65 views
2

我得到了一项任务,看看我是否可以制作能够生成一些PDF文件供最终用户查看的电源应用程序。 后通过对这个课题的研究,我发现,这不是一个容易实现:) 为了使电力应用产生和下载/显示生成的PDF我提出下列步骤操作:电力应用程序 - 生成PDF

  1. 创建只有电源应用一个键:)从步骤2调用Azure的功能
  2. 创建Azure的功能,将产生和StreamContent

返回PDF由于电源应用的限制(或我简直找不到路),有没有办法对于我来说,从电源应用程序内的响应得到PDF。 之后,我改变了我的Azure功能来创建新的blob条目,但知道我有问题,以获得Azure功能内的新条目的URL,以便将其返回给电源应用程序,然后使用内部电源应用程序下载功能

我的Azure的功能代码如下

using System; 
using System.Net; 
using System.Net.Http.Headers; 
using System.Runtime.InteropServices; 
using Aspose.Words; 

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log, Stream outputBlob) 
{ 
    log.Info($"C# HTTP trigger function processed a request. RequestUri={req.RequestUri}"); 

    var dataDir = @"D:/home"; 
    var docFile = $"{dataDir}/word-templates/WordAutomationTest.docx"; 
    var uid = Guid.NewGuid().ToString().Replace("-", ""); 
    var pdfFile = $"{dataDir}/pdf-export/WordAutomationTest_{uid}.pdf"; 
    var doc = new Document(docFile); 
    doc.Save(pdfFile); 

    var result = new HttpResponseMessage(HttpStatusCode.OK); 
    var stream = new FileStream(pdfFile, FileMode.Open); 

    stream.CopyTo(outputBlob); 

    // result.Content = new StreamContent(stream); 
    // result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment"); 
    // result.Content.Headers.ContentDisposition.FileName = Path.GetFileName(pdfFile); 
    // result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); 
    // result.Content.Headers.ContentLength = stream.Length; 

    return result; 
} 

我离开旧代码(就像什么我想引用该流的PDF背下的评论之一)

有没有什么办法让下载网址为新生成的斑点进入Azure函数里面? 有没有更好的方式让电源应用生成并下载/显示生成的PDF?

P.S.我试图用电源内部应用程序PDF查看器控制,但这种控制是完全无用的原因你无法通过功能

编辑设置文件值:从@mathewc响应帮了我很多,终于包装这件事。所有细节如下。 Azure的新功能,如预期

#r "Microsoft.WindowsAzure.Storage" 

using System; 
using System.Net; 
using System.Net.Http.Headers; 
using System.Runtime.InteropServices; 
using Aspose.Words; 
using Microsoft.WindowsAzure.Storage.Blob; 

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log, CloudBlockBlob outputBlob) 
{ 
    log.Info($"C# HTTP trigger function processed a request. RequestUri={req.RequestUri}"); 

    var dataDir = @"D:/home"; 
    var docFile = $"{dataDir}/word-templates/WordAutomationTest.docx"; 
    var uid = Guid.NewGuid().ToString().Replace("-", ""); 
    var pdfFile = $"{dataDir}/pdf-export/WordAutomationTest_{uid}.pdf"; 
    var doc = new Document(docFile); 
    doc.Save(pdfFile); 

    var result = new HttpResponseMessage(HttpStatusCode.OK); 
    var stream = new FileStream(pdfFile, FileMode.Open); 

    outputBlob.UploadFromStream(stream); 
    return req.CreateResponse(HttpStatusCode.OK, outputBlob.Uri); 
} 

的作品备注

  1. 嫣需要添加 “WindowsAzure.Storage”: “7.2.1” 内部project.json。这个包MUST是同一版本作为一个与在相同的名称%USERPROFILE%\应用程序数据\本地\ Azure.Functions.Cli
+0

干得好!我有一个类似的问题。你对PowerApp中的URI做了什么?安全性如何工作?我会检查下面的链接以及:-) – MikeAinOz

回答

2

如果你改变你的BLOB输出绑定类型从StreamCloudBlockBlob你会有权访问CloudBlockBlob.Uri这是您需要的斑点路径(文档here)。然后,您可以将该Uri返回给您的Power App。您可以使用CloudBlockBlob.UploadFromStreamAsync将您的PDF流上传到blob。