1

オファーをPDFファイルに保存するプログラムを作成しようとしています。問題なく動作していますが、フッターに問題があります。私はこれらの指示に従いました。

残念ながら、フッターは最後のページにしか表示されていません。どうすればこれを解決できますか? 私は C# の冒険を始めたばかりなので、最も簡単な解決策を探しています。

これが私のコードです:

public override void OnStartPage(PdfWriter writer, Document document)
  {
    base.OnStartPage(writer, document);

    PdfPTable tab = new PdfPTable(1);
    PdfPCell cell = new PdfPCell(new Phrase("Testing..."));
    cell.Border = 0;
    tab.TotalWidth = 300F;
    tab.AddCell(cell);
    tab.WriteSelectedRows(0, -1, 300, 30, writer.DirectContent);
  }
}

private void button1_Click(object sender, EventArgs e) // drukowanie oferty w PDF
{
  if (dataGridView1.Rows.Count > 0)
  {
    Document oferta = new Document(iTextSharp.text.PageSize.A4, 20, 20, 20, 20);
    SaveFileDialog saveFile = new SaveFileDialog();

      saveFile.FileName = textBox7.Text.Trim()+".pdf";
      saveFile.Title = "Zapisz ofertę (PDF)";
      saveFile.Filter = "Adobe Reader|*.pdf|Wszystkie pliki|*.*";

      if (saveFile.ShowDialog() != DialogResult.Cancel)
      {
        try
        {
          PdfWriter wri = PdfWriter.GetInstance(oferta, new FileStream(saveFile.FileName, FileMode.Create));

          oferta.AddAuthor(label1.Text);
          oferta.AddCreator("Creator");
          oferta.AddTitle(sNrOferty);

          oferta.Open();

          PdfContentByte cb = wri.DirectContent;

          iTextSharp.text.Font czcionkaTytul = new iTextSharp.text.Font(iTextSharp.text.FontFactory.GetFont("C:\\Windows\\Fonts\\Verdana.ttf", BaseFont.CP1257, 11.0F, iTextSharp.text.Font.BOLD, BaseColor.BLACK));
          iTextSharp.text.Font czcionkaTabela = new iTextSharp.text.Font(iTextSharp.text.FontFactory.GetFont("C:\\Windows\\Fonts\\Verdana.ttf", BaseFont.CP1257, 11.0F, iTextSharp.text.Font.NORMAL, BaseColor.BLACK));
          iTextSharp.text.Font czcionkaNaglowek = new iTextSharp.text.Font(iTextSharp.text.FontFactory.GetFont("C:\\Windows\\Fonts\\Verdana.ttf", BaseFont.CP1257, 11.0F, iTextSharp.text.Font.BOLD, BaseColor.BLACK));
          iTextSharp.text.Font czcionkaFirma = new iTextSharp.text.Font(iTextSharp.text.FontFactory.GetFont("C:\\Windows\\Fonts\\Verdana.ttf", BaseFont.CP1257, 11.0F, iTextSharp.text.Font.NORMAL, BaseColor.LIGHT_GRAY));

          // dodawanie logo - działa, nie ruszać :D
          iTextSharp.text.Image logo = iTextSharp.text.Image.GetInstance(Properties.Resources.Biomedica_Logo_Mailsignature_02, System.Drawing.Imaging.ImageFormat.Png);
          logo.SetAbsolutePosition(420, 750);
          logo.ScalePercent(30);
          cb.AddImage(logo);

          // dodawanie tekstów
          cb.BeginText();

          // some text lines are added here
          //...

          //dodawanie danych klienta
          // imie i nazwisko
          cb.SetColorFill(BaseColor.BLACK);
          cb.SetFontAndSize(BaseFont.CreateFont("C:\\Windows\\Fonts\\Verdanab.ttf", BaseFont.CP1257, BaseFont.NOT_EMBEDDED), 11.0F);
          cb.SetTextMatrix(300, 700);
          cb.ShowText(textBox1.Text.Trim());

          // pozycja
          cb.SetFontAndSize(BaseFont.CreateFont("C:\\Windows\\Fonts\\Verdana.ttf", BaseFont.CP1257, BaseFont.NOT_EMBEDDED), 11.0F);

          cb.SetTextMatrix(300, 680);
          cb.ShowText(textBox2.Text.Trim());
          //Organizacja
          cb.SetTextMatrix(300, 660);
          cb.ShowText(textBox3.Text.Trim());
          //adres
          cb.SetTextMatrix(300, 640);
          cb.ShowText(textBox4.Text.Trim());
          //miejscowosc
          cb.SetTextMatrix(300, 620);
          cb.ShowText(textBox5.Text.Trim());

          //nr oferty
          cb.SetFontAndSize(BaseFont.CreateFont("C:\\Windows\\Fonts\\Verdanab.ttf", BaseFont.CP1257, BaseFont.NOT_EMBEDDED), 11.0F);
          cb.ShowTextAligned(1, "Oferta cenowa nr: " + textBox7.Text.Trim(), 300, 580, 0);
          cb.EndText();

          PdfPTable tabela = new PdfPTable(dataGridView1.Columns.Count); //poniżej - definiowanie tabeli i przenoszenie danych z datagridview

          float[] szerokości = new float[] 
    {
      dataGridView1.Columns[0].Width,
      dataGridView1.Columns[1].Width,
      dataGridView1.Columns[2].Width,
      dataGridView1.Columns[3].Width,
      dataGridView1.Columns[4].Width,
      dataGridView1.Columns[5].Width,
      dataGridView1.Columns[6].Width
    };
          tabela.WidthPercentage = 95;
          tabela.SetWidths(szerokości);
          tabela.HorizontalAlignment = 1; // 0 - lewo, 1 - środek , 2 - prawo
          tabela.SpacingBefore = 170.0F;
          tabela.SpacingAfter = 12.0F;
          PdfPCell komorka = null;

          foreach (DataGridViewColumn c in dataGridView1.Columns)
          {
            komorka = new PdfPCell(new Phrase(new Chunk(c.HeaderText, czcionkaNaglowek)));
            komorka.HorizontalAlignment = PdfPCell.ALIGN_CENTER;
            komorka.VerticalAlignment = PdfPCell.ALIGN_CENTER;
            tabela.AddCell(komorka);
          }

          if (dataGridView1.Rows.Count > 0)
          {
            for (int i = 0; i < dataGridView1.Rows.Count; i++)
            {
              for (int j = 0; j < dataGridView1.Columns.Count; j++)
              {
                komorka = new PdfPCell(new Phrase(dataGridView1.Rows[i].Cells[j].Value.ToString(), czcionkaTabela));
                komorka.HorizontalAlignment = PdfPCell.ALIGN_CENTER;
                komorka.VerticalAlignment = PdfPCell.ALIGN_CENTER;
                tabela.AddCell(komorka);
              }
            }
          }
          oferta.Add(new Paragraph("Biomedica Poland Sp. z o.o.", czcionkaFirma));
          oferta.Add(new Paragraph("ul. Raszyńska 13", czcionkaFirma));
          oferta.Add(new Paragraph("05-500 Piaseczno", czcionkaFirma));
          oferta.Add(new Paragraph("tel: +48 (22) 737 59 96", czcionkaFirma));
          oferta.Add(new Paragraph("fax: +48 (22) 737 59 94", czcionkaFirma));
          oferta.Add(new Paragraph("www.biomedica.pl", czcionkaFirma));

          oferta.Add(tabela); //dodawanie tabeli 

          oferta.Add(new Paragraph("Oferta ważna do: " + dateTimePicker2.Value.ToLongDateString(), czcionkaTabela));
          oferta.Add(new Paragraph("Proponowany termin dostawy: " + textBox6.Text.Trim() + " dni.", czcionkaTabela));
          oferta.Add(new Paragraph("Termin płatności: " + textBox8.Text.Trim() + " dni.", czcionkaTabela));

          oferta.Add(new Paragraph(30.0f, "Obowiązujące ceny mogą ulec zmianie w przypadku:", czcionkaNaglowek));
          oferta.Add(new Paragraph("   * wzrostu kursów walut powyżej o powyżej 5%", czcionkaNaglowek));
          oferta.Add(new Paragraph("   * zmian stawek cła", czcionkaTabela));
          oferta.Add(new Paragraph("   * lub podatków związanych z obrotem towarowym", czcionkaTabela));

          oferta.Add(new Paragraph(30.0f, "Ofertę wystawił/a:", czcionkaTabela));
          oferta.Add(new Paragraph(label1.Text, czcionkaTabela));
          oferta.Add(new Paragraph(label2.Text, czcionkaTabela));
          oferta.Add(new Paragraph("Tel: " + label3.Text, czcionkaTabela));
          oferta.Add(new Paragraph("e-mail: " + label4.Text, czcionkaTabela));

          wri.PageEvent = new PDFFooter();
          oferta.Close();

        }
        catch (DocumentException dex)
        {
          MessageBox.Show(dex.ToString());
        }
        catch (Exception ex)
        {
          MessageBox.Show(ex.ToString());
        }
      }
  }
  else
  {
    MessageBox.Show("Brak produktów w ofercie", "Pusta oferta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
  }
}

このフッターを除いて、このコードに問題はありません。

4

3 に答える 3

1

iText in Actionで書いたように、メソッドにフッターを追加するべきではありませんOnStartPageOnEndPage参照する記事に記載されている方法を使用してください。その理由を知りたい場合は、本を読んでください。

また、本で説明されているように、ドキュメントを開く前にページ イベントを設定する必要があります。

PdfWriter wri = PdfWriter.GetInstance(oferta, new FileStream(saveFile.FileName, FileMode.Create));
oferta.AddAuthor(label1.Text);
oferta.AddCreator("Creator");
oferta.AddTitle(sNrOferty);
wri.PageEvent = new PDFFooter();
oferta.Open();

ページ イベントは、新しいページが作成されるたびにトリガーされます。ドキュメントを閉じる直前にページ イベントを追加すると、既に完了したすべてのページでイベントがトリガーされるわけではありません。つまり、あなたが参照した記事は間違っていました。

iTextSharp コードを記述するときは、公式ドキュメントを使用してください。

于 2013-04-08T11:47:35.263 に答える