简体   繁体   English

Itext 5 表行拆分到新页面并重复

[英]Itext 5 Table rows splitting to new page and repeating

I am using itext 5 legacy for the first time and I am new to app development.我第一次使用 itext 5 legacy 并且我是应用程序开发的新手。 I am generating a table that keeps splitting the columns into new rows on a new page and it would repeat the data.我正在生成一个表格,该表格不断将列拆分为新页面上的新行,并且会重复数据。

The first Table:第一个表: 第一个表 The second table with split columns and repeating data:带有拆分列和重复数据的第二个表: 带有拆分列和重复数据的第二个表

Third table:第三张表: 第三张表

The fourth table:第四张表: 第四张表

The fifth Table:第五表: 第五表

The table is required to be one long row.表格必须是一长排。 Please help me rectify this,请帮我纠正这个,

Here is the code:这是代码:

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

    }

}

In createPdf you have a loop that adds sections of the template with the whole table to separate pages:createPdf您有一个循环,可以将模板的各个部分与整个表格一起添加到单独的页面中:

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

Each section is 2000 units wide ( canvas.createTemplate(2000, 1300) ) but when advancing to the next section you only go right by 1000 units ( j += 1000 ).每个部分的宽度为 2000 个单位( canvas.createTemplate(2000, 1300) ),但是当进入下一个部分时,您只能向右移动 1000 个单位( j += 1000 )。 Thus, each new section (except the first one) repeats the last three columns (the second half) of the previous section.因此,每个新部分(除了第一部分)都重复上一部分的最后三列(后半部分)。

You can prevent these repetitions by going right by 2000 units after each section, ie by replacing您可以通过在每个部分之后向右移动 2000 个单位来防止这些重复,即通过替换

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

by经过

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

As an aside, there are numerous other weirdnesses in your code, eg顺便说一句,您的代码中还有许多其他奇怪的地方,例如

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

(here you declare that you have three header rows and one footer row to repeat automatically if the table is added to the Document directly and split over multiple pages; as you don't add the table to the Document but manually to a template, that functionality is not used which is fortunate as you only create enough cells to fill two rows, not even enough for the declared header rows) (在这里你声明你有三个标题行和一个页脚行,如果表格被直接添加到Document并拆分到多个页面;因为你没有将表格添加到Document而是手动添加到模板,那没有使用功能,这是幸运的,因为您只创建了足够的单元格来填充两行,甚至不足以填充声明的标题行)

and multiple calls of和多次调用

table.setKeepTogether(true)

after already having rendered the table in已经呈现表格之后

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

After rendering the table it is too late to set properties controlling the rendering process...渲染表格后,设置控制渲染过程的属性为时已晚......


In a comment you said that you only wanted to have a normal 15 column table, not one whose columns are spread across multiple pages.在评论中,您说您只想要一个普通的 15 列表,而不是一个列分布在多个页面上的表。 In that case why don't you simply do在那种情况下,你为什么不简单地做

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

All the usage of PdfContentByte , PdfTemplate , and writeSelectedRows is completely unnecessary for your use case. PdfContentBytePdfTemplatewriteSelectedRows所有用法对于您的用例writeSelectedRows都是完全没有必要的。

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

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