使用 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);
     }
 }