如何找出 itext7 中设置换行符(连字符)的位置
How to find out where line breaks(hyphen) are set in itext7
如何找出设置换行符的位置?
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(DEST));
Document doc = new Document(pdfDoc, PageSize.A4);
Paragraph paragraph = new Paragraph()
.setHyphenation(new HyphenationConfig("en", "EN", 2, 2))
.add(new Text(bigString));
doc.add(paragraph);
doc.close();
在左边,一切都从同一层开始。:
我想将连字符后的边距更改为每行边距不同:
我能找到连字符前的那一行和连字符的宽度吗?
我是这样做的:
1) 找出页面的宽度
MAX = doc.getPdfDocument().getDefaultPageSize().getWidth() - (doc.getLeftMargin() + doc.getRightMargin());
2) 我算宽字
widthWordsAllLine += font.getWidth(words.get(i),22);
3) if (widthWordsAllLine + font.getWidth(words.get(i),22)> MAX) i 分词 .
4) 然后我把每个词和分词加到段落中。并设置 paragraph.setMagrinLeft(10);
我没有描述所有内容,因为这会花费很多时间
它可以工作,但是如果我添加一个新功能,一切都将无法工作(例如文本对齐)。能否以不同方式实施?
我对这个问题的理解:目标是为段落的每一行添加随机边距,这样当使用 handwritten-like 字体时,它仍然看起来像文本是手动编写的。还应使用连字符,因此尝试将文本分成段落的原始方法。
不过,解决方案可以更简单。我们可以将要绘制的段落的线条在绘制之前稍微移动一下。包括断字在内的所有功能都将被保留。
可以通过以下方式使用自定义渲染器完成:
private static class CustomParagraphRenderer extends ParagraphRenderer {
public CustomParagraphRenderer(Paragraph modelElement) {
super(modelElement);
}
@Override
public void drawChildren(DrawContext drawContext) {
Random r = new Random();
if (lines != null) {
for (LineRenderer line : lines) {
int leftMargin = r.nextInt(10);
line.move(leftMargin, 0);
line.draw(drawContext);
}
}
}
@Override
public IRenderer getNextRenderer() {
return new CustomParagraphRenderer((Paragraph) modelElement);
}
}
然后将它应用到段落很容易:
Paragraph paragraph = new Paragraph(longStr);
paragraph.setHyphenation(new HyphenationConfig("en", "US", 2, 2));
paragraph.setNextRenderer(new CustomParagraphRenderer(paragraph));
我得到的结果是这样的:
如何找出设置换行符的位置?
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(DEST));
Document doc = new Document(pdfDoc, PageSize.A4);
Paragraph paragraph = new Paragraph()
.setHyphenation(new HyphenationConfig("en", "EN", 2, 2))
.add(new Text(bigString));
doc.add(paragraph);
doc.close();
在左边,一切都从同一层开始。:
我想将连字符后的边距更改为每行边距不同:
我能找到连字符前的那一行和连字符的宽度吗?
我是这样做的:
1) 找出页面的宽度
MAX = doc.getPdfDocument().getDefaultPageSize().getWidth() - (doc.getLeftMargin() + doc.getRightMargin());
2) 我算宽字
widthWordsAllLine += font.getWidth(words.get(i),22);
3) if (widthWordsAllLine + font.getWidth(words.get(i),22)> MAX) i 分词 .
4) 然后我把每个词和分词加到段落中。并设置 paragraph.setMagrinLeft(10);
我没有描述所有内容,因为这会花费很多时间
它可以工作,但是如果我添加一个新功能,一切都将无法工作(例如文本对齐)。能否以不同方式实施?
我对这个问题的理解:目标是为段落的每一行添加随机边距,这样当使用 handwritten-like 字体时,它仍然看起来像文本是手动编写的。还应使用连字符,因此尝试将文本分成段落的原始方法。
不过,解决方案可以更简单。我们可以将要绘制的段落的线条在绘制之前稍微移动一下。包括断字在内的所有功能都将被保留。
可以通过以下方式使用自定义渲染器完成:
private static class CustomParagraphRenderer extends ParagraphRenderer {
public CustomParagraphRenderer(Paragraph modelElement) {
super(modelElement);
}
@Override
public void drawChildren(DrawContext drawContext) {
Random r = new Random();
if (lines != null) {
for (LineRenderer line : lines) {
int leftMargin = r.nextInt(10);
line.move(leftMargin, 0);
line.draw(drawContext);
}
}
}
@Override
public IRenderer getNextRenderer() {
return new CustomParagraphRenderer((Paragraph) modelElement);
}
}
然后将它应用到段落很容易:
Paragraph paragraph = new Paragraph(longStr);
paragraph.setHyphenation(new HyphenationConfig("en", "US", 2, 2));
paragraph.setNextRenderer(new CustomParagraphRenderer(paragraph));
我得到的结果是这样的: