在 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
方法上传该文件.
我正在尝试在 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
方法上传该文件.