Конвертация документов с помощью Microsoft Azure App Service

Эта статья предоставляет подробные пошаговые инструкции по конвертации PDF-документов в Microsoft Azure с использованием Aspose.PDF for .NET и Azure App Service.

Предварительные требования

  • Visual Studio 2022 Community Edition с установленной разработкой для Azure или Visual Studio Code.
  • Учетная запись Azure: вам нужна подписка Azure, создайте бесплатную учетную запись перед началом.
  • .NET 6 SDK.
  • Aspose.PDF for .NET.

Создание ресурсов Azure

Создание App Service

  1. Перейдите в Azure Portal (https://portal.azure.com).
  2. Создайте новую группу ресурсов.
  3. Создайте новый App Service:
    • Выберите среду выполнения .NET 6 (LTS).
    • Выберите соответствующий уровень цен.
  4. Создайте ресурс Application Insights для ведения журналов.

Создание проекта

Создание проекта в Visual Studio

  1. Откройте Visual Studio 2022.
  2. Нажмите “Создать новый проект”.
  3. Выберите “ASP.NET Core Web API”.
  4. Назовите ваш проект “PdfConversionService”.
  5. Выберите “.NET 6.0” или более позднюю версию.
  6. Нажмите “Создать”.

Создание проекта в Visual Studio Code

Установка предварительных требований

  1. Расширения Visual Code:
code --install-extension ms-dotnettools.csharp
code --install-extension ms-azuretools.vscode-azureappservice
  1. Установите Azure CLI:
  • Windows: загрузите с сайта Microsoft.
  • macOS: brew install azure-cli.
  • Linux: curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash.

Настройка проекта

  1. Откройте проект в Visual Studio Code:
code .
  1. Добавьте пакеты NuGet, создав/обновив PdfConverterApp.csproj:
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Aspose.PDF" Version="24.10.0" />
    <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.22.0" />
    <PackageReference Include="Microsoft.Extensions.Logging.AzureAppServices" Version="8.0.10" />
  </ItemGroup>
</Project>
  1. Добавьте конфигурацию:
// .vscode/launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": ".NET Core Launch (web)",
            "type": "coreclr",
            "request": "launch",
            "preLaunchTask": "build",
            "program": "${workspaceFolder}/bin/Debug/net6.0/PdfConversionService.dll",
            "args": [],
            "cwd": "${workspaceFolder}",
            "stopAtEntry": false,
            "env": {
                "ASPNETCORE_ENVIRONMENT": "Development"
            }
        }
    ]
}
  1. Создайте структуру проекта:
mkdir Controllers
touch Controllers/PdfController.cs

Установка необходимых пакетов NuGet

В Visual Studio откройте консоль диспетчера пакетов и выполните:

Install-Package Aspose.PDF
Install-Package Microsoft.ApplicationInsights.AspNetCore
Install-Package Microsoft.Extensions.Logging.AzureAppServices

В Visual Studio Code выполните:

dotnet restore

Настройка лицензии Aspose

В Visual Studio:

  1. Скопируйте файл лицензии Aspose.PDF в проект.
  2. Щелкните правой кнопкой мыши на файле лицензии и выберите “Свойства”.
  3. Установите “Копировать в выходной каталог” на “Копировать всегда”.
  4. Добавьте код инициализации лицензии в Program.cs:
var license = new Aspose.Pdf.License();
license.SetLicense("Aspose.PDF.lic");

Создание кода

В Visual Studio:

  1. Щелкните правой кнопкой мыши на папке Controllers.
  2. Добавить → Новый элемент → API Controller - Пустой.
  3. Назовите ваш файл “PdfController.cs”.
// PdfController.cs
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/[controller]")]
public class PdfController : ControllerBase
{
    private readonly ILogger<PdfController> _logger;

    public PdfController(ILogger<PdfController> logger)
    {
        _logger = logger;
    }

