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

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

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

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

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

Создание учетной записи хранения

  1. Перейдите в Azure Portal (https://portal.azure.com).
  2. Нажмите “Создать ресурс”.
  3. Найдите “Учетная запись хранения”.
  4. Нажмите “Создать”.
  5. Заполните данные:
    • Подписка: выберите свою подписку.
    • Группа ресурсов: создайте новую или выберите существующую.
    • Имя учетной записи хранения: введите уникальное имя.
    • Регион: выберите ближайший регион.
    • Производительность: стандартная.
    • Резервирование: LRS (Локально избыточное хранение).
  6. Нажмите “Просмотреть + создать”.
  7. Нажмите “Создать”.

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

  1. Откройте свою учетную запись хранения.
  2. Перейдите в “Контейнеры” в разделе “Хранение данных”.
  3. Нажмите “+ Контейнер”.
  4. Назовите его “pdfdocs”.
  5. Установите уровень публичного доступа на “Частный”.
  6. Нажмите “Создать”.

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

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

  1. Откройте Visual Studio 2022.
  2. Нажмите “Создать новый проект”.
  3. Выберите “Azure Functions”.
  4. Назовите свой проект “PdfConverterAzure”.
  5. Выберите “.NET 6.0” или более позднюю версию и “HTTP триггер”.
  6. Нажмите “Создать”.

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

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

  1. Расширения Visual Code:
code --install-extension ms-dotnettools.csharp
code --install-extension ms-azuretools.vscode-azurefunctions
code --install-extension ms-vscode.azure-account
  1. Установите Azure Functions Core Tools:
npm install -g azure-functions-core-tools@4 --unsafe-perm true
  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>
    <AzureFunctionsVersion>v4</AzureFunctionsVersion>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.1.1" />
    <PackageReference Include="Aspose.PDF" Version="24.10.0" />
    <PackageReference Include="Azure.Storage.Blobs" Version="12.14.1" />
    <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Storage" Version="5.0.1" />
  </ItemGroup>
</Project>

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

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

Install-Package Aspose.PDF
Install-Package Azure.Storage.Blobs
Install-Package Microsoft.Azure.WebJobs.Extensions.Storage

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

dotnet restore

Настройка подключения к Azure Storage

Получите ключи доступа для учетной записи хранения в разделе Ключи доступа в Azure Portal. Эти ключи будут использоваться для аутентификации вашего приложения.

  1. Откройте local.settings.json:
{
    "IsEncrypted": false,
    "Values": {
        "AzureWebJobsStorage": "YOUR_STORAGE_CONNECTION_STRING",
        "FUNCTIONS_WORKER_RUNTIME": "dotnet",
        "ContainerName": "pdfdocs"
    }
}
  1. Замените YOUR_STORAGE_CONNECTION_STRING на вашу фактическую строку подключения к хранилищу из Azure Portal.

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

В Visual Studio:

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

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

Создайте новый файл PdfConverter.cs:

using Azure.Storage.Blobs;
using System;
using System.IO;
using System.Threading.Tasks;

public class PdfConverter
{
    private readonly BlobContainerClient _containerClient;

    public PdfConverter(string connectionString, string containerName)
    {
        _containerClient = new BlobContainerClient(connectionString, containerName);
    }

    public async Task<string> ConvertToFormat(string sourceBlobName, string targetFormat)
    {
        // Download source PDF
        var sourceBlob = _containerClient.GetBlobClient(sourceBlobName);
        using var sourceStream = new MemoryStream();
        await sourceBlob.DownloadToAsync(sourceStream);
        sourceStream.Position = 0;

        // Open PDF document
        var document = new Aspose.Pdf.Document(sourceStream);

        // Create output stream
        using var outputStream = new MemoryStream();
        string targetBlobName = Path.GetFileNameWithoutExtension(sourceBlobName);

        // Convert based on format
        switch (targetFormat.ToLower())
        {
            case "docx":
                targetBlobName += ".docx";
                document.Save(outputStream, Aspose.Pdf.SaveFormat.DocX);
                break;

            case "html":
                targetBlobName += ".html";
                document.Save(outputStream, Aspose.Pdf.SaveFormat.Html);
                break;

            case "xlsx":
                targetBlobName += ".xlsx";
                document.Save(outputStream, Aspose.Pdf.SaveFormat.Excel);
                break;

            case "pptx":
                targetBlobName += ".pptx";
                document.Save(outputStream, Aspose.Pdf.SaveFormat.Pptx);
                break;

            case "jpeg":
            case "jpg":
                targetBlobName += ".jpg";
                foreach (var page in document.Pages)
                {
                    var jpegDevice = new Aspose.Pdf.Devices.JpegDevice(new Aspose.Pdf.Devices.Resolution(300));
                    jpegDevice.Process(page, outputStream);
                }
                break;

            default:
                throw new ArgumentException($"Unsupported format: {targetFormat}");
        }

        // Upload converted file
        outputStream.Position = 0;
        var targetBlob = _containerClient.GetBlobClient(targetBlobName);
        await targetBlob.UploadAsync(outputStream, true);

        return targetBlob.Uri.ToString();
    }
}

Создайте новый файл ConvertPdfFunction.cs:

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;
using System;
using System.IO;
using Newtonsoft.Json;
using Microsoft.AspNetCore.Mvc;

public static class ConvertPdfFunction
{
    [FunctionName("ConvertPdf")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Function, "post"), Route = "convert"] HttpRequest req,
        ILogger log)
    {
        try
        {
            // Read request body
            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            dynamic data = JsonConvert.DeserializeObject(requestBody);

            string sourceBlob = data?.sourceBlob;
            string targetFormat = data?.targetFormat;

            if (string.IsNullOrEmpty(sourceBlob) || string.IsNullOrEmpty(targetFormat))
            {
                return new BadRequestObjectResult("Please provide sourceBlob and targetFormat");
            }

            // Get configuration
            string connectionString = Environment.GetEnvironmentVariable("AzureWebJobsStorage");
            string containerName = Environment.GetEnvironmentVariable("ContainerName");

            // Convert PDF
            var converter = new PdfConverter(connectionString, containerName);
            string resultUrl = await converter.ConvertToFormat(sourceBlob, targetFormat);

            return new OkObjectResult(new { url = resultUrl });
        }
        catch (Exception ex)
        {
            log.LogError(ex, "Error converting PDF");
            return new StatusCodeResult(500);
        }
    }
}
// Startup.cs
[assembly: FunctionsStartup(typeof(PdfConverterAzure.Functions.Startup))]
namespace PdfConverterAzure.Functions
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            // Read configuration
            var config = builder.GetContext().Configuration;

            // Register services
            builder.Services.AddLogging();

            // Register Azure Storage
            builder.Services.AddSingleton(x => 
                new BlobServiceClient(config["AzureWebJobsStorage"]));

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

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

