Połącz obiektów blob systemu Azure (pliki PDF) w jeden duży obiekt binarny i pobierz go użytkownikowi przez C# ASP.NET

0

Pytanie

Mam ASP.NET aplikacja sieci Web systemu Azure, napisany w C#, która obejmuje pobieranie przez użytkownika różnych plików PDF do magazynu obiektów blob systemu Azure. Chciałbym, aby użytkownik później wysłał wspólny plik PDF, zawierający pobrane wcześniej duże obiekty binarne w określonej kolejności. Jakieś pomysły o tym, jak najlepiej to zrobić?

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

Najlepsza odpowiedź

1

Oto 2 okrężnych ścieżek, które można spróbować

  1. Korzystanie z funkcji systemu Azure.
  2. Pobierz pliki PDF z obiektu blob systemu Azure na swój lokalny komputer, a następnie połącz je.

Korzystanie z funkcji systemu Azure

  1. Utwórz projekt funkcji systemu azure i użyj wyzwalacz HTTP.
  2. Upewnij się, że masz zainstalowane następujące pakiety, przed przystąpieniem do kodowania.
  3. Utwórz kod funkcji.
  4. Tworzenie funkcji systemu Azure na stronie.
  5. Podziel się kod.

Jesteśmy gotowi przystąpić do pisania kodu. Nam potrzebne są dwa pliki:

  1. ResultClass.cs – zwraca połączone pliki w postaci listy.
  2. Function1.cs – CCode, który bierze nazwy plików z adresu URL, chwyta je z konta bagażu, łączy je w jeden i zwraca adres URL do pobrania.

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

Funkcja 1.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;
        }
    }
}

Pobierz pliki PDF z obiektu blob systemu Azure na swój lokalny komputer, a następnie połącz je

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

LISTA LITERATURY:

  1. Funkcja Azure do łączenia dużych obiektów binarnych PDF na koncie magazynu systemu Azure (kontener obiektów blob)
  2. C# Merge PDF SDK: Scalanie, łączenie plików PDF w C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
2021-11-22 05:18:46

SwethaKandikonda-MT, to było niesamowite rozwiązanie, które z powodzeniem angażował się w swoją stronę. Moja ogromna serdeczne dzięki wam za odzew! Nie pracował z funkcjami systemu Azure do twojego komentarza, ale teraz wiem znacznie więcej. Zamówienie i kompilacja pobranych plików PDF azure blob w jeden plik PDF byli tym, od czego ja prawie nie chciał się do tego.
Wallstreetguy

Jeśli moja odpowiedź ci pomogła, można go przyjąć jako odpowiedź (kliknij na pole obok odpowiedzi, aby przełączyć go z szarego na wypełnienie). To może być przydatne dla innych członków społeczności. Dziękuję
SwethaKandikonda-MT

W innych językach

Ta strona jest w innych językach

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