在 Azure blob 上创建 PDF

Create PDF on Azure blob

我正在尝试在 Azure blob 上创建 PDF。我的代码如下。我在 blob 上创建 PDF 时遇到问题。我无法创建不支持文件流的 PDF。

FileStream fs = new FileStream("Chapter1_Example1.pdf", FileMode.Create, FileAccess.Write, FileShare.None);
            iTextSharp.text.Document doc = new iTextSharp.text.Document();

            PdfWriter writer = PdfWriter.GetInstance(doc, fs);
            doc.Open();
            doc.Add(new Paragraph("Hello World"));


            var permissions = container.GetPermissions();
            permissions.PublicAccess = BlobContainerPublicAccessType.Blob;
            container.SetPermissions(permissions);
            string uniqueBlobName = string.Format("rewhizzdocuments/{0}", "helloworld.pdf");
            CloudBlockBlob blob = container.GetBlockBlobReference(uniqueBlobName);
            blob.Properties.ContentType = "application/pdf";
            blob.UploadFromStream(fs);


            doc.Close();

请先调用doc.Close(),再调用blob.UploadFromFile("Chapter1_Example1.pdf").

另一种可能的解决方案是:先调用doc.Close(),然后设置fs.Position = 0L,最后调用blob.UploadFromStream(fs)。 (如果 doc.Close() 会自动触发 FileStream 的处理,这可能不是一个有效的解决方案,我不能确定,因为我不熟悉 iText。

FileStream 主要用于操作文件,由于您对即时创建 PDF 文档感兴趣,我建议您改用 MemoryStream

看看下面的示例代码,它使用了 MemoryStream:

    private static void CreatePdf()
    {
        var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
        var blobClient = account.CreateCloudBlobClient();
        var container = blobClient.GetContainerReference("pdftest");
        using (MemoryStream ms = new MemoryStream())
        {
            using (var doc = new iTextSharp.text.Document())
            {
                PdfWriter writer = PdfWriter.GetInstance(doc, ms);
                doc.Open();
                doc.Add(new Paragraph("Hello World"));
            }
            var byteArray = ms.ToArray();
            var blobName = "hello-world.pdf";
            var blob = container.GetBlockBlobReference(blobName);
            blob.Properties.ContentType = "application/pdf";
            blob.UploadFromByteArray(byteArray, 0, byteArray.Length);
        }
    }

如果您仍想使用 FileStream,您可以做的另一件事是将文件保存在磁盘上,然后使用 CloudBlockBlob 上的 UploadFromFile 方法上传该文件.