iTextSharp中的表是不是按需分页? [英] Table in iTextSharp is not page breaking as desired?

查看:154
本文介绍了iTextSharp中的表是不是按需分页?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

标题单独位于第一页。如果我的身体中有太多人用于照片,它将在第二页上打印。请参阅下面的我的问题的图形说明:

The header is on the first page by itself. If my body has too many people in it for photos, it will print on the second page. Please see below for a graphical description of my problem:

现在,请阅读下面的部分代码。请将以下内容视为伪代码(因为整个代码太长),但它非常接近我要修复的代码。

Now, please read below for some code. Please consider the following as pseudo code (because the whole code is too long), but it is very close to the code I am trying to fix.

标题

   System.IO.FileInfo tempFileInfo
                    = new System.IO.FileInfo(System.IO.Path.GetTempFileName());

                tempFileInfo.MoveTo(tempFileInfo.FullName + ".pdf");

                Document document = new Document(PageSize._11X17);
                PdfWriter.GetInstance(document, new System.IO.FileStream(tempFileInfo.FullName, System.IO.FileMode.Create));
                document.AddTitle("Sample ");
                document.Open();
                document.SetMargins(0.5f, 0.5f, 0.5f, 0.5f);
                PdfPTable pdfPTableMain = new PdfPTable(1);    // 1 columns

                //Page Title
                iTextSharp.text.Font titleFont = iTextSharp.text.FontFactory.GetFont("Arial", 20, iTextSharp.text.Font.BOLD);
                iTextSharp.text.Paragraph titleParagraph = new Paragraph(terminalName + "\n\n"+ "Authorized Personnel", titleFont);
                PdfPCell cellTitle = new PdfPCell(titleParagraph);
                cellTitle.BorderColor = BaseColor.WHITE;
                cellTitle.NoWrap = true;
                cellTitle.HorizontalAlignment = iTextSharp.text.Element.ALIGN_CENTER;
                cellTitle.PaddingBottom = 10;
                pdfPTableMain.AddCell(cellTitle);

正文

PdfPTable pdfPTableList = new PdfPTable(6);
SqlConnection sqlConnection= Sample.Library.DB_Connection.OpenDatabase();

foreach (DataRow row in personDataSet.Tables[0].Rows)
{

      PdfPTable pdfPTablePhoto = new PdfPTable(1);

      iTextSharp.text.Image image =  
      iTextSharp.text.Image.GetInstance(GetPersonPhoto(personId),System.Drawing.Imaging.ImageFormat.Png);

       PdfPCell cellFullName = new PdfPCell(new Paragraph(fullName, fullnameFont));
       cellFullName.BorderColor = BaseColor.WHITE;
       cellFullName.HorizontalAlignment = iTextSharp.text.Element.ALIGN_CENTER;
       pdfPTablePhoto.AddCell(cellFullName);

       pdfPTableList.AddCell(pdfPTablePhoto);

}
pdfPTableList.CompleteRow();
pdfPTableMain.AddCell(pdfPTableList);

页脚

iTextSharp.text.Font footerFont1 = iTextSharp.text.FontFactory.GetFont("Arial", 10, iTextSharp.text.Font.BOLD); 
            iTextSharp.text.Paragraph footerParagraph1 = new Paragraph(
                "POSTER GENERATED: " + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString(), footerFont1);
            PdfPCell cellFooter1 = new PdfPCell(footerParagraph1);
            cellFooter1.BorderColor = BaseColor.WHITE;
            cellFooter.DisableBorderSide(Left);
            cellFooter.DisableBorderSide(Right);
            cellFooter.DisableBorderSide(Bottom);
            cellFooter.DisableBorderSide(Top);
            cellFooter1.NoWrap = true;
            cellFooter1.HorizontalAlignment = iTextSharp.text.Element.ALIGN_CENTER;
            cellFooter1.PaddingBottom = 5;
            pdfPTableMain.AddCell(cellFooter1);



            pdfPTableMain.KeepTogether = true;
            document.Add(pdfPTableMain);
            document.Close();

代码总结

虽然可以创建三个对象cell1,cell2和cell2到表。

It can be though as creating three objects cell1, cell2, and cell2 to a table.

