iText 7.0.2 добавление таблицы фиксированного размера к тексту документа без переноса, и некоторые переходят в бесконечный цикл - PullRequest
0 голосов
/ 06 мая 2018
import java.io.FileOutputStream; 
import com.itextpdf.layout.element.List;
import com.itextpdf.io.font.FontConstants;
import com.itextpdf.kernel.color.Color;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.border.Border;
import com.itextpdf.layout.border.SolidBorder;
import com.itextpdf.layout.element.Cell;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.element.Text;
import com.itextpdf.layout.property.TextAlignment;

public static void main(String[] args)  throws Exception {
    try
    {
        PdfWriter pdfWriter = new PdfWriter("output1.pdf");
        PdfDocument pdfDocument = new PdfDocument(pdfWriter);   
        Document document = new Document(pdfDocument);
        document.setLeftMargin(30);
        document.setRightMargin(30);

        final Table myTable = new Table(new float[]
                { 30, 65, 120, 180, 100, 25 });// { 30, 65, 150, 180, 100, 25 }); works.
        setTableProperties(myTable, pdfDocument, 70, 7, "italic", Color.BLACK);
        myTable.setFixedLayout();

        final PdfFont font = getPdfFont(FontConstants.HELVETICA);
        myTable.setFont(font).setFontSize(7).setItalic().setFontColor(Color.WHITE);

        //*** Start - Added Header*****
        //BLOCK THIS TO See Issue 1 below, UNBLOCK Causes issue 2 and it hangs
        createTableHeader(myTable);
        //*** End - Added Header *****

        //*** Start Add Data ****
        equipmentTableData(myTable, "NUMITEMS", false, TextAlignment.CENTER);
        equipmentTableData(myTable, "CONDENSADORCONDENSAD", false, TextAlignment.CENTER); 

        // MATNUMBERUCACHBMPVAIRD4EFANFUC (com.itextpdf.layout.renderer.RootRenderer - Element does not fit current area)
        // MATNUMBERUCACHB-PVAIRD4EFANFUC (Works ok.. it wraps at '-')
        // MATNUMBERUCACH1MPVAIRD4EFANFUC (added '1' in middle Works ok.. 'MATNUMBERUCACH1MPVAIRD4EF' 'ANFUC')
        equipmentTableData(myTable, "MATNUMBERUCACHBMPVAIRD4EFANFUC", false, TextAlignment.CENTER);
        equipmentTableData(myTable, "MATERIALDESCRIPTIONDOPKSOPKDKJSLIOULOISOOPWOSKLISL", false, TextAlignment.CENTER);
        equipmentTableData(myTable, "DETAILS", false, TextAlignment.CENTER);
        equipmentTableData(myTable, "QTY", false, TextAlignment.CENTER);
        //*** End Add Data ****

        document.add(myTable); // Goes in infinite loop if createTableHeader is enabled above, and i can see pdf file size growing

        document.close(); 

    }
    catch (final Exception e)
    {
         System.out.println("Error " + e);
    }
}

