PDFsharp – 如何创建第二页

我在PDFsharp中找不到文档来展示如何使用C#添加第二页!

例如,在VB6中我使用名为mjwPDF的PDF创建方法。 表示页面已完成

objPDF.PDFEndPage 

并开始一个新的页面:

 objPDF.PDFNewPage 

我的PDFsharp初始设置:

 // 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); 

不幸的是,在PDFsharp中,我无法找到如何在新页面上启动/写入。 我看到这些命令,但无法启动第二页。

 document.AddPage(); document.InsertPage(); 

我已经尝试了这两个,但我的输出继续写在第1页,而不是第2页。

任何想法将不胜感激。

这是实际的代码:

 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 = 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); } } 

这是我更正后的代码:

  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  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); } } 

您创建一个新页面

 document.AddPage(); 

然后打电话

 XGraphics.FromPdfPage(page); 

获取第二页的gfx对象(可能这是缺少的步骤)。

因此,对于每个新页面,请从代码示例中重复这些步骤:

 // Create an empty page PdfPage page = document.AddPage(); // Get an XGraphics object for drawing XGraphics gfx = XGraphics.FromPdfPage(page); 

更新:在循环中执行以下操作:

 document.AddPage(); XGraphics.FromPdfPage(page); 

AddPage()为新创建的页面返回一个“句柄” – 您将其放入bin中。 然后你调用“XGraphics.FromPdfPage()”来为第一页创建另一个gfx – 你也会把它放在bin中,但是你会得到一个例外,因为第一页已经有了一个gfx。

一个小的改变应该做的伎俩:

 page = document.AddPage(); gfx = XGraphics.FromPdfPage(page); 

另见: http : //www.pdfsharp.net/wiki/PageSizes-sample.ashx

“我从来没有想过添加第二页可能会非常困难!建议的代码没有运气。”
PDFsharp包含了不少工作样本以吸引人们前进。 由于您忽略了重要部分 – 方法返回的值,因此建议的代码没有运气。

不要忘记将“canvas”或“graphics”对象变量更新到新页面:

你可能会这样做:

 // First time: this.page = document.AddPage(); this.gfx = XGraphics.FromPdfPage(page); ... // next time (forgot to update graphics or canvas variable): this.page = document.AddPage(); 

而且,它应该是这样的:

 // First time: this.page = document.AddPage(); this.gfx = XGraphics.FromPdfPage(page); ... // next time: this.page = document.AddPage(); // update graphics object, also this.gfx = XGraphics.FromPdfPage(page); 

我也犯了这个错误。

您可以通过减小“Ypoint”的大小来打印多页,如下所示。

它的给定值是“yPoint = yPoint + 40”

将其更改为“yPoint = yPoint + 8”,即在每次循环迭代中将ypoint增加+8,

回答任何疑问。 请参阅下面的循环

  While dr.Read username = dr.Item(0) Action_Performed = dr.Item(1) datetim = dr.Item(2) graph.DrawString(username, font, XBrushes.Black, _ New XRect(40, yPoint, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats.TopLeft) graph.DrawString(Action_Performed, font, XBrushes.Black, _ New XRect(280, yPoint, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats.TopLeft) graph.DrawString(datetim, font, XBrushes.Black, _ New XRect(420, yPoint, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats.TopLeft) yPoint = yPoint + 10 counter += 1 If counter = 30 Then pdfPage = pdf.AddPage() graph.Dispose() graph = XGraphics.FromPdfPage(pdfPage) font = New XFont("Verdana", 7, XFontStyle.Regular) yPoint = 0 yPoint = yPoint + 100 counter = 0 End If End While Dim pdfFilename As String = "dbtopdf.pdf" pdf.Save(pdfFilename) Process.Start(pdfFilename) 

问候,Shivanand

在尝试为新页面创建新的XGraphics对象之前,请处置旧的现有对象:

 xgrObject.Dispose();