删除每页第一行的 FixedLeading
Remove FixedLeading at the first line on each page
我想删除每页第一行的 setFixedLeading
(100+)
我读了一些文字(在帮助下又读了 100 页)。我将填充和边距设置为 0,但我仍然有顶部缩进。为什么?请帮帮我?怎么删除?
public static final String DEST = "PDF.pdf";
public static void main(String[] args) throws FileNotFoundException {
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(DEST));
Document doc = new Document(pdfDoc);
doc.setMargins(0,0,0,0);
for (int i = 0; i <20 ; i++) {
Paragraph element = new Paragraph("p " + i);
element.setPadding(0);
element.setMargin(0);
element.setFixedLeading(55);
doc.add(element);
}
doc.close();
}
PDF 文件:
https://pdfhost.io/v/Byt9LHJcy_PDFpdf.pdf
在创建元素时,您不知道它最终会出现在哪个页面上,也不知道它的结果位置。我不认为有一个 属性 允许您根据它是否是页面上的顶部元素来配置行为(这样 属性 太自定义并且与特定工作流程相关联)。
幸运的是,布局机制非常灵活,您可以在几行代码中实现所需的行为。
首先,我们不要使用 setFixedLeading
而是为所有段落设置上边距:
Document doc = new Document(pdfDocument);
doc.setMargins(0, 0, 0, 0);
for (int i = 0; i < 20; i++) {
Paragraph element = new Paragraph("p " + i);
element.setPadding(0);
element.setMargin(0);
element.setMarginTop(50);
doc.add(element);
}
doc.close();
这不会对视觉结果产生太大影响 - 它只是另一种做事方式。
现在,我们需要一个自定义呈现器来调整在页面顶部呈现的段落的行为。我们将重写 layout
方法并检查给定的区域是否位于页面顶部 - 如果是,我们将不会应用上边距:
private static class CustomParagraphRenderer extends ParagraphRenderer {
Document document;
public CustomParagraphRenderer(Paragraph modelElement, Document document) {
super(modelElement);
this.document = document;
}
@Override
public IRenderer getNextRenderer() {
return new ParagraphRenderer((Paragraph) modelElement);
}
@Override
public LayoutResult layout(LayoutContext layoutContext) {
if (layoutContext.getArea().getBBox().getTop() == document.getPdfDocument().getDefaultPageSize().getHeight()) {
((Paragraph)getModelElement()).setMarginTop(0);
}
return super.layout(layoutContext);
}
}
现在我们唯一需要做的就是为循环中的每个段落设置自定义渲染器实例:
element.setNextRenderer(new CustomParagraphRenderer(element, doc));
视觉结果:
我想删除每页第一行的 setFixedLeading
(100+)
我读了一些文字(在帮助下又读了 100 页)。我将填充和边距设置为 0,但我仍然有顶部缩进。为什么?请帮帮我?怎么删除?
public static final String DEST = "PDF.pdf";
public static void main(String[] args) throws FileNotFoundException {
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(DEST));
Document doc = new Document(pdfDoc);
doc.setMargins(0,0,0,0);
for (int i = 0; i <20 ; i++) {
Paragraph element = new Paragraph("p " + i);
element.setPadding(0);
element.setMargin(0);
element.setFixedLeading(55);
doc.add(element);
}
doc.close();
}
PDF 文件: https://pdfhost.io/v/Byt9LHJcy_PDFpdf.pdf
在创建元素时,您不知道它最终会出现在哪个页面上,也不知道它的结果位置。我不认为有一个 属性 允许您根据它是否是页面上的顶部元素来配置行为(这样 属性 太自定义并且与特定工作流程相关联)。
幸运的是,布局机制非常灵活,您可以在几行代码中实现所需的行为。
首先,我们不要使用 setFixedLeading
而是为所有段落设置上边距:
Document doc = new Document(pdfDocument);
doc.setMargins(0, 0, 0, 0);
for (int i = 0; i < 20; i++) {
Paragraph element = new Paragraph("p " + i);
element.setPadding(0);
element.setMargin(0);
element.setMarginTop(50);
doc.add(element);
}
doc.close();
这不会对视觉结果产生太大影响 - 它只是另一种做事方式。
现在,我们需要一个自定义呈现器来调整在页面顶部呈现的段落的行为。我们将重写 layout
方法并检查给定的区域是否位于页面顶部 - 如果是,我们将不会应用上边距:
private static class CustomParagraphRenderer extends ParagraphRenderer {
Document document;
public CustomParagraphRenderer(Paragraph modelElement, Document document) {
super(modelElement);
this.document = document;
}
@Override
public IRenderer getNextRenderer() {
return new ParagraphRenderer((Paragraph) modelElement);
}
@Override
public LayoutResult layout(LayoutContext layoutContext) {
if (layoutContext.getArea().getBBox().getTop() == document.getPdfDocument().getDefaultPageSize().getHeight()) {
((Paragraph)getModelElement()).setMarginTop(0);
}
return super.layout(layoutContext);
}
}
现在我们唯一需要做的就是为循环中的每个段落设置自定义渲染器实例:
element.setNextRenderer(new CustomParagraphRenderer(element, doc));
视觉结果: