2017-03-01 1 views
2

J'ai reçu une mission pour voir si je peux faire une application de puissance qui va générer un fichier PDF pour l'utilisateur final à voir. Après grâce à la recherche sur ce sujet, je trouve que ce n'est pas facile à atteindre :) Afin de générer l'application de la puissance et télécharger/spectacle généré pdf J'ai fait ces étapes:Power App - générer un PDF

  1. application de puissance Créé avec seulement un bouton :) pour appeler la fonction Azure de l'étape 2
  2. Créé fonction Azure qui va générer et retour pdf comme StreamContent

en raison des limitations d'applications de puissance (ou je ne pouvais pas trouver le chemin) il n'y avait aucun moyen pour moi d'obtenir pdf de la réponse à l'intérieur de l'application de puissance. Après cela, j'ai changé ma fonction Azure pour créer une nouvelle entrée blob, mais je sais que j'ai du mal à obtenir l'URL de cette nouvelle entrée dans la fonction Azure. code de fonction Azure est inférieure

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; 
} 

Je suis parti ancien code (celui qui ruisselle pdf retour dans les commentaires comme référence de ce que j'ai essayé)

est-il possible d'obtenir l'URL de téléchargement pour l'entrée de blob nouvellement généré à l'intérieur de la fonction Azure? Existe-t-il un meilleur moyen de générer, de télécharger et d'afficher les fichiers PDF générés?

P.S. J'ai essayé d'utiliser le contrôle PDFViewer dans l'application de la puissance, mais ce contrôle est complètement inutile la cause U ne peut pas définir la valeur de document via la fonction

EDIT: Réponse de @mathewc m'a beaucoup aidé pour enfin conclure. Tous les détails sont ci-dessous. fonction New Azure qui fonctionne comme prévu

#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); 
} 

REMARQUES:

  1. Wee besoin d'ajouter "WindowsAzure.Storage": "7.2.1" à l'intérieur project.json. Ce paquet MUST être la même version que l'un avec le même nom qui est en% USERPROFILE% \ AppData \ Local \ Azure.Functions.Cli
+0

Bravo! J'ai le même problème. Qu'avez-vous fait avec l'URI dans le PowerApp? Comment fonctionne la sécurité? Je vais vérifier le lien ci-dessous aussi :-) – MikeAinOz

Répondre

2

Si vous changez votre sortie blob type de liaison de Stream à CloudBlockBlob vous voulez avoir accès à CloudBlockBlob.Uri qui est le chemin de blob dont vous avez besoin (documentation here). Vous pouvez ensuite renvoyer cet Uri à votre application Power. Vous pouvez utiliser CloudBlockBlob.UploadFromStreamAsync pour télécharger votre flux PDF vers le blob.