Unire Azure Blob (Pdf) in un unico Blob e scaricare all'utente tramite C# ASP.NET

0

Domanda

Ho un ASP.NET Azure web applicazione scritta in C# che implica per l'utente di caricare diversi file pdf in Azure Blob storage. Vorrei che l'utente in seguito scaricare un PDF combinato inclusive precedentemente caricato blob in un ordine specifico. Qualche idea sul modo migliore per ottenere questo risultato?

asp.net azure blob c#
2021-11-21 19:18:14
1

Migliore risposta

1

Qui ci sono 2 soluzioni che si possono provare

  1. Utilizzo di Azure Funzioni.
  2. Scarica il file pdf da Azure Blob al computer locale, quindi unire a loro.

Utilizzo di Azure Funzioni

  1. Creare un azure progetto di funzione e utilizzare il protocollo HTTP Trigger.
  2. Assicurarsi di installare i pacchetti elencati di seguito prima di iniziare la codifica.
  3. Creare il codice della Funzione.
  4. Creare Azure funzione nel portale.
  5. Pubblichiamo il codice.

Siamo pronti per iniziare a scrivere codice. Abbiamo bisogno di due file:

  1. ResultClass.cs – restituisce il file unito(s) come un elenco.
  2. Funzione1.cs – CCode che prende i nomi di file da un URL, li afferra dall'account di Archiviazione, e li unisce in una, e restituisce un URL di download.

ResultClass.cs

using System;
using System.Collections.Generic;

namespace FunctionApp1
{

    public class Result
    {

        public Result(IList<string> newFiles)
        {
            this.files = newFiles;
        }

        public IList<string> files { get; private set; }
    }
}

Funzione1.cs

using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Configuration;
using Microsoft.WindowsAzure.Storage.Blob;
using Newtonsoft.Json;
using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;

namespace FunctionApp1
{
    public class Function1
    {

        static Function1()
        {

            // This is required to avoid the "No data is available                         for encoding 1252" exception when saving the PdfDocument
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);

        }

        [FunctionName("Function1")]
        public async Task<Result> SplitUploadAsync(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequestMessage req,
            //container where files will be stored and accessed for retrieval. in this case, it's called temp-pdf
            [Blob("temp-pdf", Connection = "")] CloudBlobContainer outputContainer,
            ILogger log)
        {
            //get query parameters

            string uriq = req.RequestUri.ToString(); 
            string keyw = uriq.Substring(uriq.IndexOf('=') + 1);

            //get file name in query parameters
            String fileNames = keyw.Split("mergepfd&filenam=")[1];

            //split file name
            string[] files = fileNames.Split(',');

            //process merge
            var newFiles = await this.MergeFileAsync(outputContainer, files);

            return new Result(newFiles);

        }

        private async Task<IList<string>> MergeFileAsync(CloudBlobContainer container, string[] blobfiles)
        {
            //init instance
            PdfDocument outputDocument = new PdfDocument();

            //loop through files sent in query
            foreach (string fileblob in blobfiles)
            {
                String intfile = $"" + fileblob;

                // get file
                CloudBlockBlob blob = container.GetBlockBlobReference(intfile);

                using (var memoryStream = new MemoryStream())
                {
                    await blob.DownloadToStreamAsync(memoryStream);

                    //get file content
                    string contents = blob.DownloadTextAsync().Result;
                   
                    //open document
                    var inputDocument = PdfReader.Open(memoryStream, PdfDocumentOpenMode.Import);

                    //get pages
                    int count = inputDocument.PageCount;
                    for (int idx = 0; idx < count; idx++)
                    {
                        //append
                        outputDocument.AddPage(inputDocument.Pages[idx]);
                    }


                }
            }


            var outputFiles = new List<string>();
            var tempFile = String.Empty;

            //call save function to store output in container
            tempFile = await this.SaveToBlobStorageAsync(container, outputDocument);

            outputFiles.Add(tempFile);

            //return file(s) url
            return outputFiles;
        }

        private async Task<string> SaveToBlobStorageAsync(CloudBlobContainer container, PdfDocument document)
        {

            //file name structure
            var filename = $"merge-{DateTime.Now.ToString("yyyyMMddhhmmss")}-{Guid.NewGuid().ToString().Substring(0, 4)}.pdf";

            // Creating an empty file pointer
            var outputBlob = container.GetBlockBlobReference(filename);

            using (var stream = new MemoryStream())
            {
                //save result of merge
                document.Save(stream);
                await outputBlob.UploadFromStreamAsync(stream);
            }

            //get sas token
            var sasBlobToken = outputBlob.GetSharedAccessSignature(new SharedAccessBlobPolicy()
            {
                SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(5),
                Permissions = SharedAccessBlobPermissions.Read
            });

            //return sas token
            return outputBlob.Uri + sasBlobToken;
        }
    }
}

Scarica il file pdf da Azure Blob al computer locale, quindi unirle

 internal static void combineNormalPdfFiles()
        {
            String inputFilePath1 = @"C:\1.pdf";
            String inputFilePath2 = @"C:\2.pdf";
            String inputFilePath3 = @"C:\3.pdf";
            String outputFilePath = @"C:\Output.pdf";
            String[] inputFilePaths = new String[3] { inputFilePath1, inputFilePath2, inputFilePath3 };

            // Combine three PDF files and output.
            PDFDocument.CombineDocument(inputFilePaths, outputFilePath);
        }

RIFERIMENTI:

  1. Azure Funzione per unire PDF Blob di Azure Account di Archiviazione Blob (contenitore)
  2. C# Merge PDF SDK: Unire, unire i file PDF in C#.net, ASP.NET MVC, Ajax, windows forms, WPF
2021-11-22 05:18:46

SwethaKandikonda-MT, questa è stata una straordinaria soluzione che ho integrata con successo nel mio sito web. Il mio molti sincero grazie a te per la risposta! Non avevo mai lavorato con Azure Funzioni prima del tuo commento, ma mi sa tanto di più. L'ordinazione e la compilazione caricato azure blob file Pdf in un solo file PDF è stato qualcosa che mi ha dato quasi fino a prima di questo.
Wallstreetguy

Se la mia risposta è aiutato, si può accettare come una risposta fare Clic sul segno di spunta accanto alla risposta per passare da combattimento completa). Questo può essere utile per gli altri membri della comunità. Grazie
SwethaKandikonda-MT

In altre lingue

Questa pagina è in altre lingue

Русский
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................