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?
1
Aquí hay 2 soluciones que puede probar
- El uso de Azure Funciones.
- Descarga tus archivos pdf a partir de Azure Blob para el equipo local, luego de combinación de ellos.
Uso de Funciones de Azure
- Crear una azure función del proyecto y el uso de HTTP Gatillo.
- Asegúrese de instalar el siguiente paquete antes de empezar con la codificación.
- Crear el código de la Función.
- Crear Azure función en el portal.
- Publicar el código.
Estamos listos para empezar a escribir código. Necesitamos dos archivos:
- ResultClass.cs – devuelve el archivo combinado(s) como una lista.
- 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:
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