Itext 5 Строки таблицы разбиваются на новую страницу и повторяются - PullRequest
1 голос
/ 28 января 2020

Я впервые использую Itext 5 и я новичок в разработке приложений. Я создаю таблицу, которая продолжает разбивать столбцы на новые строки на новой странице и будет повторять данные.

Первая таблица: The first Table Вторая таблица с разделенными столбцами и повторяющиеся данные: The second table with split columns and repeating data

Третья таблица: Third table

Четвертая таблица: The fourth table

Пятая таблица: The fifth Table

Таблица должна состоять из одной длинной строки. Пожалуйста, помогите мне исправить это,

Вот код:

    private void createPdf() throws FileNotFoundException, DocumentException,IOException {
       // getIntent().setType("application/pdf");
        Toast.makeText(this,"GENERATING PDF ..."+ directory_path,Toast.LENGTH_LONG).show();
        File file = new File(directory_path+filename);
        if (!file.exists())
        {
            file.mkdirs();
        }
        ProductCondition prodCond = new ProductCondition(true,"GREEN","BFobrourinbiurfufbjfnbbu");
        ProductOperations prodOper = new ProductOperations(true,true,true,1000,986,500,"OBNobdfiuvdob");
        Product product = new Product("bkbukb","sfdvsf","sdfsdfs","1sfdssV45",prodCond,prodOper);
        technicians.addProduct(product);
        Document document = new Document(PageSize.A1.rotate());
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(directory_path+filename));
        document.open();
        PdfPTable table = new PdfPTable(15);
        table.setTotalWidth(5000);
        table.setWidthPercentage(100);
        List<String> listData =new ArrayList<>() ;
        listData = GetTechnicianData(technicians);
        Image image1 = GetImage();
        Image image2 = GetImage();
        table.addCell("Bloop");
        table.addCell("han Solo");
        table.addCell("Hamburger");
        table.addCell("NUmber time");
        table.addCell("boogaloo");
        table.addCell("Boo thang");
        table.addCell("Spanish");
        table.addCell("Inquisition");
        table.addCell("Never ");
        table.addCell("Death");
        table.addCell("Test ");
       // table.addCell("Button");
        table.addCell("Lights");
        table.addCell("Sunshine");
        table.addCell("Comment");
        table.addCell("Images");
        table.setHeaderRows(3);
        table.setFooterRows(1);
        table.getDefaultCell().setBackgroundColor(GrayColor.GRAYWHITE);
        PdfPCell cell;
        Toast.makeText(this,"ADDING PRELIMINARY DATA",Toast.LENGTH_LONG).show();
            for (int c = 0; c < 14; c++) {
                cell = new PdfPCell();
                cell.setFixedHeight(50);
                cell.addElement(new Paragraph(listData.get(c)));
                cell.setHorizontalAlignment(Element.ALIGN_CENTER);
                //cell.setBorder(PdfPCell.NO_BORDER);
                table.addCell(cell);
                table.setKeepTogether(true);
            }
        Paragraph p = new Paragraph();
        p.add(new Chunk(image1,0,0,true));
        p.add(new Chunk(image2,0,0,true));
        cell = new PdfPCell();
        cell.addElement(p);
        //cell.setBorder(PdfPCell.NO_BORDER);
        table.addCell(cell);
        //document.add(table);
        Toast.makeText(this,"ADDING IMAGES...",Toast.LENGTH_LONG).show();

          /*  cell = new PdfPCell();
            Paragraph p = new Paragraph();
            p.add(new Chunk(image1,0,0,true));
            p.add(new Chunk(image1,0,0,true));
            cell.addElement(p);
            table.addCell(cell);*/

       // document.add(table);


        PdfContentByte canvas = writer.getDirectContent();
        PdfTemplate tableTemplate = canvas.createTemplate(5000, 2600);
        table.writeSelectedRows(0, -1, 0, 800, tableTemplate);
        PdfTemplate clip;
        for (int j = 0; j <5000; j += 1000) {
            table.setKeepTogether(true);
            document.newPage();
            for (int i = 2600; i > 0; i -= 1300) {

                clip = canvas.createTemplate(2000, 1300);
                clip.addTemplate(tableTemplate, -j, 1750 - i);
                canvas.addTemplate(clip, 50, 312);
                table.setKeepTogether(true);
                //canvas.addImage(image1);
            }
        }
        // byte [] pdf = Files.readAllBytes(file.toPath());
        Uri filepdf = Uri.fromFile(new File(directory_path+filename));
        UploadTask uploadTask = storageReference.child(technicians.getEmailAddress()).child("PDFUpdate").putFile(filepdf);
        Toast.makeText(this,"PDF Generated Successfully",Toast.LENGTH_LONG).show();
        document.close();

       /* PackageManager packageManager = context.getPackageManager();
        Intent testIntent = new Intent(Intent.ACTION_VIEW);
        testIntent.setType("application/pdf");
        List list = packageManager.queryIntentActivities(testIntent, PackageManager.MATCH_DEFAULT_ONLY);
        if (list.size() > 0) {
            Intent intent = new Intent();
            intent.setAction(Intent.ACTION_VIEW);
            Uri uri = Uri.fromFile(file);
            intent.setDataAndType(uri, "application/pdf");
            context.startActivity(intent);
        } else {
            Toast.makeText(context, "Download a PDF Viewer to see the generated PDF", Toast.LENGTH_SHORT).show();
        }
*/
    }
    private void createPdfWrapper() throws FileNotFoundException, DocumentException ,IOException{

        int hasWriteStoragePermission = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (hasWriteStoragePermission != PackageManager.PERMISSION_GRANTED) {

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (!ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                    showMessageOKCancel("You need to allow access to Storage",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                                        ActivityCompat.requestPermissions(CentralHome.this, new String[]{ Manifest.permission.WRITE_EXTERNAL_STORAGE},
                                                REQUEST_CODE_ASK_PERMISSIONS);
                                    }
                                }
                            });
                    return;
                }
                ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                        REQUEST_CODE_ASK_PERMISSIONS);
                return;
            }

        } else {
            createPdf();
        }
    }

    private Image GetImage() throws BadElementException,IOException{


            Drawable d = getResources().getDrawable(R.drawable.logo);
            BitmapDrawable bitDw = ((BitmapDrawable) d);
            Bitmap bmp = bitDw.getBitmap();
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
            Image image = Image.getInstance(stream.toByteArray());
            image.scalePercent(10);
            return image;
            // document.add(image);

    }

}

