I'm creating a PDF file using the PdfStamper in iTextSharp and return the PDF as a memorystream object to the calling function, that is then used to display the PDF in Teleriks PDF Viewer Component for WinForms. That's the objective.Right now, creating the PDF works as it should, and it returns the data to the Calling function, and in the Calling function, should I write the memorystream contents to a file stream and then open it in Adobe Reader Everything looks just fine.However, if I choose to display the PDF in the PDF Viewer Control I just get an "Unsupported Stream type" error.Now, I figured something was wrong in the PDF data so I decided to create the PDF file, save it to disk, then read it to a memorystream in the Calling function and display that memorystream in the PDF Viewer and that, for some to me unknown reason, works.... I really can't get my head around this and need some help.
So, this won't work:
But this WILL work:
But why? I'd rather keep it all in memory and let the user save the resulting PDF if he/she so wishes than having to write it to disk and then displaying it.
Am I missing some crucial step here?
So, this won't work:
//The Calling function
private
void
dlgViewPDF_Load(
object
sender, EventArgs e)
{
MemoryStream ms = PDFcreator.GeneratePDFdata(id);
rPdfView.LoadDocument(ms);
}
//The PDF generator
public
static
MemoryStream GeneratePDFdata(
string
id)
{
MemoryStream ms =
new
MemoryStream();
string
sTemplate =
string
.Concat(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
"\\template.pdf"
);
PdfReader pdfReader =
new
PdfReader(sTemplate);
PdfStamper pdfStamper =
new
PdfStamper(pdfReader, ms);
PdfContentByte cb = pdfStamper.GetOverContent(1);
BaseFont baseFont = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1250, BaseFont.EMBEDDED);
BaseFont baseFontBold = BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, BaseFont.CP1250, BaseFont.EMBEDDED);
cb.SetColorFill(iTextSharp.text.Color.BLACK);
cb.SetFontAndSize(baseFontBold, 14);
cb.BeginText();
cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT,
"TEST!!"
, 385, 750, 0);
cb.EndText();
cb.SetColorStroke(
new
CMYKColor(0f, 0f, 0f, 1f));
cb.SetColorFill(
new
CMYKColor(0f, 0f, 0f, 1f));
cb.MoveTo(139, 398);
cb.LineTo(146, 398);
cb.LineTo(146, 391);
cb.LineTo(139, 391);
cb.ClosePathEoFillStroke();
pdfStamper.Close();
pdfReader.Close();
return
ms;
}
But this WILL work:
//The Calling function
private
void
dlgViewPDF_Load(
object
sender, EventArgs e)
{
MemoryStream ms =
new
MemoryStream();
FileStream file =
new
FileStream(@
"c:\temp\testfile.pdf"
, FileMode.Open, FileAccess.Read);
byte
[] bytes =
new
byte
[file.Length];
file.Read(bytes, 0, (
int
)file.Length);
ms.Write(bytes, 0, (
int
)file.Length);
rPdfView.LoadDocument(ms);
}
//The PDF generator
public
static
void
GeneratePDFdata(
string
id)
{
MemoryStream ms =
new
MemoryStream();
string
sTemplate =
string
.Concat(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
"\\template.pdf"
);
PdfReader pdfReader =
new
PdfReader(sTemplate);
FileStream fs =
new
FileStream(@
"c:\temp\testfile.pdf"
, FileMode.Create, FileAccess.Write, FileShare.None);
PdfStamper pdfStamper =
new
PdfStamper(pdfReader, fs);
PdfContentByte cb = pdfStamper.GetOverContent(1);
BaseFont baseFont = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1250, BaseFont.EMBEDDED);
BaseFont baseFontBold = BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, BaseFont.CP1250, BaseFont.EMBEDDED);
cb.SetColorFill(iTextSharp.text.Color.BLACK);
cb.SetFontAndSize(baseFontBold, 14);
cb.BeginText();
cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT,
"TEST!!"
, 385, 750, 0);
cb.EndText();
cb.SetColorStroke(
new
CMYKColor(0f, 0f, 0f, 1f));
cb.SetColorFill(
new
CMYKColor(0f, 0f, 0f, 1f));
cb.MoveTo(139, 398);
cb.LineTo(146, 398);
cb.LineTo(146, 391);
cb.LineTo(139, 391);
cb.ClosePathEoFillStroke();
pdfStamper.Close();
pdfReader.Close();
}
But why? I'd rather keep it all in memory and let the user save the resulting PDF if he/she so wishes than having to write it to disk and then displaying it.
Am I missing some crucial step here?