在表格上方添加图片-itext

时间:2018-11-01 05:16:37

标签: java android position itext itext7

如何使用Itext在表上添加图像?

我正在使用5.5.10版本

实现'com.itextpdf:itextg:5.5.10'

编辑:图像不能在行/列内,必须独立于屏幕上的任何位置

我正在尝试在表的列上添加图像,但是结果是这样的:

enter image description here

它始终位于列的行下方。 要添加我正在执行的图像:

public void addImg (int dwb, float x, float y, float desc) {
    try{
        Bitmap bitmap = dwbToBitmap(context, dwb);
        ByteArrayOutputStream stream3 = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream3);

        Image image = Image.getInstance(stream3.toByteArray());
        stream3.close();
        image.scaleToFit(sizeImgFit, sizeImgFit);
        image.setAbsolutePosition(35.6f + 10f + x, height-y-sizeImg-(height-desc));

        document.add(image);

    }catch (Exception e){
        log("addImg", e);
    }
}

我已经尝试过更改顺序,创建第一个表格,然后添加图像,反之亦然,但这不起作用。

有人知道如何将图像放在最上方的Z位置吗?

我这样创建表:

public void createTable(ArrayList<String> header, ArrayList<String[]> clients){
    float height = 569/header.size();
    sizeImg = height;
    sizeImgFit = sizeImg - 2;
    PdfPTable pdfPTable = new PdfPTable(header.size());
    pdfPTable.setWidthPercentage(100);

    PdfPCell pdfPCell;

    int indexC = 0;

    while(indexC < header.size()){
        pdfPCell = new PdfPCell(new Phrase(header.get(indexC++), fHeaderText));
        pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);
        pdfPCell.setBackgroundColor(BaseColor.GRAY);
        pdfPTable.addCell(pdfPCell);

    }

    int i = 0;
    for(String[] row : clients){
        int p = 0;
        for(String linha : row){
            pdfPCell = new PdfPCell(new Phrase(linha, fText));
            pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);
            pdfPCell.setVerticalAlignment(Element.ALIGN_CENTER);
            pdfPCell.setFixedHeight(height);

            pdfPTable.addCell(pdfPCell);
            log("linha - coluna", i + " - " + p);
            p++;
        }
        i++;
    }

    //paragraph.add(pdfPTable);

    try {
        document.add(pdfPTable);

    }catch (Exception e){
        log("paragraph", e);
    }
}

上面提到的这些方法在一个类中:

public class TemplatePDF {
    private Context context;
    private File pdfFile;
    private Document document;
    public PdfWriter pdfWriter;
    private Paragraph paragraph;
    private Rotate event;
    private Font fTitle = new Font(Font.FontFamily.TIMES_ROMAN, 20, Font.BOLD);
    private Font fSubTitle = new Font(Font.FontFamily.TIMES_ROMAN, 18, Font.BOLD);
    private Font fHeaderText = new Font(Font.FontFamily.TIMES_ROMAN, 3, Font.NORMAL, BaseColor.WHITE);
    private Font fText = new Font(Font.FontFamily.TIMES_ROMAN, 3);
    private Font fHText = new Font(Font.FontFamily.TIMES_ROMAN, 8);
    private Font fHighText = new Font(Font.FontFamily.TIMES_ROMAN, 15, Font.BOLD, BaseColor.RED);
    private float width = PageSize.A4.getWidth();
    private float height = PageSize.A4.getHeight();
    public float sizeImg;
    public float sizeImgFit;

    public TemplatePDF(Context context){
        this.context = context;
    }

    public void openDocument(){
        createFile();

        try{
            document = new Document(PageSize.A4);
            pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(pdfFile));
            event = new Rotate();
            document.open();

        }catch (Exception e){
            Log.e("erro", e.toString());
        }
    }

    private void createFile(){
        File folder = new File(Environment.getExternalStorageDirectory().toString(), "PDF");

        if(!folder.exists()){
            folder.mkdirs();
        }

        pdfFile = new File(folder,  key() + ".pdf");
    }

    public void closeDocument(){
        document.close();
    }

    ...

}

要创建PDF,请这样做:

        //Creating the object
        TemplatePDF templatePDF = new TemplatePDF(ficha_pre.this);
        templatePDF.openDocument();
        templatePDF.addMetaData("Relatório", "Situs", "Woton Sampaio");
        templatePDF.addTitles("Relatório", "","Data: " + getDate());

        //Creating the table
        ArrayList<String> header = new ArrayList<>();
        for(int i = 0; i < 55; i++){
            header.add(forString(i));
        }

        ArrayList<pdfItens> itens = arrayItens();
        ArrayList<String[]> files = array();

        templatePDF.createHeaderFicha(itens);
        templatePDF.createTable(header, files);

        //Adding image
        templatePDF.addImg(R.drawable.ic_a, 0, 20, 566);

1 个答案:

答案 0 :(得分:1)

这是因为添加到Image的{​​{1}}被添加到常规文本和表格下面的虚拟层中。显然,iText开发人员假定默认情况下,文本和表格元素应绘制在图像前面。

但是您可以将Document显式添加到另一个虚拟层,该层又位于文本和表格的虚拟层之上,在Image中,您只需要替换

addImg

作者

document.add(image);

您在pdfWriter.getDirectContent().addImage(image); 中的image设置了addImg。实际上,这对于要添加到AbsolutePosition的图像来说是必需的,因为DirectContent不了解当前的插入位置或页面尺寸。

顺便说一句,还有一个DirectContent用于填充甚至通过DirectContentUnder添加的Images层之下的内容。