Cell上的SetMargin无法在itext7 .NET库中运行

时间:2017-09-06 19:13:12

标签: itext itext7

我正在尝试使用C#重新创建此处的CellMarginPadding示例:

http://developers.itextpdf.com/content/itext-7-building-blocks/examples/chapter-5#2035-c05e05_cellmarginpadding.java

一切都按预期工作除了边距。在调用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库中存在错误?

2 个答案:

答案 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:

enter image description here

您是否同意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网站上有这方面的教程。

结帐https://developers.itextpdf.com/examples/tables/clone-alignment-indentation-leading-and-spacing-cells 代码示例。

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();
}