【发布时间】:2019-04-30 06:59:04
【问题描述】:
我有以下问题。
这段代码运行良好
private void ModifyAndSavePDF(Stream sourceFile, string text)
{
using (var pdfWriterStream = new FileStream(@"d:/temp/test.pdf", FileMode.Create))
{
var reader = new PdfReader(sourceFile);
var document = new Document(reader.GetPageSizeWithRotation(1));
var writer = PdfWriter.GetInstance(document, pdfWriterStream);
document.Open();
for (var i = 1; i <= reader.NumberOfPages; i++)
{
document.NewPage();
var importedPage = writer.GetImportedPage(reader, i);
var contentByte = writer.DirectContent;
//some more PDF editing stuff here. Not relevant.
}
document.Close();
writer.Close();
reader.Close();
}
}
这很好用。 sourceFile 流包含大约 200Kb,保存的 pdf 看起来完全符合我的预期。我注意到的一件事是,在document.Close() 之前,pdfWriterStream 流的长度只有 800 字节左右。
我的问题是我不想将其保存到磁盘上的文件中,我希望将输出作为 MemoryStream 代替。但是,我无法按预期工作。我的第一次尝试是这样的:
private Stream ModifyAndSavePDF(Stream sourceFile, string text)
{
using (var pdfWriterStream = new MemoryStream())
{
var reader = new PdfReader(sourceFile);
var document = new Document(reader.GetPageSizeWithRotation(1));
var writer = PdfWriter.GetInstance(document, pdfWriterStream);
document.Open();
for (var i = 1; i <= reader.NumberOfPages; i++)
{
document.NewPage();
var importedPage = writer.GetImportedPage(reader, i);
var contentByte = writer.DirectContent;
//some more PDF editing stuff here. Not relevant.
}
document.Close();
writer.Close();
reader.Close();
}
return pdfWriterStream;
}
这当然行不通,因为当我调用document.Close() 时,pdfWriterStream 也被释放了,我无法读取流的内容。
第二次尝试:
private Stream ModifyAndSavePDF(Stream sourceFile, string text)
{
var result = new MemoryStream();
using (var pdfWriterStream = new MemoryStream())
{
var reader = new PdfReader(sourceFile);
var document = new Document(reader.GetPageSizeWithRotation(1));
var writer = PdfWriter.GetInstance(document, pdfWriterStream);
document.Open();
for (var i = 1; i <= reader.NumberOfPages; i++)
{
document.NewPage();
var importedPage = writer.GetImportedPage(reader, i);
var contentByte = writer.DirectContent;
//some more PDF editing stuff here. Not relevant.
}
pdfWriterStream.Position = 0;
pdfWriterStream.CopyTo(result);
document.Close();
writer.Close();
reader.Close();
}
return result;
}
这让我在列出的第一个代码中遇到了问题。 pdfWriterStream 此时仅包含大约 800 个字节,当复制到 result 时,也仅获取这 800 个字节,而不是整个文件。
所以看起来document.Close() 将文件刷新到缓冲区,然后释放它。所以我想在将pdfWriterStream复制到result之前需要做一些操作,但是我不知道是什么。
【问题讨论】:
标签: .net stream itext filestream memorystream