gpt4 book ai didi

c# - 打印为 PDF 时字符串格式中的退格键

转载 作者:行者123 更新时间:2023-11-30 14:51:21 26 4
gpt4 key购买 nike

我正在尝试以 PDF 格式打印两列信息,其中包含用户输入的一些字符串。到目前为止,这是我的代码:

string s = "";
int width = 60 - name.Count(Char.IsWhiteSpace);
s = s + string.Format("{0,-" + width +"}", "Name: " + name);
s = s + string.Format("{0,15}","AAA: ");
p1.Add(s);
document.Add(p1);

string p = "";
int width = 60 - surname.Count(Char.IsWhiteSpace);
p = p + string.Format("{0,-"+ width +"}", "Surname: " + surname);
p = p + string.Format("{0,15}","BBB: ");
p2.Add(p);
document.Add(p2);

string r = "";
int width = 60 - school.Count(Char.IsWhiteSpace);
r = r + string.Format("{0,-"+ width +"}", "School: " + school);
r = r + string.Format("{0,15}","CCC: ");
p3.Add(r);
document.Add(p3);

例如,如果用户输入“John Edward Jr”。对于名字,“Pascal Einstein W. Alfi”对于姓氏和“St. John”对于学校,那么预期的输出是这样的:

Name: John Edward Jr.________________AAA:Surname: Pascal Einstein W. Alfi_______BBB:School: St. John___________________CCC:

I suppose the spaces in every string name, surname and school are the problem. How can I deal with this?

EXPECTED OUTPUT:

Name: John Edward Jr.__________________AAA:Surname: Pascal Einstein W. Alfi_______BBB:School: St. John_______________________CCC:

EDIT:

int width = 60 - name.Count(Char.IsWhiteSpace);

最佳答案

假设我们要以表格格式呈现此数据:

public static final String[][] DATA = {
{"John Edward Jr.", "AAA"},
{"Pascal Einstein W. Alfi", "BBB"},
{"St. John", "CCC"}
};

使用 iText 可以通过三种方式实现这一点。

解决方案 #1:使用表格

请看SimpleTable13示例:

public void createPdf(String dest) throws IOException, DocumentException {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();
PdfPTable table = new PdfPTable(2);
table.setWidthPercentage(50);
table.setHorizontalAlignment(Element.ALIGN_LEFT);
table.setWidths(new int[]{5, 1});
table.getDefaultCell().setBorder(Rectangle.NO_BORDER);
table.addCell("Name: " + DATA[0][0]);
table.addCell(DATA[0][1]);
table.addCell("Surname: " + DATA[1][0]);
table.addCell(DATA[1][1]);
table.addCell("School: " + DATA[2][0]);
table.addCell(DATA[1][1]);
document.add(table);
document.close();
}

我们创建一个包含 2 列的表格并添加 6 个单元格。这将生成一个包含 2 列和 3 行的表格。当我们移除边框并告诉表格第一列的宽度应为第二列的 5 倍时,结果如下所示:

enter image description here

优点:如果其中一个单元格中的文本过多,则内容会自动换行,表格的大小会适应内容。

解决方案 #2:使用标签

请看TableTab示例:

public void createPdf(String dest) throws FileNotFoundException, DocumentException {
Document document = new Document();

PdfWriter.getInstance(document, new FileOutputStream(dest));

document.open();

document.add(createParagraphWithTab("Name: ", DATA[0][0], DATA[0][1]));
document.add(createParagraphWithTab("Surname: ", DATA[1][0], DATA[1][1]));
document.add(createParagraphWithTab("School: ", DATA[2][0], DATA[2][1]));

document.close();
}

public Paragraph createParagraphWithTab(String key, String value1, String value2) {
Paragraph p = new Paragraph();
p.setTabSettings(new TabSettings(200f));
p.add(key);
p.add(value1);
p.add(Chunk.TABBING);
p.add(value2);
return p;
}

在这个例子中,我们创建了一个段落,我们为其定义了 200 个用户单元的标签。现在,当我们添加一个 Chunk.TABBING 时,内容将跳转到该位置。结果如下所示:

enter image description here

缺点:当第一列的文本太多时,该文本会跑到第二列,并在接下来的 200 个用户单元处添加一个制表符(可能在同一行,可能在下一行)线)。

解决方案 #3:使用空格和等宽字体

这就是您正在做的,除了您不使用不会给您想要的结果的等宽字体。

请看TableSpace示例:

public void createPdf(String dest) throws DocumentException, IOException {
Document document = new Document();

PdfWriter.getInstance(document, new FileOutputStream(dest));

document.open();

BaseFont bf = BaseFont.createFont(FONT, BaseFont.CP1250, BaseFont.EMBEDDED);
Font font = new Font(bf, 12);

document.add(createParagraphWithSpaces(font, String.format("%s: %s", "Name", DATA[0][0]), DATA[0][1]));
document.add(createParagraphWithSpaces(font, String.format("%s: %s", "Surname", DATA[1][0]), DATA[1][1]));
document.add(createParagraphWithSpaces(font, String.format("%s: %s", "School", DATA[2][0]), DATA[2][1]));

document.close();
}

public Paragraph createParagraphWithSpaces(Font font, String value1, String value2) {
Paragraph p = new Paragraph();
p.setFont(font);
p.add(String.format("%-35s", value1));
p.add(value2);
return p;
}

现在我们格式化第一个字符串,使其始终为 35 个字符。结果如下所示:

enter image description here

缺点:如果第一列的文字需要超过35个字符,就会贯穿第二列,第二列的文字会粘在上面。您还看到我需要使用不同的字体。我用 PTMono-Regular .通常,等宽字体的文本比等宽字体的文本占用更多空间。有关等宽字体的更多信息,请阅读我对以下内容的回答:How to set monospaced font by using iTextSharp?

关于c# - 打印为 PDF 时字符串格式中的退格键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34480476/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com