繁体   English   中英

在表格上方添加图像 - Itext

[英]Add image above table - Itext

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

我使用的是 5.5.10 版本

实现 'com.itextpdf:itextg:5.5.10'

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

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

在此处输入图片说明

它始终位于列的行下方。 要添加图像,我这样做:

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

其原因是添加到DocumentImage添加到常规文本和表格下方的虚拟层中。 显然,iText 开发人员假定默认情况下文本和表格元素将绘制在图像前面。

但是您可以显式地将Image添加到不同的虚拟层,该层又高于文本和表格的虚拟层,在addImg您只需要替换

document.add(image);

经过

pdfWriter.getDirectContent().addImage(image);

addImg中的image设置了AbsolutePosition 这对于要添加到DirectContent图像实际上是必需的,因为DirectContent不知道当前的插入位置或页面尺寸。

DirectContentUnder说一句,还有一个DirectContentUnder用于甚至在通过Document添加的Images层下方的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM