java - 在表格上方添加图像 - Itext

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

最佳答案

造成这种情况的原因是,添加到文档中的图像被添加到常规文本和表格下方的虚拟层中。显然,iText 开发人员认为默认情况下文本和表格元素将绘制在图像前面。

但是您可以显式地将Image添加到不同的虚拟层,该虚拟层依次位于文本和表格之上,在addImg中您只需替换

document.add(image);

pdfWriter.getDirectContent().addImage(image);

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

顺便说一句,还有一个DirectContentUnder,用于放置甚至位于通过文档添加的图像层之下的内容。

关于java - 在表格上方添加图像 - Itext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53095527/

相关文章:

java - 没有 XML 的 Spring AOP

android - 在屏幕上指向图片的相对位置

java - 将非 Activity 类中的回调方法结果传递给android Activity 类?

android - 如何保护/检测 Android 设备上的数据库还原?

html - 是否可以为 DIV 设置 "Minimum Distance from Left"值?

css - 带有可变高度双模块侧边栏的固定页眉和页脚

java - Qt:如何突出显示 QListWidget 中的重复项目? (qtjambi)

java - 使用@POST 检索数据有多糟糕?

html - CSS 图像定位,类似于背景位置

java - Google map api 不显示我当前的位置