Combinación de Azure Blob (Pdf) en un Blob y descarga para el usuario a través de C# ASP.NET

0

Pregunta

Tengo una ASP.NET Azure web de la aplicación escrita en C# que implica que el usuario cargar diferentes archivos en pdf, en Azure Blob de almacenamiento. Me gustaría que el usuario para su posterior descarga un archivo PDF combinado incluido previamente a cargar notas en un orden específico. Cualquier idea sobre la mejor manera de lograr esto?

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

Mejor respuesta

1

Aquí hay 2 soluciones que puede probar

  1. El uso de Azure Funciones.
  2. Descarga tus archivos pdf a partir de Azure Blob para el equipo local, luego de combinación de ellos.

Uso de Funciones de Azure

  1. Crear una azure función del proyecto y el uso de HTTP Gatillo.
  2. Asegúrese de instalar el siguiente paquete antes de empezar con la codificación.
  3. Crear el código de la Función.
  4. Crear Azure función en el portal.
  5. Publicar el código.

Estamos listos para empezar a escribir código. Necesitamos dos archivos:

  1. ResultClass.cs – devuelve el archivo combinado(s) como una lista.
  2. Function1.cs – c-code que lleva los nombres de archivo desde la URL, se agarra a ellos desde la cuenta de Almacenamiento, las fusiona en una sola, y devuelve una URL de descarga.

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

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

Descarga tus archivos pdf a partir de Azure Blob para el equipo local, luego fusionarlas

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

REFERENCIAS:

  1. Azure Función para combinar PDF Blobs de Azure Cuenta de Almacenamiento (Blob contenedor)
  2. C# PDF Merge SDK: Combinar, combinar archivos PDF en C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
2021-11-22 05:18:46

SwethaKandikonda-MT, esta fue una increíble solución y que me han incorporado con éxito en mi sitio web. Mis más sincero agradecimiento a usted por responder! Yo no había trabajado con Azure Funciones antes de tu comentario, pero yo sé mucho más que ahora. Ordenar y compilar subido azure blob documentos Pdf en un PDF, era algo que casi me rendí hasta que este.
Wallstreetguy

Si mi respuesta es ayudado a usted, usted puede aceptarlo como una respuesta (haga Clic en la marca de verificación al lado de la respuesta para cambiar de color gris para rellenar). Esto puede ser beneficioso para otros miembros de la comunidad. Gracias
SwethaKandikonda-MT

En otros idiomas

Esta página está en otros idiomas

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