我有一个方法,它接受以下内容:
- 字节数组,这是一个PDF文件
的想法是它转换一个PDF文件与一个特定的大小,到另一个大小。我想返回一个字节数组,并且想把所有的东西都保存在内存中。
我在构造函数(outPDF
)中使用内存流创建PdfWriter,然后进行转换。之后,我想说outBytes = outPDF.ToArray();
。
我试着把这段代码放在三个地方,看看代码中的地方A, B和C。在位置A,内存流的长度只有255,这不起作用。我猜doc.Close()
必须先运行。在位置B和C,流已关闭,无法访问。
我的代码:
public static byte[] ConvertPdfSize(byte[] inPDF, LetterSize fromSize, LetterSize toSize)
{
if (fromSize != LetterSize.A4 || toSize != LetterSize.Letter)
{
throw new ArgumentException("Function only supports from size A4 to size letter");
}
MemoryStream outPDF = new MemoryStream();
byte[] outBytes;
using (PdfReader pdfr = new PdfReader(inPDF))
{
using (Document doc = new Document(PageSize.LETTER))
{
Document.Compress = true;
PdfWriter writer = PdfWriter.GetInstance(doc, outPDF);
doc.Open();
PdfContentByte cb = writer.DirectContent;
PdfImportedPage page;
for (int i = 1; i < pdfr.NumberOfPages + 1; i++)
{
page = writer.GetImportedPage(pdfr, i);
cb.AddTemplate(page, PageSize.LETTER.Width / pdfr.GetPageSize(i).Width, 0, 0, PageSize.LETTER.Height / pdfr.GetPageSize(i).Height, 0, 0);
doc.NewPage();
}
// place A
doc.Close();
// place B
}
pdfr.Close();
// place C
}
return new byte[0];
}
在所有iTextSharp内容完成后返回您的字节,但在丢弃MemoryStream
之前
using(MemoryStream outPDF = new MemoryStream())
{
using (PdfReader pdfr = new PdfReader(inPDF))
{
using (Document doc = new Document(PageSize.LETTER))
{
//...
}
}
return outPDF.ToArray();
}