我正在尝试使用C#重新创建此处的CellMarginPadding示例:
一切都按预期工作除了边距。在调用SetMargin(),SetMarginBottom()或SetMarginTop()的单元格上没有设置边距。
我的C#代码是一个直接端口,如下所示:
//Initialize PDF document
PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
// Initialize document
Document document = new Document(pdf);
Table table = new Table(new float[] {2, 1, 1});
table.SetBackgroundColor(Color.ORANGE);
table.SetWidthPercent(80);
table.SetHorizontalAlignment(HorizontalAlignment.CENTER);
table.AddCell(new Cell(1, 3).Add("Cell with colspan 3")
.SetPadding(10).SetMargin(5).SetBackgroundColor(Color.GREEN));
table.AddCell(new Cell(2, 1).Add("Cell with rowspan 2")
.SetMarginTop(5).SetMarginBottom(5).SetPaddingLeft(30)
.SetFontColor(Color.WHITE).SetBackgroundColor(Color.BLUE));
table.AddCell(new Cell().Add("row 1; cell 1")
.SetFontColor(Color.WHITE).SetBackgroundColor(Color.RED));
table.AddCell(new Cell().Add("row 1; cell 2"));
table.AddCell(new Cell().Add("row 2; cell 1").SetMargin(10)
.SetFontColor(Color.WHITE).SetBackgroundColor(Color.RED));
table.AddCell(new Cell().Add("row 2; cell 2").SetPadding(10)
.SetFontColor(Color.WHITE).SetBackgroundColor(Color.RED));
document.Add(table);
document.Close();
我这样做错了吗?或者是否可能在itext7 .NET库中存在错误?
答案 0 :(得分:1)
我认为您希望重新引入iText 7.0.0中存在的错误。
我已将您的代码示例转换为HTML:
<table style="background: orange; text-align: center; width: 80%" border="0" cellspacing="0" align="center">
<tr>
<td colspan="3" style="padding: 10pt; margin: 5pt; background: green;">Cell with colspan 3</td>
</tr>
<tr>
<td rowspan="2" style="color: white; background: blue; margin-top: 5pt; margin-bottom: 30pt; padding-left: 30pt">Cell with rowspan 2</td>
<td style="color: white; background: red">row 1; cell 1</td>
<td>row 1; cell 2</td>
</tr>
<tr>
<td style="color: white; background: red; margin: 10pt;">row 2; cell 1</td>
<td style="color: white; background: red; padding: 10pt;">row 2; cell 2</td>
</tr>
</table>
我将C#代码中的边距,填充,颜色等的值转换为HTML中的内联CSS值。然后我将该HTML转换为PDF。
您可以在以下屏幕截图中看到HTML和PDF:
您是否同意PDF看起来符合预期?
如果您希望我们调查此事,请提供一些HTML代码,以创建一个表格,准确显示您在定义边距时要实现的目标。我们有兴趣检查pdfHTML是否将该HTML转换为看起来或多或少相同的PDF。如果确实如此,如果您真的想要编写表格,那么您可以使用pdfHTML(iText 7上的附加组件)使用的代码直接从代码中模拟相同的结果。
<强>更新强>
由于您的问题,我已经开始更新Building Blocks教程的第5章。我还有很多工作要做,但我已经可以告诉你我发现了什么。
正如我在初始回答中已经提到的,Cell
对象中的边距被忽略,因为HTML表格单元格中忽略了CSS边距。 iText 7 CellRenderer
代码已根据pdfHTML附加组件进行了更改:
@Override
protected Rectangle applyMargins(Rectangle rect, float[] margins, boolean reverse) {
// Do nothing here. Margins shouldn't be processed on cells.
return rect;
}
当然,如果您想获得原始行为,可以覆盖CellRenderer
。这就是我在CellMarginPadding2示例中所做的:
private class MarginCellRenderer extends CellRenderer {
public MarginCellRenderer(Cell modelElement) {
super(modelElement);
}
@Override
protected Rectangle applyMargins(Rectangle rect, float[] margins, boolean reverse) {
return rect.<Rectangle>applyMargins(margins[0], margins[1], margins[2], margins[3], reverse);
}
}
private class MarginCell extends Cell {
public MarginCell() {
super();
}
public MarginCell(int rowspan, int colspan) {
super(rowspan, colspan);
}
@Override
protected IRenderer makeNewRenderer() {
return new MarginCellRenderer(this);
}
}
public static void main(String args[]) throws IOException {
File file = new File(DEST);
file.getParentFile().mkdirs();
new C05E05_CellMarginPadding2().createPdf(DEST);
}
public void createPdf(String dest) throws IOException {
//Initialize PDF document
PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
// Initialize document
Document document = new Document(pdf);
Table table = new Table(UnitValue.createPercentArray(new float[]{2, 1, 1}));
table.setBackgroundColor(Color.ORANGE);
table.setWidthPercent(80);
table.setHorizontalAlignment(HorizontalAlignment.CENTER);
table.addCell(
new MarginCell(1, 3).add("Cell with colspan 3")
.setPadding(10).setMargin(5).setBackgroundColor(Color.GREEN));
table.addCell(new MarginCell(2, 1).add("Cell with rowspan 2")
.setMarginTop(5).setMarginBottom(5).setPaddingLeft(30)
.setFontColor(Color.WHITE).setBackgroundColor(Color.BLUE));
table.addCell(new MarginCell().add("row 1; cell 1")
.setFontColor(Color.WHITE).setBackgroundColor(Color.RED));
table.addCell(new MarginCell().add("row 1; cell 2"));
table.addCell(new MarginCell().add("row 2; cell 1").setMargin(10)
.setFontColor(Color.WHITE).setBackgroundColor(Color.RED));
table.addCell(new MarginCell().add("row 2; cell 2").setPadding(10)
.setFontColor(Color.WHITE).setBackgroundColor(Color.RED));
document.add(table);
document.close();
}
我创建了一个MarginCell
类,使用MarginCellRenderer
呈现单元格。在该渲染器中,我覆盖了applyMargins()
方法,因此不再忽略边距。
这可以解决您的问题。对教程第5章的更改将尽快应用(取决于有多少人需要我在Stack Overflow上的时间:D)。
答案 1 :(得分:0)
iText网站上有这方面的教程。
protected void manipulatePdf(String dest) throws Exception {
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest));
Document doc = new Document(pdfDoc);
PdfCanvas cb = new PdfCanvas(pdfDoc.addNewPage());
cb.moveTo(36, 842);
cb.lineTo(36, 0);
cb.stroke();
Table table = new Table(8);
table.setHorizontalAlignment(HorizontalAlignment.LEFT);
table.setWidth(150);
for (int aw = 0; aw < 16; aw++) {
table.addCell(new Cell().add(new Paragraph("hi")));
}
table.setMarginLeft(25);
doc.add(table);
doc.close();
}