Cómo ejecutar Aspose.PDF for .NET 6 en Docker

Requisitos previos

Los siguientes ejemplos se probaron con:

  • Docker v.20.10.11 y Docker Desktop 4.3.2.
  • Visual Studio 2022 Community Edition v.17.0.5.
  • .NET 6 SDK se utiliza en el ejemplo proporcionado a continuación.
  • Aspose.PDF for .NET v.22.01.

Crear una aplicación de muestra para el contenedor Docker Linux

  1. Inicie Visual Studio 2022 y elija la plantilla ASP.NET Core Web App (Modelo-Vista-Controlador) y presione Siguiente.
  2. En la ventana Configurar su nuevo proyecto, establezca el nombre y la ubicación del proyecto deseados y presione Siguiente.
  3. En la ventana Información adicional, elija .NET 6.0 (Soporte a largo plazo) y habilite el soporte de Docker. También puede establecer Docker OS en Linux si es necesario.
  4. Presione Crear.
  5. Elija Herramientas->Administrador de paquetes Nuget->Consola del administrador de paquetes e instale Aspose.PDF for .NET (utilice el comando Install-Package Aspose.PDF).

Generar documento PDF usando ASP.NET Core Web App en contenedor Linux

Usaremos el código del Ejemplo Complejo en esta aplicación. Siga este enlace para una explicación más detallada.

  1. Cree una carpeta images en la carpeta wwwroot y coloque la imagen logo.png. Puede descargar esta imagen desde aquí.
  2. Reemplace el código en HomeController.cs con el siguiente fragmento (tenga en cuenta que puede tener otro espacio de nombres):

El siguiente fragmento de código también funciona con la biblioteca Aspose.PDF.Drawing.

using Aspose.Pdf;
using Aspose.Pdf.Text;
using Docker.Linux.Demo01.Models;
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;

namespace Docker.Linux.Demo01.Controllers
{
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
        private readonly IWebHostEnvironment _appEnvironment;

        public HomeController(ILogger<HomeController> logger, IWebHostEnvironment appEnvironment)
        {
            _logger = logger;
            _appEnvironment = appEnvironment;
        }

        public IActionResult Index()
        {
            return View();
        }
        
        public IActionResult Generate()
        {
            const string file_type = "application/pdf";
            const string file_name = "sample.pdf";
            var memoryStream = new MemoryStream();

            _logger.LogInformation("Start");
            // Initialize document object
            using (var document = new Aspose.Pdf.Document())
            {
                // Add page
                var page = document.Pages.Add();

                // Add image
                var imageFileName = Path.Combine(_appEnvironment.WebRootPath, "images", "logo.png");
                page.AddImage(imageFileName, new Rectangle(20, 730, 120, 830));

                // -------------------------------------------------------------
                // Add Header
                var header = new TextFragment("New ferry routes in Fall 2020");
                header.TextState.Font = FontRepository.FindFont("Arial");
                header.TextState.FontSize = 24;
                header.HorizontalAlignment = HorizontalAlignment.Center;
                header.Position = new Position(130, 720);
                page.Paragraphs.Add(header);

                // Add description
                var descriptionText = "Visitors must buy tickets online and tickets are limited to 5,000 per day. Ferry service is operating at half capacity and on a reduced schedule. Expect lineups.";
                var description = new TextFragment(descriptionText);
                description.TextState.Font = FontRepository.FindFont("Times New Roman");
                description.TextState.FontSize = 14;
                description.HorizontalAlignment = HorizontalAlignment.Left;
                page.Paragraphs.Add(description);

                // Add table
                var table = new Table
                {
                    ColumnWidths = "200",
                    Border = new BorderInfo(BorderSide.Box, 1f, Color.Black),
                    DefaultCellBorder = new BorderInfo(BorderSide.Box, 0.5f, Color.Gray),
                    DefaultCellPadding = new MarginInfo(4.5, 4.5, 4.5, 4.5),
                    Margin =
                    {
                        Top = 10,
                        Bottom = 10
                    },
                    DefaultCellTextState =
                    {
                        Font =  FontRepository.FindFont("Helvetica")
                    }
                };

                var headerRow = table.Rows.Add();
                headerRow.Cells.Add("Departs City");
                headerRow.Cells.Add("Departs Island");
                foreach (Cell headerRowCell in headerRow.Cells)
                {
                    headerRowCell.BackgroundColor = Color.LightGray;
                    headerRowCell.DefaultCellTextState.ForegroundColor = Color.FromRgb(0.1, 0.1, 0.1);
                }

                var time = new TimeSpan(6, 0, 0);
                var incTime = new TimeSpan(0, 30, 0);
                for (int i = 0; i < 10; i++)
                {
                    var dataRow = table.Rows.Add();
                    dataRow.Cells.Add(time.ToString(@"hh\:mm"));
                    time = time.Add(incTime);
                    dataRow.Cells.Add(time.ToString(@"hh\:mm"));
                }

                page.Paragraphs.Add(table);

                document.Save(memoryStream);
            }
            _logger.LogInformation("Finish");
            return File(memoryStream, file_type, file_name);
        }

