Добавить изображение над таблицей - Itext - PullRequest
0 голосов
/ 01 ноября 2018

Как добавить изображение поверх таблицы с помощью 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 голосов
/ 06 ноября 2018

Причина этого заключается в том, что Image, добавленное к Document, добавляется в виртуальный слой под слоем обычного текста и таблиц. Очевидно, разработчики iText предположили, что элементы текста и таблицы по умолчанию должны быть нарисованы перед изображениями.

Но вы можете явно добавить Image к другому виртуальному слою, который в свою очередь выше слоя текста и таблиц, в addImg вам просто нужно заменить

document.add(image);

от

pdfWriter.getDirectContent().addImage(image);

Ваш image в addImg имеет свой набор AbsolutePosition. Это на самом деле необходимо для изображений, которые вы хотите добавить в DirectContent, поскольку DirectContent не имеет представления о текущих позициях вставки или размерах страницы.

Кроме того, есть DirectContentUnder для материала, который должен идти даже ниже слоя Images, добавляемого через Document.

...