[英]iTextSharp: table row gets pushed to new page if it doesn't fit on the current one
[英]itextsharp doesn't make new page when content is longer
我尝试从3天开始寻找制作一个pdf文档的方法,我将不胜感激。
我只有很少的表单字段可以访问和填写。 我要在此字段下方放置动态创建的表。 该表可能足够长,不能超过一页。 这是我的问题。 我无法在同一页面上的表格字段下方添加此表格。 我找到合并pdf文件的示例。 现在我有这种情况。
我只希望表单字段和表格从第一页开始,然后在下一页继续。
我发布我的代码有点混乱,但是...
string pdfTemplate = Server.MapPath("~/PDF/") + "invoiceTest.pdf";
string newFile = Server.MapPath("~/PDF/") + "invoice" + 1 + ".pdf";
using (FileStream ms = new FileStream(Server.MapPath("~/PDF/") + "invoice" + 1 + ".pdf", FileMode.Create))
using (FileStream formFile = new FileStream(Server.MapPath("~/PDF/") + "invoiceTest.pdf", FileMode.Open))
{
PdfReader reader = new PdfReader(formFile);
using (Document document = new Document(reader.GetPageSizeWithRotation(1)))
{
PdfStamper outStamper = new PdfStamper(reader, ms);
PdfContentByte body = outStamper.GetOverContent(reader.NumberOfPages);
document.Open(); //Open document to work with
AcroFields fields = outStamper.AcroFields;
BaseFont bfComic = BaseFont.CreateFont(Server.MapPath("~/PDF/") + "trebuc.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font font = new Font(bfComic, 12);
// UPDATE THE FORM FIELDS
fields.SetFieldProperty("txtContragentName", "textfont", bfComic, null);
fields.SetField("txtContragentName", "Фрея");
fields.SetFieldProperty("txtContragentCode", "textfont", bfComic, null);
fields.SetField("txtContragentCode", "DGB34TT");
fields.SetFieldProperty("txtDateCreated", "textfont", bfComic, null);
fields.SetField("txtDateCreated", "03.06.2013");
outStamper.Close();
}
}
using (FileStream ms = new FileStream(Server.MapPath("~/PDF/") + "invoice" + 2 + ".pdf", FileMode.Create))
using (FileStream formFile = new FileStream(Server.MapPath("~/PDF/") + "invoice" + 1 + ".pdf", FileMode.Open))
{
PdfReader reader = new PdfReader(formFile);
using (Document document = new Document(reader.GetPageSizeWithRotation(1)))
{
PdfWriter writer = PdfWriter.GetInstance(document, ms);
document.Open();
//Paragraph heading = new Paragraph("Page Heading", new Font(Font.FontFamily.HELVETICA, 10f, Font.BOLD));
//heading.SpacingAfter = 8f;
//doc.Add(heading);
string text = @"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Suspendisse blandit blandit turpis. Nam in lectus ut dolor consectetuer bibendum. Morbi neque ipsum, laoreet id; dignissim et, viverra id, mauris. Nulla mauris elit, consectetuer sit amet, accumsan eget, congue ac, libero. Vivamus suscipit. Nunc dignissim consectetuer lectus. Fusce elit nisi; commodo non, facilisis quis, hendrerit eu, dolor? Suspendisse eleifend nisi ut magna. Phasellus id lectus! Vivamus laoreet enim et dolor. Integer arcu mauris, ultricies vel, porta quis, venenatis at, libero. Donec nibh est, adipiscing et, ullamcorper vitae, placerat at, diam. Integer ac turpis vel ligula rutrum auctor! Morbi egestas erat sit amet diam. Ut ut ipsum? Aliquam non sem. Nulla risus eros, mollis quis, blandit ut; luctus eget, urna. Vestibulum vestibulum dapibus erat. Proin egestas leo a metus?";
PdfContentByte cb = writer.DirectContent;
ColumnText columns = new ColumnText(cb);
//float left, float right, float gutterwidth, int numcolumns
columns.SetSimpleColumn(40, 20, document.PageSize.Width - 40, document.PageSize.Height - 20);
//Paragraph para = new Paragraph(text, new Font(Font.FontFamily.HELVETICA, 8f));
////para.SpacingAfter = 9f;
//para.Alignment = Element.ALIGN_JUSTIFIED;
//for (int i = 0; i < 28; i++)
//{
// columns.AddElement(para);
//}
//columns.Go();
BaseFont bfComic = BaseFont.CreateFont(Server.MapPath("~/PDF/") + "trebuc.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font font = new Font(bfComic, 12);
PdfPTable table = new PdfPTable(10);
table.HorizontalAlignment = Element.ALIGN_LEFT;
table.DefaultCell.HorizontalAlignment = Element.ALIGN_RIGHT;
table.WidthPercentage = 100;
PdfPCell cell1 = new PdfPCell(new Phrase("ДАТА", new Font(bfComic, 10f, Font.NORMAL, BaseColor.WHITE))) { HorizontalAlignment = 1, VerticalAlignment = 2 };
cell1.BackgroundColor = new iTextSharp.text.BaseColor(System.Drawing.ColorTranslator.FromHtml("#808080"));
PdfPCell cell2 = new PdfPCell(new Phrase("Header spanning 3 columns", new Font(Font.NORMAL, 10f, Font.NORMAL, BaseColor.WHITE))) { HorizontalAlignment = 1 };
cell2.BackgroundColor = new iTextSharp.text.BaseColor(System.Drawing.ColorTranslator.FromHtml("#808080"));
table.AddCell(cell1);
table.AddCell(cell2);
//dump data to be set
#region dump data
for (int i = 0; i < 100; i++)
{
table.AddCell("Col 1 Row 1");
}
#endregion
float[] widths = new float[] { 200f, 200f, 200f, 200f, 100f, 100f, 100f, 100f, 100f, 100f };
table.SetWidths(widths);
table.CompleteRow(); //Added - table won't add the final row if its cells are incomplete - safe to have it ending a table
columns.AddElement(table);
columns.Go();
}
}
using (FileStream ms = new FileStream(Server.MapPath("~/PDF/") + "invoice" + 3 + ".pdf", FileMode.Create))
using (FileStream stampedfile = new FileStream(Server.MapPath("~/PDF/") + "invoice" + 1 + ".pdf", FileMode.Open))
using (FileStream appendfile = new FileStream(Server.MapPath("~/PDF/") + "invoice" + 2 + ".pdf", FileMode.Open))
{
PdfReader stampedContentReader = new PdfReader(stampedfile);
PdfReader appendContentReader = new PdfReader(appendfile);
using (Document document = new Document(stampedContentReader.GetPageSizeWithRotation(1)))
{
PdfCopy pdfCopy = new PdfCopy(document, ms);
document.Open();
for (int i = 1; i <= stampedContentReader.NumberOfPages; i++)
pdfCopy.AddPage(pdfCopy.GetImportedPage(stampedContentReader, i));
for (int i = 1; i <= appendContentReader.NumberOfPages; i++)
pdfCopy.AddPage(pdfCopy.GetImportedPage(appendContentReader, i));
}
}
您的代码确实是一团糟。 我将复制/粘贴它,但请理解我不是C#开发人员。 我只知道Java,而且从内到外都知道iText(我是它的原始开发人员)。
string pdfTemplate = Server.MapPath("~/PDF/") + "invoiceTest.pdf";
string newFile = Server.MapPath("~/PDF/") + "invoice" + 1 + ".pdf";
using (FileStream ms = new FileStream(Server.MapPath("~/PDF/") + "invoice" + 1 + ".pdf", FileMode.Create))
using (FileStream formFile = new FileStream(Server.MapPath("~/PDF/") + "invoiceTest.pdf", FileMode.Open))
{
PdfReader reader = new PdfReader(formFile);
// YOU DON'T NEED A DOCUMENT OBJECT HERE!
// READ THE DOCUMENTATION!!!
PdfStamper outStamper = new PdfStamper(reader, ms);
AcroFields fields = outStamper.AcroFields;
BaseFont bfComic = BaseFont.CreateFont(Server.MapPath("~/PDF/") + "trebuc.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
// UPDATE THE FORM FIELDS
fields.SetFieldProperty("txtContragentName", "textfont", bfComic, null);
fields.SetField("txtContragentName", "Фрея");
fields.SetFieldProperty("txtContragentCode", "textfont", bfComic, null);
fields.SetField("txtContragentCode", "DGB34TT");
fields.SetFieldProperty("txtDateCreated", "textfont", bfComic, null);
fields.SetField("txtDateCreated", "03.06.2013");
outStamper.Close();
}
using (FileStream ms = new FileStream(Server.MapPath("~/PDF/") + "invoice" + 2 + ".pdf", FileMode.Create))
using (FileStream formFile = new FileStream(Server.MapPath("~/PDF/") + "invoice" + 1 + ".pdf", FileMode.Open))
{
PdfReader reader = new PdfReader(formFile);
// I'm adding extra parameters to change the margins so that they match what you had when you defined your ColumnText object
using (Document document = new Document(reader.GetPageSizeWithRotation(1), 40, 40, 20, 20))
{
PdfWriter writer = PdfWriter.GetInstance(document, ms);
document.Open();
// HEADERS ARE ADDED WITH PAGE EVENTS!!!
// PLEASE READ ABOUT PAGE EVENTS IF YOU NEED PAGE HEADERS
string text = @"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Suspendisse blandit blandit turpis. Nam in lectus ut dolor consectetuer bibendum. Morbi neque ipsum, laoreet id; dignissim et, viverra id, mauris. Nulla mauris elit, consectetuer sit amet, accumsan eget, congue ac, libero. Vivamus suscipit. Nunc dignissim consectetuer lectus. Fusce elit nisi; commodo non, facilisis quis, hendrerit eu, dolor? Suspendisse eleifend nisi ut magna. Phasellus id lectus! Vivamus laoreet enim et dolor. Integer arcu mauris, ultricies vel, porta quis, venenatis at, libero. Donec nibh est, adipiscing et, ullamcorper vitae, placerat at, diam. Integer ac turpis vel ligula rutrum auctor! Morbi egestas erat sit amet diam. Ut ut ipsum? Aliquam non sem. Nulla risus eros, mollis quis, blandit ut; luctus eget, urna. Vestibulum vestibulum dapibus erat. Proin egestas leo a metus?";
BaseFont bfComic = BaseFont.CreateFont(Server.MapPath("~/PDF/") + "trebuc.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font font = new Font(bfComic, 12);
PdfPTable table = new PdfPTable(10);
// The next line doesn't make sense if the width percentage is 100%
// table.HorizontalAlignment = Element.ALIGN_LEFT;
table.DefaultCell.HorizontalAlignment = Element.ALIGN_RIGHT;
table.WidthPercentage = 100;
PdfPCell cell1 = new PdfPCell(new Phrase("ДАТА", new Font(bfComic, 10f, Font.NORMAL, BaseColor.WHITE))) { HorizontalAlignment = 1, VerticalAlignment = 2 };
cell1.BackgroundColor = new iTextSharp.text.BaseColor(System.Drawing.ColorTranslator.FromHtml("#808080"));
PdfPCell cell2 = new PdfPCell(new Phrase("Header spanning 3 columns", new Font(Font.NORMAL, 10f, Font.NORMAL, BaseColor.WHITE))) { HorizontalAlignment = 1 };
cell2.BackgroundColor = new iTextSharp.text.BaseColor(System.Drawing.ColorTranslator.FromHtml("#808080"));
table.AddCell(cell1);
table.AddCell(cell2);
//dump data to be set
#region dump data
for (int i = 0; i < 100; i++)
{
table.AddCell("Col 1 Row 1");
}
#endregion
float[] widths = new float[] { 200f, 200f, 200f, 200f, 100f, 100f, 100f, 100f, 100f, 100f };
table.SetWidths(widths);
table.CompleteRow(); //Added - table won't add the final row if its cells are incomplete - safe to have it ending a table
document.Add(table);
}
}
您在代码的第一部分中犯的主要错误是引入Document
。 没有必要。 请阅读我的书的第6章 ,并查看C#示例 。
您在第二部分中犯的主要错误是使用ColumnText
这意味着您想控制布局,但不知道如何处理该控件。 如果使用ColumnText
,则需要询问该列是否所有内容都已消耗。 如果不是,则需要自己创建一个新页面。 这一切都在我的书的第3章中进行了解释。
第三部分看起来还可以(据我所知C#)。
我写书是为了使人们从一开始就可以通过编写正确的代码来节省时间。 我没有写书,所以我不得不将它们复制/粘贴到StackOverflow上;-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.