table.Add(cell1);
table.Add(cell2);
table.Add(cell3);



尝试




  • 使用语法 pdfPTableMain.KeepTogether = true

  • 使用 skipFirstHeader(true)

  • 我应该将其定义为一个 table1.add(table2),其中table2包含3个单元格? (更新:我试过这个。它不起作用)。

  • Attempts

    • Using the syntax pdfPTableMain.KeepTogether = true
    • Using skipFirstHeader(true)
    • Should I define it as one table1.add(table2), where table2 contains 3 cells? (Update: I tried this. It did not work).
    • 我认为发生的事情是,如果我的cell2变得太大,它只会把它放在另一页上。我想的方式是我有3行而第2行太大而不适合(因此它将它放在另一页上)。我不是itext或itextsharp的专家,非常感谢任何帮助。我尝试过其他一些东西,但这似乎只会让情况变得更糟。我谦卑地联系更有经验的人并寻求帮助。

      What I think is happening is that if my cell2 becomes too large, it just puts it on another page. The way I think about it is that I have 3 rows and the 2nd is too big to fit (so it puts it on another page). I'm not an expert on itext or itextsharp, and would deeply appreciate any assistance. I've tried a few other things, but that seemed to only make it worse. I humbly reach out to more experienced individuals and ask for assistance.

      推荐答案

      你链接的问题是正确的,但措辞有点奇怪,因为它说 PdfPTable class不支持列和行跨度,这是真的。但是 PdfPCell 类实际上支持 Colspan ,这就是你需要的。

      The question you linked to is correct but worded a little weird in that it says that the PdfPTable class doesn't support column and row spans, which is true. However the PdfPCell class is what actually supports the Colspan which is what you need.

      以下是在桌面上的文件夹中创建20个PDF的示例。第一个文件只有1张照片,第二个文件只有2张,依此类推,只是为了显示各种可能的迭代。您需要在桌面上打一张名为photo.jpg的照片才能使用它。有关更多详细信息,请参阅代码中的注释。

      Below is a sample that creates 20 PDFs in a folder on your desktop. The first file has just 1 photo, the second has 2 and so on, just to show various possible iterations. You'll need one photo on your desktop called "photo.jpg" for it to work. See the comments in the code for more details.

      //Just a sample photo
      var photoPath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "photo.jpg");
      
      //Folder to export to
      var exportFolder = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Table Test");
      
      //Create our export folder if it doesn't exist already
      System.IO.Directory.CreateDirectory(exportFolder);
      
      //We're going to make 20 different files to show off 20 different
      //possible counts of people, each file will be named test_{count}.pdf
      var exportFilePathFormat = System.IO.Path.Combine(exportFolder, "test_{0}.pdf");
      
      //Do the PDF creation steps 20 times
      for (var i = 1; i <= 20; i++) {
      
          //Get our specific file name for this loop
          var thisFile = string.Format(exportFilePathFormat, i);
      
          //Standard iTextSharp bootstrapping, nothing special here
          using (var fs = new FileStream(thisFile, FileMode.Create, FileAccess.Write, FileShare.None)) {
              using (var doc = new Document()) {
                  using (var writer = PdfWriter.GetInstance(doc, fs)) {
      
                      //Open the document for writing
                      doc.Open();
      
                      //Create a two column table
                      var t = new PdfPTable(2);
      
                      //Create our header cell
                      var headerCell = new PdfPCell(new Phrase("This is my header"));
      
                      //Span it two columns
                      headerCell.Colspan = 2;
      
                      //Add it to the document
                      t.AddCell(headerCell);
      
                      //Create between 1 and 20 image cells
                      for (var j = 1; j <= i; j++) {
                          t.AddCell(iTextSharp.text.Image.GetInstance(photoPath));
                      }
      
                      //Just in case we have an odd number of images, complete the row
                      t.CompleteRow();
      
                      //Footer is same as header
                      var footerCell = new PdfPCell(new Phrase("This is my footer"));
                      footerCell.Colspan = 2;
                      t.AddCell(footerCell);
      
                      //Add the table to the document
                      doc.Add(t);
      
                      doc.Close();
                  }
              }
          }
      }
      

      这篇关于iTextSharp中的表是不是按需分页?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