PDFsharp - How to create a 2nd page
c#, pdfsharp
Solution
You create a new page with
document.AddPage();
and then call
XGraphics.FromPdfPage(page);
to get a gfx object for the second page (probably this is the missing step).
So repeat those steps from your code sample for every new page:
// Create an empty page
PdfPage page = document.AddPage();
// Get an XGraphics object for drawing
XGraphics gfx = XGraphics.FromPdfPage(page);
Update: In your loop you do the following:
document.AddPage();
XGraphics.FromPdfPage(page);
AddPage() returns a "handle" to the newly created page - which you throw in the bin. Then you call "XGraphics.FromPdfPage()" to create yet another gfx for the first page - which you also would throw in the bin, but you get an exception since there already is a gfx for the first page.
A small change should do the trick:
page = document.AddPage();
gfx = XGraphics.FromPdfPage(page);
See also: http://www.pdfsharp.net/wiki/PageSizes-sample.ashx
"I never dreamed adding a second page could be so difficult! No luck with the suggested code." PDFsharp includes quite a few working samples to get people going. No luck with the suggested code since you ignored the important part - the values returned by the methods.
Problem
I can't find documentation in PDFsharp to show how to add a 2nd page using C#! As an example, over in VB6 I use a PDF creation method called mjwPDF. To indicate that the page is finished ``` objPDF.PDFEndPage ``` And to start a new page: ``` objPDF.PDFNewPage ``` My PDFsharp initial settings: ``` // Create a new PDF document PdfDocument document = new PdfDocument(); // Create an empty page PdfPage page = document.AddPage(); //page.Contents.CreateSingleContent().Stream.UnfilteredValue; // Get an XGraphics object for drawing XGraphics gfx = XGraphics.FromPdfPage(page); ``` Unfortunately in PDFsharp I can't find out how to start/write on a new page. I see these commands but can't get a second page started. ``` document.AddPage(); document.InsertPage(); ``` I've tried both of these but my output continues to write on page 1, not page 2. Any ideas would be greatly appreciated. Here's the actual code: ``` private void buttonPrint_Click(object sender, EventArgs e) { // Create a new PDF document PdfDocument document = new PdfDocument(); // Create an empty page PdfPage page = document.AddPage(); //page.Contents.CreateSingleContent().Stream.UnfilteredValue; // Get an XGraphics object for drawing XGraphics gfx = XGraphics.FromPdfPage(page); XPdfFontOptions options = new XPdfFontOptions(PdfFontEncoding.Unicode, PdfFontEmbedding.Always); // Create a font XFont fontArial20 = new XFont("Arial", 20, XFontStyle.Bold, options); XFont fontArial14 = new XFont("Arial", 14, XFontStyle.Regular, options); XFont fontArial14Bold = new XFont("Arial", 14, XFontStyle.Bold, options); XFont fontArial10 = new XFont("Arial", 10, XFontStyle.Regular, options); XFont fontArial10Bold = new XFont("Arial", 10, XFontStyle.Bold, options); XFont fontArial9 = new XFont("Arial", 9, XFontStyle.Regular, options); XFont fontArial9Bold = new XFont("Arial", 9, XFontStyle.Bold, options); XFont fontArial8 = new XFont("Arial", 8, XFontStyle.Regular, options); XFont fontArial8Bold = new XFont("Arial", 8, XFontStyle.Bold, options); XFont fontCour10 = new XFont("Courier New", 10, XFontStyle.Regular, options); XFont fontCour10Bold = new XFont("Courier New", 10, XFontStyle.Bold, options); XFont printFontCour8 = new XFont("Courier New", 8, XFontStyle.Regular); XFont printFontCour8Bold = new XFont("Courier New", 8, XFontStyle.Bold); XFont printFontCour8Italic = new XFont("Courier New", 8, XFontStyle.Italic); XFont printFontCour10 = new XFont("Courier New", 10, XFontStyle.Regular); XFont printFontCour10Bold = new XFont("Courier New", 10, XFontStyle.Bold); XFont printFontCour14 = new XFont("Courier New", 14, XFontStyle.Bold); XFont printFontCour10BoldItalic = new XFont("Courier New", 10, XFontStyle.Bold | XFontStyle.Italic); XFont printFontArial8 = new XFont("Arial", 8, XFontStyle.Regular); XFont printFontArial10 = new XFont("Arial", 10, XFontStyle.Regular); XFont printFontArial10Bold = new XFont("Arial", 10, XFontStyle.Bold); XFont printFontArial14 = new XFont("Arial", 14, XFontStyle.Bold); // Create pen. Pen blackPen = new Pen(Color.Black, 3); Pen blackPen3 = new Pen(Color.Black, 3); Pen blackPen1 = new Pen(Color.Black, 1); Pen greyPen1 = new Pen(Color.Gray, 1); Pen greyPen3 = new Pen(Color.Gray, 3); Pen lightgreyPen1 = new Pen(Color.LightGray, 1); //define margins double leftMargin = 40.0; double rightMargin = 570.0; double topMargin = 20.0; double lineTop = 0d; double lineFooter = 780d; double rowStep = 12d; //double rowStep = 15d; double newRow = topMargin + rowStep; double beginRow = newRow; double currentRow = beginRow; double currentRowCol2 = 0; double firstCustomerRow = 100d; //double firstCustomerRow = 110d; //float firstCustomerRow = 120; double txtShift = 8d; string hcString = string.Empty; //---added 6-26-13 //---top section-------------------------------------------------------- // draw the TIW Logo Image Logo = Image.FromFile(Settings.Default.LogoPath); gfx.DrawImage(Logo, leftMargin, topMargin); // title & version string textToPrint = "TIW Purchasing - Master Buy List"; gfx.DrawString(textToPrint, fontArial14Bold, Brushes.Black, leftMargin + 160, topMargin + 30); string eiNum = listView1.Items[0].Text; string eiDesc = listView1.Items[0].SubItems[1].Text; string partNum = listView1.Items[0].SubItems[2].Text; string partDesc = listView1.Items[0].SubItems[3].Text; string price = listView1.Items[0].SubItems[4].Text; string partType = listView1.Items[0].SubItems[5].Text; string partQty = listView1.Items[0].SubItems[6].Text; if (eiDesc.Length > 80) eiDesc = eiDesc.Substring(0, 80) + "..."; textToPrint = eiNum + " - " + eiDesc; gfx.DrawString(textToPrint, fontArial10Bold, Brushes.Black, leftMargin, topMargin + 70); int lineInc = 70; for (int i = 0; i < listView1.Items.Count; i++) { if (listView1.Items[i].Text == eiNum) { lineInc = lineInc + 12; if (lineInc >= 480) { //PdfPage page2 = document.AddPage(); document.AddPage(); XGraphics.FromPdfPage(page); // title & version textToPrint = "TIW Purchasing - Master Buy List - (continued)"; gfx.DrawString(textToPrint, fontArial14Bold, Brushes.Black, leftMargin + 160, topMargin + 30); lineInc = 70; } partNum = listView1.Items[i].SubItems[2].Text; partDesc = listView1.Items[i].SubItems[3].Text; price = listView1.Items[i].SubItems[4].Text; partType = listView1.Items[i].SubItems[5].Text; partQty = listView1.Items[i].SubItems[6].Text; textToPrint = partNum; gfx.DrawString(textToPrint, fontArial10, Brushes.Black, leftMargin + 10, topMargin + lineInc); //textToPrint = partDesc.Substring(0, 50); textToPrint = partDesc; gfx.DrawString(textToPrint, fontArial10, Brushes.Black, leftMargin + 70, topMargin + lineInc); textToPrint = price; gfx.DrawString(textToPrint, fontArial10, Brushes.Black, leftMargin + 450, topMargin + lineInc); textToPrint = partType; gfx.DrawString(textToPrint, fontArial10, Brushes.Black, leftMargin + 470, topMargin + lineInc); textToPrint = partQty; gfx.DrawString(textToPrint, fontArial10, Brushes.Black, leftMargin + 490, topMargin + lineInc); } else { lineInc = lineInc + 16; eiNum = listView1.Items[i].Text; eiDesc = listView1.Items[i].SubItems[1].Text; if (eiDesc.Length > 80) eiDesc = eiDesc.Substring(0, 80) + "..."; textToPrint = eiNum + " - " + eiDesc; gfx.DrawString(textToPrint, fontArial10Bold, Brushes.Black, leftMargin, topMargin + lineInc); lineInc = lineInc + 12; partNum = listView1.Items[i].SubItems[2].Text; partDesc = listView1.Items[i].SubItems[3].Text; price = listView1.Items[i].SubItems[4].Text; partType = listView1.Items[i].SubItems[5].Text; partQty = listView1.Items[i].SubItems[6].Text; textToPrint = partNum; gfx.DrawString(textToPrint, fontArial10, Brushes.Black, leftMargin + 10, topMargin + lineInc); //textToPrint = partDesc.Substring(0, 20); textToPrint = partDesc; gfx.DrawString(textToPrint, fontArial10, Brushes.Black, leftMargin + 70, topMargin + lineInc); textToPrint = price; gfx.DrawString(textToPrint, fontArial10, Brushes.Black, leftMargin + 450, topMargin + lineInc); textToPrint = partType; gfx.DrawString(textToPrint, fontArial10, Brushes.Black, leftMargin + 470, topMargin + lineInc); textToPrint = partQty; gfx.DrawString(textToPrint, fontArial10, Brushes.Black, leftMargin + 490, topMargin + lineInc); } } //------ footer DateTime dateTime = DateTime.Now; String.Format("{0:F}", dateTime); textToPrint = "eView " + EViewMethods.eviewVersion + " " + Environment.UserName + " " + String.Format("{0:F}", dateTime); gfx.DrawString(textToPrint, printFontCour8Italic, Brushes.Black, leftMargin, lineFooter); SaveFileDialog saveFileDialog1 = new SaveFileDialog(); saveFileDialog1.Filter = "pdf files (*.pdf)|*.pdf|All files (*.*)|*.*"; saveFileDialog1.FilterIndex = 1; saveFileDialog1.RestoreDirectory = true; if (saveFileDialog1.ShowDialog() == DialogResult.OK) { document.Save(saveFileDialog1.FileName); Process.Start(saveFileDialog1.FileName); } } ``` Here's my corrected code: ``` private void createPDF() { // Create a new PDF document PdfDocument document = new PdfDocument(); // Create an empty page PdfPage page = document.AddPage(); // Get an XGraphics object for drawing XGraphics gfx = XGraphics.FromPdfPage(page); XPdfFontOptions options = new XPdfFontOptions(PdfFontEncoding.Unicode, PdfFontEmbedding.Always); // Create fonts XFont printFontArial8 = new XFont("Arial", 8, XFontStyle.Regular); XFont printFontArial10 = new XFont("Arial", 10, XFontStyle.Regular); XFont printFontArial10Bold = new XFont("Arial", 10, XFontStyle.Bold); XFont printFontCour10BoldItalic = new XFont("Courier New", 10, XFontStyle.Bold | XFontStyle.Italic); XFont printFontArial14 = new XFont("Arial", 14, XFontStyle.Bold); XFont printFontCour8 = new XFont("Courier New", 8, XFontStyle.Regular); // Create pen. Pen blackPen = new Pen(Color.Black, 3); float lineInc = 20.0f; //-------------------------------------------- //define margins double leftMargin = 40.0; //double rightMargin = 570.0; double topMargin = 20.0; //double lineTop = 0d; //double lineFooter = 780d; string eiNum = string.Empty; string eiDesc = string.Empty; string partNum = string.Empty; string partDesc = string.Empty; string price = string.Empty; string partType = string.Empty; string partQty = string.Empty; string thisEndItem = string.Empty; string textToPrint = string.Empty; int pageCounter = 0; string filename = string.Empty; bool morePages = true; while (morePages) { if (pageCounter == 0 && counter == 0) { // draw image/logo Image Logo = Image.FromFile(Settings.Default.LogoPath); gfx.DrawImage(Logo, leftMargin, 35f); // draw title textToPrint = "TIW Purchasing - Master Buy List"; gfx.DrawString(textToPrint, printFontArial14, Brushes.Black, leftMargin + 160f, 54f); // date DateTime thisDay = DateTime.Today; textToPrint = thisDay.ToString("d"); gfx.DrawString(textToPrint, printFontArial10, Brushes.Black, leftMargin + 280f, 76f); eiNum = listView1.Items[0].Text; eiDesc = listView1.Items[0].SubItems[1].Text; if (eiDesc.Length > 80) eiDesc = eiDesc.Substring(0, 80) + "..."; textToPrint = eiNum + " - " + eiDesc; gfx.DrawString(textToPrint, printFontArial10Bold, Brushes.Black, leftMargin, topMargin + 90); } else if (pageCounter > 0) { double remainder = counter % amtperpage; if (remainder == 0) //---means we're at the top of the page { //title & version textToPrint = "TIW Purchasing - Master Buy List"; gfx.DrawString(textToPrint, printFontArial10Bold, Brushes.Black, leftMargin + 120, 54f); textToPrint = "(continued from page " + page + ")"; gfx.DrawString(textToPrint, printFontArial10, Brushes.Black, leftMargin + 400, 54f); } } if (pageCounter == 0) lineInc = 90; else lineInc = 78; int stop = counter + amtperpage; if (stop > listView1.Items.Count) stop = listView1.Items.Count; while (counter < stop) { thisEndItem = listView1.Items[counter].SubItems[0].Text; partNum = listView1.Items[counter].SubItems[2].Text; partDesc = listView1.Items[counter].SubItems[3].Text; price = listView1.Items[counter].SubItems[4].Text; partType = listView1.Items[counter].SubItems[5].Text; partQty = listView1.Items[counter].SubItems[6].Text; if (thisEndItem == eiNum) //---still working on the same end item { lineInc += 12; textToPrint = partNum; gfx.DrawString(textToPrint, printFontArial10, Brushes.Black, leftMargin + 10, topMargin + lineInc); if (partDesc.Length > 70) partDesc = partDesc.Substring(0, 70) + "..."; textToPrint = partDesc; gfx.DrawString(textToPrint, printFontArial10, Brushes.Black, leftMargin + 70, topMargin + lineInc); textToPrint = price; gfx.DrawString(textToPrint, printFontArial10, Brushes.Black, leftMargin + 600, topMargin + lineInc); textToPrint = partType; gfx.DrawString(textToPrint, printFontArial10, Brushes.Black, leftMargin + 630, topMargin + lineInc); textToPrint = partQty; gfx.DrawString(textToPrint, printFontArial10, Brushes.Black, leftMargin + 670, topMargin + lineInc); } else //---starting a new end item { lineInc += 16; eiNum = listView1.Items[counter].Text; eiDesc = listView1.Items[counter].SubItems[1].Text; if (eiDesc.Length > 80) eiDesc = eiDesc.Substring(0, 80) + "..."; textToPrint = eiNum + " - " + eiDesc; gfx.DrawString(textToPrint, printFontArial10Bold, Brushes.Black, leftMargin, topMargin + lineInc); } counter++; } //---footer------------------------------- DateTime dateTime = DateTime.Now; textToPrint = "eView " + EViewMethods.eviewVersion + " " + Environment.UserName + " " + String.Format("{0:F}", dateTime); gfx.DrawString(textToPrint, printFontCour8, Brushes.Black, leftMargin, 1060f); printpagenum = pageCounter + 1; textToPrint = printpagenum.ToString(); gfx.DrawString(textToPrint, printFontArial10Bold, Brushes.Black, leftMargin + 740, 1060f); //---------------------------------------- if (counter == listView1.Items.Count) { morePages = false; } else { pageCounter++; page = document.AddPage(); gfx = XGraphics.FromPdfPage(page); } } SaveFileDialog saveFileDialog1 = new SaveFileDialog(); saveFileDialog1.Filter = "pdf files (*.pdf)|*.pdf|All files (*.*)|*.*"; saveFileDialog1.FilterIndex = 1; saveFileDialog1.RestoreDirectory = true; if (saveFileDialog1.ShowDialog() == DialogResult.OK) { document.Save(saveFileDialog1.FileName); Process.Start(saveFileDialog1.FileName); } } ```