当前位置: 首页 > 面试题库 >

如何使用虚线作为单元格边框?

阎庆
2023-03-14
问题内容

我正在尝试通过使用iText 2.1.0在表的中间获取虚线边框(使用的单元格边框)。下面的代码即使在表格中间也会生成虚线边框。

您能帮我 单独添加特定单元的事件 吗?

import java.io.FileOutputStream;

import com.lowagie.text.Cell;
import com.lowagie.text.Document;
import com.lowagie.text.PageSize;
import com.lowagie.text.Phrase;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfPCellEvent;
import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfWriter;

public class DottedLine {

    public static final String RESULT = "Dotted.pdf";

    public static void main(String[] args) throws Exception {
        new DottedLine().createPdf(RESULT);
    }

    public void createPdf(String filename) throws Exception {

        Document document = new Document(PageSize.A4, 50, 50, 50, 50);

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

        document.open();

        PdfPTable tab = new PdfPTable(1);
        for (int j = 1; j <= 10; j++) {
            if (j == 5) {
                PdfPCell c1 = new PdfPCell(new Phrase("Test" + j));
                c1.setBorder(Rectangle.TOP);
                c1.setCellEvent(new dot());
                tab.addCell(c1);
            } else {
                PdfPCell c2 = new PdfPCell(new Phrase("Test " + j));
                c2.setBorder(Rectangle.TOP);
                tab.addCell(c2);
            }
        }

        document.add(tab);
        document.close();
    }

    // Cell Event to make dotted Line
    class dot implements PdfPCellEvent {

        @Override
        public void cellLayout(PdfPCell arg0, Rectangle arg1, PdfContentByte[] arg2) {
            arg0.setBorder(Rectangle.TOP);
            PdfContentByte cb = arg2[PdfPTable.LINECANVAS];
            cb.setLineDash(3f, 3f);
            cb.restoreState();
        }
    }
}

问题答案:

您正在使用单元事件,但是您的代码非常糟糕。您还将引入PDF语法错误,如果仅使用iText的较新版本,将会收到警告。(关于iText版本过时的警告是有原因的。人们不应该忽略它们!!!)

话虽如此,我已经提出了解决您的问题的示例:DottedLineCell

生成的PDF是包含两个表的文档:dotted_line_cell.pdf

对于第一个表,我们使用一个表事件:

class DottedCells implements PdfPTableEvent {
    @Override
    public void tableLayout(PdfPTable table, float[][] widths,
        float[] heights, int headerRows, int rowStart,
        PdfContentByte[] canvases) {
        PdfContentByte canvas = canvases[PdfPTable.LINECANVAS];
        canvas.setLineDash(3f, 3f);
        float llx = widths[0][0];
        float urx = widths[0][widths[0].length -1];
        for (int i = 0; i < heights.length; i++) {
            canvas.moveTo(llx, heights[i]);
            canvas.lineTo(urx, heights[i]);
        }
        for (int i = 0; i < widths.length; i++) {
            for (int j = 0; j < widths[i].length; j++) {
                canvas.moveTo(widths[i][j], heights[i]);
                canvas.lineTo(widths[i][j], heights[i+1]);
            }
        }
        canvas.stroke();
    }
}

这是绘制单元格边框的最优雅的方法,因为它对stroke()所有线条仅使用一个运算符。如果您的表具有行跨度,则这不是一个选择(但是您可能不关心行跨度,因为您使用的iText版本过时,不支持行跨度)。

第二个表使用单元事件:

class DottedCell implements PdfPCellEvent {
    @Override
    public void cellLayout(PdfPCell cell, Rectangle position,
        PdfContentByte[] canvases) {
        PdfContentByte canvas = canvases[PdfPTable.LINECANVAS];
        canvas.setLineDash(3f, 3f);
        canvas.rectangle(position.getLeft(), position.getBottom(),
            position.getWidth(), position.getHeight());
        canvas.stroke();
    }
}

发生单元事件时,将在每个单元周围绘制边框。这意味着您将有多个stroke()运算符和重叠的行。

我可以再恳求您升级到最新版本吗?iText 5之前的版本存在一个特殊错误,该错误导致表行在十亿行中消失一次。



 类似资料:
  • border(int $borderStyle): \Vtiful\Kernel\Format 示例 $config = [ 'path' => './tests' ]; ​ $fileObject = new \Vtiful\Kernel\Excel($config); ​ $fileObject = $fileObject->fileName('tutorial.xlsx'); $f

  • 但是我喜欢在给定的图像中创建边框 下面是我当前单元格的xml文件的代码

  • 我需要设计像下面这样的带有nslayoutconstraints的自定义单元格,通过编程使用可视化格式语言以及带有项目的约束。任何帮助都将不胜感激。 `/*初始化并分配产品名称*/Product Name =[[ui label alloc]init];product name . font =[ui font font with name:@ " HelveticaNeue " size:17.

  • 对于某些表格单元格,我希望有一个多色的上边框或下边框。 基于如何创建多色边框与css和css-多色边框,我能够创建多色边框。 问题是,我想将其组合为一个表格单元格,其中一些单元格具有普通边框,而另一些单元格具有多色边框。 下面的代码设置单元格的多色,但只要我想为“普通”单元格添加黑色边框,它就会覆盖多色边框(请参见代码笔) 这似乎使它部分起作用,必须为表格设置背景颜色。但这会导致粗边框线。 能做些

  • 我想删除Vaadin 8网格中所有单元格周围的边框。我不相信这可以用代码来做,并且表格的css不适用于网格,因此你如何为网格执行此操作?

  • 问题内容: 即使单元格为空,我应该使用哪种CSS来显示单元格的边框? 专门针对IE 7。 问题答案: 如果我还记得的话,除非在某些IE中存在该单元格,否则它不存在… 如果您可以放置​​一个(不间断的空格)来填补空白,那通常会起作用。还是您需要纯CSS解决方案? 显然,IE8默认显示单元格,您必须使用隐藏它,但是它在IE7中根本不起作用(默认情况下是隐藏的)。