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

.NET 8 Firebase Storage上传iText7生成PDF无法识别类型求助

解决iText7生成PDF上传Firebase Storage无法识别为PDF的问题

问题核心原因

Firebase Storage识别文件类型主要依赖两个关键依据:

  • 文件名的后缀标识(如.pdf)
  • 文件上传时指定的Content-Type元数据

你的代码存在两处关键疏漏:

  1. 上传的文件名未添加.pdf后缀
  2. 上传过程未显式指定Content-Type为application/pdf,导致Firebase自动检测时可能误判文件类型

具体修复方案

1. 修改上传方法:添加文件名后缀并指定Content-Type

public async Task<string> UploadQRCode(Stream QRCode, string fileName) {
    try 
    {
        // 给文件名添加.pdf后缀
        String nameNew = $"{fileName}.pdf";

        var task = new FirebaseStorage(_configuration["Firebase:ProjectId"], new FirebaseStorageOptions {
            ThrowOnCancel = true
        }).Child("QR Codes").Child(nameNew)
          // 显式设置文件的Content-Type为PDF类型
          .PutAsync(QRCode, cancellationToken: default, new FirebaseStorageMetadata {
              ContentType = "application/pdf"
          });
    
        var downloadURL = await task;
    
        return downloadURL;
    } 
    catch (Exception e) 
    {
        Console.WriteLine("Error uploading file: " + e.Message);
        throw;
    }
}

2. 优化PDF生成的流处理(可选,避免潜在问题)

虽然当前生成逻辑基本正常,但可以添加流位置重置的操作,确保返回的字节数组完整:

public byte[] GenerateSurgicalInventoryQRCode(string categoryId, string itemId) 
{
    var url = $"{_configuration["BaseURL:Frontend"]}/mlt/inventorysurgical/{categoryId}/{itemId}";
    
    QRCodeGenerator qrGenerator = new QRCodeGenerator();
    QRCodeData qrCodeData = qrGenerator.CreateQrCode(url, QRCodeGenerator.ECCLevel.H);

    BitmapByteQRCode bitMap = new BitmapByteQRCode(qrCodeData);
    var QRCodeBytes = bitMap.GetGraphic(5);
    
    using var memoryStream = new MemoryStream();
    
    var image = Image.FromStream(new MemoryStream(QRCodeBytes));
    
    var width = image.Width;
    var height = image.Height;
    
    var pageSize = new PageSize(width, height);
    
    var pdfWriter = new PdfWriter(memoryStream);
    var pdfDocument = new PdfDocument(pdfWriter);
    var document = new Document(pdfDocument, pageSize);
    
    var imageData = new iText.Layout.Element.Image(iText.IO.Image.ImageDataFactory.Create(QRCodeBytes));
    
    document.Add(imageData);
    
    document.Close();
    // 重置流位置到起始点,确保ToArray()读取完整内容
    memoryStream.Position = 0;
    
    return memoryStream.ToArray();
}

3. 控制器调用逻辑保持不变

控制器中的代码无需修改,因为后缀处理已经在上传方法中完成:

var surgicalInventoryId = _idGenerator.GenerateSurgicalInventoryId();
byte[] QRCode = _qrGenerator.GenerateSurgicalInventoryQRCode(newSurgicalItem.SurgicalCategoryID, surgicalInventoryId);

var QRurl = await _storageService.UploadQRCode(new MemoryStream(QRCode), surgicalInventoryId);

验证方式

上传完成后,进入Firebase Storage控制台查看文件元数据:

  • 确认文件名带有.pdf后缀
  • 确认Content-Type字段显示为application/pdf

完成以上修改后,前端嵌入PDF时,浏览器就能正确识别文件类型并正常渲染。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 01:52:10