You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET WebApi如何同时生成多语言版本PDF文件?

实现.NET WebAPI生成双语PDF的完整方案

Got it, let's break down how to implement this dual-language PDF generation in your .NET Web API workflow. Here's a step-by-step solution that fits your exact requirements:

1. 准备多语言本地化资源

首先,你需要把PDF里的文本内容按语言拆分,用.NET的本地化资源体系来管理:

  • 在你的Web API项目中创建一个Resources文件夹
  • 添加两个资源文件:Resources.en.resx(英语)和Resources.fr.resx(法语)
  • 为每个需要本地化的文本添加键值对,比如:
    • 在Resources.en.resx中:InvoiceTitle → Invoice
    • 在Resources.fr.resx中:InvoiceTitle → Facture

然后在Program.cs中配置本地化服务:

builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");

builder.Services.AddControllers()
    .AddViewLocalization()
    .AddDataAnnotationsLocalization();

// 定义支持的文化
var supportedCultures = new[] { "en", "fr" };
var localizationOptions = new RequestLocalizationOptions()
    .SetDefaultCulture(supportedCultures[0])
    .AddSupportedCultures(supportedCultures)
    .AddSupportedUICultures(supportedCultures);

app.UseRequestLocalization(localizationOptions);

2. 设计支持多语言的PdfService

核心思路是:临时切换线程的文化上下文,生成对应语言的PDF,然后恢复原文化避免影响其他请求。下面以iTextSharp为例(你也可以用QuestPDF、PdfSharp等现代库,逻辑通用):

using System.Globalization;
using System.IO;
using System.Threading;
using Microsoft.Extensions.Localization;
using iTextSharp.text;
using iTextSharp.text.pdf;

public class PdfService
{
    private readonly IStringLocalizer<Resources> _localizer;

    // 通过依赖注入获取本地化资源
    public PdfService(IStringLocalizer<Resources> localizer)
    {
        _localizer = localizer;
    }

    // 生成指定语言的PDF字节数组
    private byte[] GenerateSingleLanguagePdf(string culture)
    {
        // 保存原文化,后续恢复
        var originalCulture = Thread.CurrentThread.CurrentCulture;
        var originalUiCulture = Thread.CurrentThread.CurrentUICulture;
        
        try
        {
            // 切换到目标文化
            Thread.CurrentThread.CurrentCulture = new CultureInfo(culture);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);

            // 生成PDF的核心逻辑
            using var ms = new MemoryStream();
            var document = new Document();
            PdfWriter.GetInstance(document, ms);
            document.Open();

            // 从本地化资源中获取文本
            document.Add(new Paragraph(_localizer["InvoiceTitle"]));
            document.Add(new Paragraph($"{_localizer["CustomerLabel"]}: John Doe"));
            // 添加更多PDF内容(表格、图片等)...

            document.Close();
            return ms.ToArray();
        }
        finally
        {
            // 必须恢复原文化,防止污染后续请求
            Thread.CurrentThread.CurrentCulture = originalCulture;
            Thread.CurrentThread.CurrentUICulture = originalUiCulture;
        }
    }

    // 同时生成英语和法语PDF,返回语言→字节数组的字典
    public Dictionary<string, byte[]> GenerateDualLanguagePdfs()
    {
        return new Dictionary<string, byte[]>
        {
            ["en"] = GenerateSingleLanguagePdf("en"),
            ["fr"] = GenerateSingleLanguagePdf("fr")
        };
    }

    // 异步版本(推荐,提升性能)
    public async Task<Dictionary<string, byte[]>> GenerateDualLanguagePdfsAsync()
    {
        // 并行生成两个PDF,减少等待时间
        var enTask = Task.Run(() => GenerateSingleLanguagePdf("en"));
        var frTask = Task.Run(() => GenerateSingleLanguagePdf("fr"));
        
        await Task.WhenAll(enTask, frTask);
        
        return new Dictionary<string, byte[]>
        {
            ["en"] = await enTask,
            ["fr"] = await frTask
        };
    }
}

别忘了在Program.cs中注册这个服务:

builder.Services.AddScoped<PdfService>();

3. 在Controller中处理请求并返回结果

你的Controller需要接收Web应用的请求,调用PdfService生成双语PDF,然后把结果打包成ZIP返回(方便客户端一次性下载两个文件):

using System.IO.Compression;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/pdf")]
public class PdfController : ControllerBase
{
    private readonly PdfService _pdfService;

    public PdfController(PdfService pdfService)
    {
        _pdfService = pdfService;
    }

    [HttpGet("dual-language")]
    public async Task<IActionResult> GetDualLanguagePdfs()
    {
        // 生成双语PDF
        var pdfFiles = await _pdfService.GenerateDualLanguagePdfsAsync();

        // 打包成ZIP文件
        using var zipStream = new MemoryStream();
        using (var archive = new ZipArchive(zipStream, ZipArchiveMode.Create, true))
        {
            foreach (var (culture, pdfBytes) in pdfFiles)
            {
                var zipEntry = archive.CreateEntry($"invoice_{culture}.pdf");
                using var entryStream = zipEntry.Open();
                await entryStream.WriteAsync(pdfBytes, 0, pdfBytes.Length);
            }
        }

        zipStream.Position = 0;
        // 返回ZIP文件给客户端
        return File(zipStream, "application/zip", "dual-language-invoices.zip");
    }
}

关键注意事项

  • 线程安全:一定要在finally块中恢复原文化,否则会影响后续请求的本地化处理
  • PDF库选择:如果追求更简洁的API,推荐试试QuestPDF(原生支持.NET,语法更直观)
  • 性能优化:用异步并行生成两个PDF,比串行生成节省近一半时间
  • 资源命名空间:确保Resources文件的命名空间和项目匹配,否则IStringLocalizer无法正确加载资源

内容的提问来源于stack exchange,提问作者Dalmings

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 10:22:35