1 Ответ

0 голосов
/ 29 января 2020

В createPdf у вас есть все oop, которое добавляет разделы шаблона со всей таблицей на отдельные страницы:

for (int j = 0; j <5000; j += 1000) {
    table.setKeepTogether(true);
    document.newPage();
    for (int i = 2600; i > 0; i -= 1300) {
        clip = canvas.createTemplate(2000, 1300);
        clip.addTemplate(tableTemplate, -j, 1750 - i);
        canvas.addTemplate(clip, 50, 312);
        table.setKeepTogether(true);
        //canvas.addImage(image1);
    }
}

Каждый раздел имеет ширину 2000 единиц (canvas.createTemplate(2000, 1300)), но при продвижении к следующему разделу вы только go прямо на 1000 единиц (j += 1000). Таким образом, каждый новый раздел (кроме первого) повторяет последние три столбца (вторую половину) предыдущего раздела.

Эти повторения можно предотвратить, перейдя сразу на 2000 единиц после каждого раздела, т. Е. Заменив

for (int j = 0; j <5000; j += 1000)

от

for (int j = 0; j <5000; j += 2000)

Кроме того, в вашем коде есть множество других странностей, например

table.setHeaderRows(3);
table.setFooterRows(1);

(здесь вы заявляете, что у вас есть три строки заголовка и одна строка нижнего колонтитула, которые будут автоматически повторяться, если таблица добавляется в Document напрямую и разбивается на несколько страниц, поскольку вы добавляете таблицу не в Document, а вручную в шаблон, эта функциональность не используется, что удачно, так как вы создаете только достаточно ячеек, чтобы заполнить две строки, даже недостаточно для объявленных строк заголовка)

и несколько вызовов

table.setKeepTogether(true)

после уже выполнив рендеринг таблицы в

table.writeSelectedRows(0, -1, 0, 800, tableTemplate)

После рендеринга таблицы слишком поздно устанавливать свойства, управляющие процессом рендеринга ...


В коммюнике Однако вы сказали, что хотите иметь только обычную таблицу из 15 столбцов, а не таблицу, столбцы которой распределены по нескольким страницам. В таком случае, почему бы вам просто не сделать

Document document = new Document(PageSize.A1.rotate());
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(directory_path+filename));
document.open();
PdfPTable table = new PdfPTable(15);
table.setWidthPercentage(100);

... create cells and add them to the table ...

document.add(table);
document.close();

Все использование PdfContentByte, PdfTemplate и writeSelectedRows совершенно не нужно для вашего варианта использования.

...