private static Table createTableHeader(final Table myTable)
{
    Cell customCell;
    List listforPrepared;
    listforPrepared = new List().setSymbolIndent(0).setListSymbol(" ");
    listforPrepared.add("Line");
    listforPrepared.add("Item");

    customCell = new Cell(1, 1).add(listforPrepared).setBackgroundColor(Color.GRAY).setFontColor(Color.WHITE)
            .setTextAlignment(TextAlignment.CENTER);
    myTable.addHeaderCell(customCell);

    listforPrepared = new List().setSymbolIndent(0).setListSymbol(" ");
    listforPrepared.add("Tag:");
    customCell = new Cell(1, 1).add(listforPrepared).setBackgroundColor(Color.GRAY).setFontColor(Color.WHITE)
            .setTextAlignment(TextAlignment.CENTER);
    myTable.addHeaderCell(customCell);

    listforPrepared = new List().setSymbolIndent(0).setListSymbol(" ");
    listforPrepared.add("Material");
    listforPrepared.add("Number");
    customCell = new Cell(1, 1).add(listforPrepared).setBackgroundColor(Color.GRAY).setFontColor(Color.WHITE)
            .setTextAlignment(TextAlignment.CENTER);
    myTable.addHeaderCell(customCell);

    listforPrepared = new List().setSymbolIndent(0).setListSymbol(" ");
    listforPrepared.add("Description");
    customCell = new Cell(1, 1).add(listforPrepared).setBackgroundColor(Color.GRAY).setFontColor(Color.WHITE)
            .setTextAlignment(TextAlignment.CENTER);
    myTable.addHeaderCell(customCell);

    listforPrepared = new List().setSymbolIndent(0).setListSymbol(" ");
    listforPrepared.add("Detail");
    customCell = new Cell(1, 1).add(listforPrepared).setBackgroundColor(Color.GRAY).setFontColor(Color.WHITE)
            .setTextAlignment(TextAlignment.CENTER);
    myTable.addHeaderCell(customCell);

    listforPrepared = new List().setSymbolIndent(0).setListSymbol(" ");
    listforPrepared.add("QTY");
    customCell = new Cell(1, 1).add(listforPrepared).setBackgroundColor(Color.GRAY).setFontColor(Color.WHITE)
            .setTextAlignment(TextAlignment.CENTER);
    myTable.addHeaderCell(customCell);

    return myTable;

}

private static  Table equipmentTableData(final Table Table, final String data, final boolean isGrey, final TextAlignment textAligned)
{

    final PdfFont helvetica = getPdfFont(FontConstants.HELVETICA);
    final Text dataText = new Text((data)).setFont(helvetica).setFontSize(7).setItalic()
            .setFontColor(Color.BLACK); // new Font(Font.FontFamily.HELVETICA, 7, Font.ITALIC);
    final Cell cellData = new Cell(1, 1).add(new Paragraph(dataText));
    cellData.setTextAlignment(textAligned);

    if (isGrey)
    {
        cellData.setBackgroundColor(Color.LIGHT_GRAY);
    }
    else
    {
        cellData.setBackgroundColor(Color.WHITE);
    }
    cellData.setPadding(0f);
    Table.addCell(cellData);
    return Table;
}

public static void setTableProperties(Table tblName, PdfDocument pdf, int widthSize, int fontSize, String fontStyle, Color fontColor)
{

    tblName.setWidth(pdf.getDefaultPageSize().getWidth() - widthSize); /* Set Width of a Table */
    tblName.setFontColor(fontColor); /* Set Font Color */

    if (fontStyle.toLowerCase() == "italic")
        tblName.setFontSize(fontSize).setItalic();
    else if (fontStyle.toLowerCase() == "bold")
        tblName.setFontSize(fontSize).setBold();
    else if (fontStyle.toLowerCase() == "bold-italic")
        tblName.setFontSize(fontSize).setBold().setItalic();
}

public static PdfFont getPdfFont(final String font)
{
    try
    {
        return PdfFontFactory.createFont(font);
    }
    catch (final Exception e)
    {
        System.out.println("Error " + e);
    }
    return null;
}
  1. Почему слово переносится в ячейку только в определенных случаях, как мне исправить это, чтобы оно работало (Переносить текст в столбце) независимо от текста.

    • MATNUMBERUCACHBMPVAIRD4EFANFUC (com.itextpdf.layout.renderer.RootRenderer - элемент не подходит текущая область) Почему это так, не работает текст не отображается в PDF (а также создает проблему ниже ..)
    • MATNUMBERUCACHB-PVAIRD4EFANFUC (Работает нормально .. оборачивается на '-')
    • MATNUMBERUCACH1MPVAIRD4EFANFUC (добавлено '1' в середине Работает нормально, разбивается на 2 как 'MATNUMBERUCACH1MPVAIRD4EF' 'ANFUC')
  2. Другая проблема, в коде, если я вызываю метод «createTableHeader», то в «document.add (myTable)» не возвращается и идет информация бесконечного цикла, и файл продолжает расти, ошибок нет, исключение не выдается конечно, если есть способ справиться с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...