为了账号安全,请及时绑定邮箱和手机立即绑定

从 PdfPTable 列(iText)获取绝对宽度

从 PdfPTable 列(iText)获取绝对宽度

一只斗牛犬 2022-07-20 12:16:20
当用相对大小指定表列时,如何从iText获取列的绝对宽度?我试过的我指定了 3 列,它们的相对宽度为 float,如下所示:PdfPCell cell2;PdfPTable table2 =  new PdfPTable(new float[]{(float) 4.5, (float) 0.5, 9});table2.setWidthPercentage(100);我得到了什么我尝试使用table2.getAbsoluteWidths()[2]但结果是 float 0.0。我所期望的在 PDF 上动态计算表格宽度之后,我想获得每一列的绝对宽度(最大化)。
查看完整描述

1 回答

?
三国纷争

TA贡献1804条经验 获得超7个赞

问题及说明

该函数table.getAbsoluteWidths()依赖于必须设置表的totalWidthtable.getTotalWidth() > 0的要求,因此.

这是因为在com.itextpdf.text.pdf.PdfPTable类内部调用了一个方法calculateWidths(),然后计算所有列的绝对宽度:

this.absoluteWidths[k] = this.totalWidth * this.relativeWidths[k] / total;

解决方案

为了确保在检索relativeWidths数组之前设置totalWidth,您需要:

  • (A)设置totalWidth this answer中所述

  • (B) 将单元格添加到表格并将表格添加到文档

解决方案代码

以下代码结合了您的算法,以根据列的最大宽度限制跨单元格拆分文本(即长地址或alamat):

import com.itextpdf.text.*;

import com.itextpdf.text.pdf.*;


import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.Arrays;


public class TableWidthSample {


    public static void main(String[] args) {

        Document document = new Document();

        try {

            PdfWriter.getInstance(document, new FileOutputStream("TableColumnWidth.pdf"));

            document.open();


            PdfPTable table = createTableWithRelativeColumnWidths();


            // needed for calculation of getAbsoluteWidths: (A) totalWidth is set for table

            table.setTotalWidth(calculateTableWidthBasedOnPageA4(document, table));

            // now it prints width, because (A)

            printTableWidth(table, "after totalWidth set manually"); // absoluteWidths: [134.4857, 14.942857, 268.9714]


            // long text, that needs to be split among cells (fullAlamatPP)

            String text = "this is a very long text. The text contains a full address. Because the text is too long to be shown in the last cell, it is split.";

            // your CODE to fill text into cells based on restrictions

            addTextAcrossTableCells(table, text);


            document.add(table);


/*

            // need to add filled table to doc (B)

            addToDocumentCellsAndTable(document, table);

            // now it prints width, because (B)

            printTableWidth(table, "after added to doc"); // absoluteWidths: [134.4857, 14.942857, 268.9714]

*/

            document.close();

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        } catch (DocumentException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }


    private static PdfPTable createTableWithRelativeColumnWidths() {

        float[] relativeWidths = {4.5F, 0.5F, 9F};

        PdfPTable table = new PdfPTable(relativeWidths);

        table.setWidthPercentage(100F);

        printTableWidth(table, "after table created"); // absoluteWidths: [0.0, 0.0, 0.0]

        return table;

    }


    private static float calculateTableWidthBasedOnPageA4(Document document, PdfPTable table) {

        return (PageSize.A4.getWidth() - document.leftMargin() - document.rightMargin())

                * table.getWidthPercentage() / 100;

    }


    private static void addToDocumentCellsAndTable(Document document, PdfPTable table) throws DocumentException {

        // needed for calculation of getAbsoluteWidths: (B.1) add cells to table

        table.addCell("Hello");

        table.addCell("World");

        table.addCell("!");

        printTableWidth(table, "after cells added to table"); // absoluteWidths: [0.0, 0.0, 0.0]


        // needed for calculation of getAbsoluteWidths: (B.2) add table to doc

        document.add(table);

    }


    private static void addTextAcrossTableCells(PdfPTable table, String text) throws IOException, DocumentException {

        // restrictions; this is width of a column from table

        float maxColumnWidth = table.getAbsoluteWidths()[2]; // 330.12103F;

        System.out.println("use width of third column as max: " + maxColumnWidth);

        // sample font used for calculation of text-width

        Font font = new Font(BaseFont.createFont("Courier", BaseFont.CP1250, true), 12);


        // alamatSesuaiKtpPP

        String splitText[] = getTextPartsUsingFontWithMaxWidth(text, font, maxColumnWidth);

        String dottedLine = "..";

        table.addCell("Alamat / Address:");


        // p_alamat1_ct

        Phrase phrase1 = new Phrase(splitText[0], font);

        phrase1.add(dottedLine);

        PdfPCell cell1 = new PdfPCell(phrase1);

        cell1.setBackgroundColor(BaseColor.LIGHT_GRAY);

        cell1.setBorder(PdfPCell.NO_BORDER);

        table.addCell(cell1);


        // p_alamat2_ct

        Phrase phrase2 = new Phrase(splitText[1], font);

        phrase2.add(dottedLine);

        PdfPCell cell2 = new PdfPCell(phrase2);

        cell2.setBorder(PdfPCell.NO_BORDER);

        table.addCell(cell2);

    }


    private static String[] getTextPartsUsingFontWithMaxWidth(String text, Font font, float maxWidth) {

        String results[] = new String[] {"",""};

        String firstPartOfText = " ";

        float widthOfText = 0;

        for (int i = 0; i < text.length();i++) {

            firstPartOfText += text.charAt(i);

            widthOfText = font.getCalculatedBaseFont(true).getWidthPoint(firstPartOfText, font.getCalculatedSize());

            System.out.printf("%d: widthOfText: %f\n", i, widthOfText);

            if (widthOfText > maxWidth) {

                results[0] = firstPartOfText.substring(0, firstPartOfText.length() - 1);

                results[1] = text.substring(i); // second argument "text.length()" is not needed

                break;

            }

        }


        if (results[0] == "") {

            results[0] = text;

        }

        return results;

    }


    private static void printTableWidth(PdfPTable table, String labelText) {

        float[] absoluteWidths = table.getAbsoluteWidths();

        System.out.println(labelText + "> getAbsoluteWidths: " + Arrays.toString(absoluteWidths));

    }

}


查看完整回答
反对 回复 2022-07-20
  • 1 回答
  • 0 关注
  • 463 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信