我正在研究一个将在Intranet Web服务器上呈现PDF文档的类。我遇到的问题是iTextSharp使用PDFWriter渲染条形码图像,我试图在渲染文档之前构建一个IElements集合。有没有办法创建一个包含条形码图像的集合,还是有更好的方法来编写这个类?
希望我的代码可以更好地解释它。感谢。
public class PDFDoc
{
public float Width { get; set; }
public float Height { get; set; }
private List<IElement> Elements { get; set;}
...
private MemoryStream ms = new MemoryStream();
private Document doc = new Document();
private PdfWriter writer;
private void initializeDocument()
{
doc = new Document(new Rectangle(Width, Height), marginLeft, marginRight, marginTop, marginBottom);
writer = PdfWriter.GetInstance(doc, ms);
Elements = new List<IElement>();
}
private FileStreamResult GenerateLabel(IEnumerable<IElement> elements)
{
doc.Open();
foreach (var e in elements)
{
doc.Add(e);
}
//doc.Add(GenerateBarcodeImage("123456")); //GenBC works here but not below
writer.CloseStream = false;
doc.Close();
byte[] byteinfo = ms.ToArray();
ms.Write(byteinfo, 0, byteinfo.Length);
ms.Position = 0;
ms.Seek(0, SeekOrigin.Begin);
return new FileStreamResult(ms, "application/pdf");
}
private Image GenerateBarcodeImage(string code)
{
Barcode128 code128 = new Barcode128();
code128.Code = code;
code128.X = 1f;
return code128.CreateImageWithBarcode(new PdfContentByte(writer), null, null);
}
//Program
public FileStreamResult RenderLabel()
{
Elements.Add(new Paragraph("This is a test"));
Elements.Add(GenerateBarcodeImage("123456")); //This gives a null ref exception.
return GenerateLabel(Elements);
}
答案 0 :(得分:0)
代码段的问题在于您在致电MemoryStream
后尝试访问Document.Close()
。您可以在Close()
下方移动ms.ToArray()
来电,或完全取消MemoryStream
。
当您实例化PdfWriter
时,您可以使用任何可用Stream
,那么为什么不使用Response.OutputStream
:
List<IElement> Elements = new List<IElement>();
using (Document document = new Document()) {
PdfWriter writer = PdfWriter.GetInstance(
document, Response.OutputStream
);
document.Open();
PdfContentByte cb = writer.DirectContent;
for (int i = 0; i < 9; ++i) {
Barcode128 code128 = new Barcode128();
code128.Code = "code " + i.ToString();
Elements.Add(code128.CreateImageWithBarcode(cb, null, null));
}
for (int i = 0; i < Elements.Count; ++i) {
document.Add(new Paragraph("Barcode: " + i.ToString()));
document.Add(Elements[i]);
}
}