使用 iText7 将文本写入段落中的固定位置
Write text to fixed position in paragraph with iText7
我尝试在 c# 中使用 iText7 编写带有 header、徽标和 table 的 pdf 文件。
我以前从未使用过iText7,因此我不知道如何将段落中的文本写到固定位置。
现在我只是使用制表位作为文本的锚点。但这里的问题是,当字符串太长时,该行后面的所有内容都将移动一个制表位,并且 header 中的“列”不再对齐。
下图也是我想要实现的:
这张图片显示了如果字符串太长会发生什么(在这个例子中我使用了一个长用户名):
这是我用来编写一行 header:
的代码片段
// generate 8 tabstops to split pdf in equal sections
List<TabStop> tabStops = new List<TabStop>();
for (uint i = 0; i < 8; i++)
{
float tabSize = pageSize.GetWidth() / 8;
tabStops.Add(new TabStop(tabSize, TabAlignment.LEFT));
}
Paragraph p = new Paragraph();
p.SetFontSize(10);
// add tabstops to paragraph for text alignment
p.AddTabStops(tabStops);
// add title of header
p.Add(title1).Add("\n");
// write line one of header
p.Add("Serie: ").Add(new Tab()).Add(info.serial.ToString())
.Add(new Tab()).Add(new Tab())
.Add("Input CSV: ").Add(new Tab()).Add(info.inputFileName)
.Add(new Tab()).Add(new Tab()).Add("Out-Series: ")
.Add(info.serial.ToString()).Add("\n");
// line 2...
p.Add("User: ").Add(new Tab()).Add(info.username)
.Add(new Tab()).Add(new Tab()).Add(new Tab())
.Add("qPCR-Datei: ").Add(new Tab()).Add(info.qpcr1FileName)
.Add(new Tab()).Add(new Tab()).Add(new Tab())
.Add("STR-Out: ").Add(strFileName).Add("\n");
我希望有人能帮我展示一种更好的文本对齐方式,或者有相关信息可以查看。
另一个不错的技巧是如何在同一制表位部分保留换行符。例如,如果文件名太长(s. "STR-Out: " in picture),换行符将被执行,但新行中的文件名部分应保留在制表位后面 "STR-OUT: "
而不是 Tab/Tabspace 使用表格和单元格,以便正确对齐。
创建第 8 列大小的 table(标签,值,space,标签,值,Space,标签,值)
使用此示例代码。
PdfPTable table = new PdfPTable(8);
PdfPCell cell;
cell = new PdfPCell();
cell.setRowspan(2); //only if spanning needed
table.addCell(cell);
for(int aw=0;aw<8;aw++){
table.addCell("hi");
}
感谢@shihabudheenk 使用 table.
为我指明了正确的方向
只需调整一些代码以适应 iText7。
首先是
Table headerTable = new Table().SetBorder(Border.NO_BORDER);
在 iText7 中无效,您必须单独为每个单元格设置选项,例如:
Cell cell = new Cell().SetBorder(Border.NO_BORDER);
但问题是
cell.Add()
在 iText7 中只接受 IBlockElement 作为参数,所以我也像这样使用它:
cell.Add(new Paragraph("text");
一遍又一遍地对每个单元格执行此操作非常烦人。因此我按照建议使用了 removeBorder 函数 here
所以我用来构建 header 的最终代码如下所示:
// initialize table with fixed column sizes
Table headerTable = new Table(UnitValue.CreatePercentArray(
new[] { 1f, 1.2f, 1f, 1.8f, 0.7f, 2.5f })).SetFixedLayout();
// write headerline 1
headerTable.AddCell("Serie: ").AddCell(info.serial.ToString())
.AddCell("Input CSV: ")
.AddCell(info.inputFileName)
// write remaining lines...
....
// remove boarder from all cells
removeBorder(headerTable);
private static void removeBorder(Table table)
{
foreach (IElement iElement in table.GetChildren())
{
((Cell)iElement).SetBorder(Border.NO_BORDER);
}
}
我尝试在 c# 中使用 iText7 编写带有 header、徽标和 table 的 pdf 文件。
我以前从未使用过iText7,因此我不知道如何将段落中的文本写到固定位置。
现在我只是使用制表位作为文本的锚点。但这里的问题是,当字符串太长时,该行后面的所有内容都将移动一个制表位,并且 header 中的“列”不再对齐。
下图也是我想要实现的:
这张图片显示了如果字符串太长会发生什么(在这个例子中我使用了一个长用户名):
这是我用来编写一行 header:
的代码片段// generate 8 tabstops to split pdf in equal sections
List<TabStop> tabStops = new List<TabStop>();
for (uint i = 0; i < 8; i++)
{
float tabSize = pageSize.GetWidth() / 8;
tabStops.Add(new TabStop(tabSize, TabAlignment.LEFT));
}
Paragraph p = new Paragraph();
p.SetFontSize(10);
// add tabstops to paragraph for text alignment
p.AddTabStops(tabStops);
// add title of header
p.Add(title1).Add("\n");
// write line one of header
p.Add("Serie: ").Add(new Tab()).Add(info.serial.ToString())
.Add(new Tab()).Add(new Tab())
.Add("Input CSV: ").Add(new Tab()).Add(info.inputFileName)
.Add(new Tab()).Add(new Tab()).Add("Out-Series: ")
.Add(info.serial.ToString()).Add("\n");
// line 2...
p.Add("User: ").Add(new Tab()).Add(info.username)
.Add(new Tab()).Add(new Tab()).Add(new Tab())
.Add("qPCR-Datei: ").Add(new Tab()).Add(info.qpcr1FileName)
.Add(new Tab()).Add(new Tab()).Add(new Tab())
.Add("STR-Out: ").Add(strFileName).Add("\n");
我希望有人能帮我展示一种更好的文本对齐方式,或者有相关信息可以查看。
另一个不错的技巧是如何在同一制表位部分保留换行符。例如,如果文件名太长(s. "STR-Out: " in picture),换行符将被执行,但新行中的文件名部分应保留在制表位后面 "STR-OUT: "
而不是 Tab/Tabspace 使用表格和单元格,以便正确对齐。
创建第 8 列大小的 table(标签,值,space,标签,值,Space,标签,值)
使用此示例代码。
PdfPTable table = new PdfPTable(8);
PdfPCell cell;
cell = new PdfPCell();
cell.setRowspan(2); //only if spanning needed
table.addCell(cell);
for(int aw=0;aw<8;aw++){
table.addCell("hi");
}
感谢@shihabudheenk 使用 table.
为我指明了正确的方向只需调整一些代码以适应 iText7。
首先是
Table headerTable = new Table().SetBorder(Border.NO_BORDER);
在 iText7 中无效,您必须单独为每个单元格设置选项,例如:
Cell cell = new Cell().SetBorder(Border.NO_BORDER);
但问题是
cell.Add()
在 iText7 中只接受 IBlockElement 作为参数,所以我也像这样使用它:
cell.Add(new Paragraph("text");
一遍又一遍地对每个单元格执行此操作非常烦人。因此我按照建议使用了 removeBorder 函数 here
所以我用来构建 header 的最终代码如下所示:
// initialize table with fixed column sizes
Table headerTable = new Table(UnitValue.CreatePercentArray(
new[] { 1f, 1.2f, 1f, 1.8f, 0.7f, 2.5f })).SetFixedLayout();
// write headerline 1
headerTable.AddCell("Serie: ").AddCell(info.serial.ToString())
.AddCell("Input CSV: ")
.AddCell(info.inputFileName)
// write remaining lines...
....
// remove boarder from all cells
removeBorder(headerTable);
private static void removeBorder(Table table)
{
foreach (IElement iElement in table.GetChildren())
{
((Cell)iElement).SetBorder(Border.NO_BORDER);
}
}