根据需要在表是iTextSharp的页面不破?(Table in iTextSharp is not

2019-10-24 08:52发布

问题

标题是在第一页本身。 如果我的身体中有太多的人的照片,将打印在第二页上。 请参阅下面我的问题的图形描述:

现在,请阅读下面的一些代码。 请考虑以下伪代码(因为整个代码太长),但它是非常接近我试图修复代码。

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

代码的总结,

它可以但正如创建三个对象小区1,小区2和小区2到表。

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

尝试

  • 使用语法pdfPTableMain.KeepTogether = true
  • 使用skipFirstHeader(true)
  • 我应该把它定义为一个table1.add(table2)在表2中包含3个小区? (更新:我想这个它没有工作)。

我认为正在发生的事情是,如果我的小区2变得过大,它只是把它另一页上。 我想它的方式是,我有3行第2个是太大,不适合(所以把它另一页)。 我不是iText的或iTextSharp的专家,并会深深地体会到的任何援助。 我已经尝试了一些其他的东西,但似乎只会使情况变得更糟。 我谦恭地接触到更多的有经验的人,并寻求帮助。

Answer 1:

这个问题您链接到是正确的,但它说,该措辞有点怪异PdfPTable类不支持列和行跨度,这是真的。 然而, PdfPCell类是实际支持Colspan这是你所需要的。

下面是在桌面上的文件夹中创建PDF文件20的样本。 第一个文件刚刚照片1张,第二个有2等等,只是为了显示各种可能的迭代。 你需要你的桌面上名为“photo.jpg”上一张照片为它工作。 请参阅代码中的注释了解更多详情。

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


文章来源: Table in iTextSharp is not page breaking as desired?