    [HttpPost("convert")]
    public async Task<IActionResult> ConvertPdf(
        IFormFile file,
        [FromQuery] string outputFormat = "docx")
    {
        try
        {
            if (file == null || file.Length == 0)
            {
                return BadRequest("No file uploaded");
            }

            // Validate input file is PDF
            if (!file.ContentType.Equals("application/pdf", StringComparison.OrdinalIgnoreCase))
            {
                return BadRequest("File must be a PDF");
            }

            using var inputStream = file.OpenReadStream();
            using var document = new Aspose.Pdf.Document(inputStream);
            using var outputStream = new MemoryStream();

            switch (outputFormat.ToLower())
            {
                case "docx":
                    document.Save(outputStream, Aspose.Pdf.SaveFormat.DocX);
                    return File(outputStream.ToArray(),
                        "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
                        "converted.docx");

                case "html":
                    document.Save(outputStream, Aspose.Pdf.SaveFormat.Html);
                    return File(outputStream.ToArray(),
                        "text/html",
                        "converted.html");

                case "jpg":
                case "jpeg":
                    var jpegDevice = new Aspose.Pdf.Devices.JpegDevice();
                    jpegDevice.Process(document.Pages[1], outputStream);
                    return File(outputStream.ToArray(),
                        "image/jpeg",
                        "converted.jpg");

                case "png":
                    var pngDevice = new Aspose.Pdf.Devices.PngDevice();
                    pngDevice.Process(document.Pages[1], outputStream);
                    return File(outputStream.ToArray(),
                        "image/png",
                        "converted.png");

                default:
                    return BadRequest("Unsupported output format");
            }
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error converting PDF");
            return StatusCode(500, "Internal server error");
        }
    }
}
// Program.cs
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

// Add logging
builder.Services.AddApplicationInsightsTelemetry();
builder.Services.AddLogging(logging =>
{
    logging.AddConsole();
    logging.AddDebug();
    logging.AddAzureWebAppDiagnostics();
});

var app = builder.Build();

// Initialize license
var license = new Aspose.Pdf.License();
license.SetLicense("Aspose.PDF.lic");

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

Настройка параметров приложения

  1. Откройте appsettings.json.
  2. Добавьте конфигурацию:
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ApplicationInsights": {
    "ConnectionString": "Your-Connection-String"
  }
}

Замените Your-Connection-StringG на вашу фактическую строку подключения из Azure Portal.

Тестирование локально

В Visual Studio:

  1. Нажмите F5, чтобы запустить приложение.
  2. Откроется Swagger UI.
  3. Протестируйте конечную точку /api/pdf/convert:
    • Нажмите “Попробовать”.
    • Загрузите PDF-файл.
    • Выберите формат вывода.
    • Выполните и проверьте конвертацию.

В Visual Studio Code:

dotnet run

curl -X POST "https://localhost:5001/api/pdf/convert?outputFormat=docx" \
     -F "file=@sample.pdf" \
     -o converted.docx

Развертывание в Azure

В Visual Studio:

  1. Щелкните правой кнопкой мыши на проекте.
  2. Выберите “Опубликовать”.
  3. Выберите “Azure” в качестве цели.
  4. Выберите “Azure App Service (Windows)”.
  5. Выберите вашу подписку и App Service.
  6. Нажмите “Опубликовать”.

В Visual Studio Code:

dotnet publish -c Release

az webapp deployment source config-zip \
    --resource-group $resourceGroup \
    --name $appName \
    --src bin/Release/net6.0/publish.zip

az webapp deploy \
    --resource-group $resourceGroup \
    --name $appName \
    --src-path "Aspose.PDF.lic" \
    --target-path "site/wwwroot/Aspose.PDF.lic"

Настройка Azure App Service

  1. Перейдите в Azure Portal.
  2. Откройте ваш App Service.
  3. Настройте параметры:
    App Settings:
    - WEBSITE_RUN_FROM_PACKAGE=1
    - ASPNETCORE_ENVIRONMENT=Production
    

Тестирование развернутого сервиса

Используйте Postman или curl для тестирования:

curl -X POST "https://your-app.azurewebsites.net/api/pdf/convert?outputFormat=docx" \
     -F "file=@sample.pdf" \
     -o converted.docx

Поддерживаемые форматы

Список поддерживаемых форматов можно найти здесь.

Устранение неполадок

Важные параметры конфигурации

  1. Ограничения по размеру файла Добавьте в web.config:
<configuration>
  <system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="104857600" />
      </requestFiltering>
    </security>
  </system.webServer>
</configuration>
  1. CORS (если необходимо) В Program.cs:
builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowSpecificOrigin",
        builder => builder
            .WithOrigins("https://your-frontend-domain.com")
            .AllowAnyMethod()
            .AllowAnyHeader());
});
  1. Аутентификация (если необходимо)
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options => {
        // Configure JWT options
    });