2014-01-15 35 views
3

我无法在PDFsharp中找到文档以显示如何使用C#添加第2页!PDFsharp - 如何创建第二页

作为一个例子,在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 < 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); 
    } 
} 

这里是我纠正代码:

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

下面的代码有问题: –

回答

12

您与

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()返回一个“句柄”新创建的页面 - 你扔进垃圾箱。 然后你调用“XGraphics.FromPdfPage()”为第一个页面创建另一个gfx--你也会把它扔进bin,但是你会得到一个异常,因为第一页已经有了一个gfx。

的小变化应该做的伎俩:

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

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

“!我做梦也没想到添加第二个页面会如此困难没有运气的推荐代码”
PDFsharp包含了很多有用的样本。由于您忽略了重要部分 - 方法返回的值,所以不要使用建议的代码。

+0

谢谢你的技术!看来,“XGraphics gfx = Xgraphics.FromPdfPage(page);”产生这个错误:一个XGraphics对象已经存在这个页面,并且必须在创建一个新的对象之前进行处理。 –

+0

现在我正试图弄清楚如何处置XGraphics。 –

+0

我从来没有梦想添加第二页可能是如此困难!建议的代码没有运气。 –

-2

之前试图创建一个新的XGraphics对象的新的一页,处理旧现有对象:

xgrObject.Dispose(); 
+0

当创建一个新的XGraphics对象时,确保为正确的页面创建它。当您为第一页处理gfx并为相同(第一个)页面创建另一个gfx时,不能在第二页上绘制。一次只能有一个gfx用于任何页面,但您可以创建多个页面,并为每个页面使用一个gfx。在为新页面创建gfx之前,无需完成一页。 –

+0

非常感谢这项技术!看起来,当我创建一个新的gfx时,它必须是一个不同的名称,即gfx,gfx1,gfx2,...等。这个程序可能会遇到一个巨大的列表,需要很多gfx1-gfx100的。由于我不认为你可以声明一个新的“XGraphics gfx = Xgraphics.FromPdfPage(page)”,所以很难以编程方式(sp?)创建新的gfx。我在这里为新的gfx使用了一个变量名称。如果我正确阅读你的评论,你可能会告诉我,xgrObject.Dispose()将允许我在重新使用同一个“gfx”时声明一个新的! –

+0

而不是写“XGraphics gfx = Xgraphics.FromPdfPage(page);”你可以简单的写“gfx = Xgraphics.FromPdfPage(page);”并重新使用你已有的变量。请参阅上面的其他答案:“Dispose()”不是问题,您使用错误的“页面”对象并尝试为第一页创建第二个gfx,您应该在第二页创建第一个gfx。 –

1

不要忘记更新你的“画布”或“绘图”对象变量的新页面:

你可能会做这样的事情:

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

我也犯了那个错误。

-1

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

其给定值是 “yPoint = yPoint + 40”

改变它由8 “yPoint = yPoint + 8” 即增量ypoint在每一个循环迭代,

对于任何怀疑

答复。 参考while循环下面

 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

+0

很明显,较小的字体允许每页更多的行。较大页面(A3,A2,A1,A0,自定义...)也允许每页有更多行。 –