В Visual Studio:

  1. Запустите эмулятор Azure Storage.
  2. Запустите проект в Visual Studio.
  3. Используйте Postman или curl для тестирования:
curl -X POST http://localhost:7071/api/convert \
-H "Content-Type: application/json" \
-d '{"sourceBlob": "sample.pdf", "targetFormat": "docx"}'

В Visual Studio Code:

  1. Запустите приложение функции:
func start
  1. Загрузите PDF для тестирования:
az storage blob upload \
    --account-name $AccountName \
    --container-name pdfdocs \
    --name sample.pdf \
    --file /path/to/your/sample.pdf
  1. Используйте Postman или curl для тестирования:
curl -X POST http://localhost:7071/api/convert \
-H "Content-Type: application/json" \
-d '{"sourceBlob": "sample.pdf", "targetFormat": "docx"}'

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

В Visual Studio:

  1. Щелкните правой кнопкой мыши на проекте в Visual Studio.
  2. Выберите “Опубликовать”.
  3. Выберите “Azure Function App”.
  4. Выберите свою подписку.
  5. Создайте новую или выберите существующую функцию приложения.
  6. Нажмите “Опубликовать”.

В Visual Studio Code:

  1. Нажмите F1 или Ctrl+Shift+P.
  2. Выберите “Azure Functions: Развернуть в Function App”.
  3. Выберите свою подписку.
  4. Выберите созданное выше приложение функции.
  5. Нажмите “Развернуть”.

Настройка приложения функции Azure

  1. Перейдите в Azure Portal.
  2. Откройте свое приложение функции.
  3. Перейдите в “Конфигурация”.
  4. Добавьте настройки приложения:
    • Ключ: “ContainerName”.
    • Значение: “pdfdocs”.
  5. Сохраните изменения.

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

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

curl -X POST "https://your-function.azurewebsites.net/api/convert" \
     -H "x-functions-key: your-function-key" \
     -H "Content-Type: application/json" \
     -d '{"sourceBlob": "sample.pdf", "targetFormat": "docx"}'

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

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

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

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

  1. Добавьте аутентификацию:
[FunctionName("ConvertPdf")]
public async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = "convert")] HttpRequest req,
    ClaimsPrincipal principal,
    ILogger log)
{
    // Check authentication
    if (!principal.Identity.IsAuthenticated)
    {
        return new UnauthorizedResult();
    }
    // ...
}
  1. Для больших файлов рассмотрите возможность:
    • Увеличения времени ожидания функции.
    • Использования плана потребления с большим объемом памяти.
    • Реализации загрузки/выгрузки по частям.
    • Добавления отслеживания прогресса.