        public IActionResult Privacy()
        {
            return View();
        }

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    }
}
  1. Reemplace el contenido en Dockerfile con el siguiente contenido:
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
RUN apt-get update && apt-get install -y libgdiplus
RUN sed -i'.bak' 's/$/ contrib/' /etc/apt/sources.list
RUN apt-get update; apt-get install -y ttf-mscorefonts-installer fontconfig

WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["Docker.Linux.Demo01/Docker.Linux.Demo01.csproj", "Docker.Linux.Demo01/"]
RUN dotnet restore "Docker.Linux.Demo01/Docker.Linux.Demo01.csproj"
COPY . .
WORKDIR "/src/Docker.Linux.Demo01"
RUN dotnet build "Docker.Linux.Demo01.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "Docker.Linux.Demo01.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Docker.Linux.Demo01.dll"]

Crear una aplicación de muestra para el contenedor Docker Windows

  1. Inicie Visual Studio 2022 y elija la plantilla ASP.NET Core Web App (Modelo-Vista-Controlador) y presione Siguiente.
  2. En la ventana Configurar su nuevo proyecto, establezca el nombre y la ubicación del proyecto deseados y presione Siguiente.
  3. En la ventana Información adicional, elija .NET 6.0 (Soporte a largo plazo) y habilite el soporte de Docker. Si es necesario, también puede establecer Docker OS en Windows.
  4. Presione Crear.
  5. Elija Herramientas->Administrador de paquetes Nuget->Consola del administrador de paquetes e instale Aspose.PDF for .NET (utilice el comando Install-Package Aspose.PDF).

Generar documento PDF usando ASP.NET Core Web App en contenedor Windows

Usaremos el mismo código que en el ejemplo anterior.

  1. Cree una carpeta images en la carpeta wwwroot y coloque la imagen logo.png. Puede descargar esta imagen desde aquí.
  2. Reemplace el código en HomeController.cs con el fragmento anterior.
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:6.0.101-nanoserver-ltsc2022 AS build
WORKDIR /src
COPY ["Docker.Windows.Demo01/Docker.Windows.Demo01.csproj", "Docker.Windows.Demo01/"]
RUN dotnet restore "Docker.Windows.Demo01/Docker.Windows.Demo01.csproj"
COPY . .
WORKDIR "/src/Docker.Windows.Demo01"
RUN dotnet build "Docker.Windows.Demo01.csproj" -c Release -o /app/build -r win-x64 --self-contained true

FROM build AS publish
RUN dotnet publish "Docker.Windows.Demo01.csproj" -c Release -o /app/publish -r win-x64 --self-contained true

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Docker.Windows.Demo01.dll"]