Создайте прямоугольник, добавьте в него абзац и отрегулируйте высоту прямоугольника в соответствии с текстом с помощью iText. - PullRequest
6 голосов
/ 08 мая 2020

Я могу создать прямоугольник и добавить в него абзац и изображение. Ширина прямоугольника тоже хороша, но я просто хочу установить высоту прямоугольника в соответствии с текстом в абзаце. Также я хотел добавить данные внутри прямоугольника определенным образом, поэтому я создал внутри него таблицу. Итак, как сделать так, чтобы таблица заполняла весь прямоугольник. Может ли кто-нибудь помочь мне с этим?

        PdfContentByte cb = writer.getDirectContent();

        Rectangle rect = new Rectangle(kBorderInset, document.getPageSize().getHeight()-kPageDisclaimerY,
                document.getPageSize().getWidth()-2 * kBorderInset,700f);
        cb.rectangle(rect);
        cb.stroke();

        rect.setBorder(Rectangle.BOX);
        rect.setBorderWidth(1);
        rect.setBorderColor(BaseColor.BLACK);
        cb.rectangle(rect);

        ColumnText ct = new ColumnText(cb);
        ct.setSimpleColumn(rect);
        ct.addElement(createTable1(auditBundle, context));
        ct.go();

Создать код таблицы

       private static PdfPTable createTable1(AuditBundle auditBundle, Context context) throws 
       DocumentException {
           PdfPTable table = new PdfPTable(3);
           table.setWidthPercentage(100);
           table.getDefaultCell().setUseAscender(true);
           table.getDefaultCell().setUseDescender(true);
           table.getDefaultCell().setFixedHeight(112f);
           table.setWidths(new int[]{1, 2, 1});

    float fntSize, lineSpacing;
    fntSize = 20f;
    lineSpacing = 12f;
    Paragraph paragraph = new Paragraph();
    paragraph.add(new Phrase(lineSpacing,auditBundle.getAudit().auditName,
            FontFactory.getFont(FontFactory.HELVETICA, fntSize)));
    paragraph.setAlignment(Element.ALIGN_LEFT | Element.ALIGN_CENTER);
    paragraph.setPaddingTop(30);
    PdfPCell cell = new PdfPCell();
    cell.addElement(paragraph);
    cell.setBackgroundColor(BaseColor.LIGHT_GRAY);
    cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
    table.addCell("");
    table.addCell(cell);

    Drawable d = context.getDrawable(R.drawable.ic_action_device_access_camera); // the drawable (Captain Obvious, to the rescue!!!)
    assert d != null;
    Bitmap bitmap = ((BitmapDrawable)d).getBitmap();
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
    byte[] bitmapdata = stream.toByteArray();

    PdfPCell cellImg = new PdfPCell();
    try {
        Image image = Image.getInstance(bitmapdata);
        image.setAlignment(Element.ALIGN_CENTER);
        cellImg.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cellImg.addElement(image);
        cellImg.setBackgroundColor(BaseColor.WHITE);
    } catch (IOException e) {
        e.printStackTrace();
    }
    table.addCell(cellImg);
    return table;
}

В настоящее время это выглядит так: enter image description here

1 Ответ

3 голосов
/ 15 мая 2020

Если ваш контент находится в таблице и вы хотите нарисовать вокруг него прямоугольник, наиболее простой способ - использовать границу таблицы. Это избавляет от необходимости рисовать дополнительный прямоугольник.

Если требуется рисование прямоугольника отдельно, вы можете просто добавить содержимое и получить результирующее положение по вертикали (writer.getVerticalPosition(false)). Затем нарисуйте прямоугольник на основе вертикального положения до и после добавления содержимого.

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

Прежде всего, в PDF координаты увеличиваются слева направо и от снизу вверх . Конструктор Rectangle, который вы используете, - Rectangle(final float lowerleftx, final float lowerlefty, final float upperrightx, final float upperrighty). Таким образом, lowerlefty должно быть меньше, чем upperrighty. Вы также можете проигнорировать это, определить Rectangle «вверх ногами» и вызвать Rectangle.normalize().

Чтобы определить вертикальное пространство, необходимое для рендеринга контента, вы можете запустить ColumnText в режиме моделирования. Он будет выполнять всю логику рендеринга c без фактической записи содержимого в документ PDF. Затем вы можете использовать информацию из этого прогона моделирования для настройки фактического рендеринга на втором этапе.

PdfContentByte cb = writer.getDirectContent();

// the initial rectangle defines the max size of the content
Rectangle rect = new Rectangle(10, document.getPageSize().getBottom() + 50,
        document.getPageSize().getWidth() - 2 * 10, document.getPageSize().getTop() - 50);

// flip the rectangle if top and bottom were switched
rect.normalize();

ColumnText ct = new ColumnText(cb);
ct.setSimpleColumn(rect);
ct.addElement(createTable1(auditBundle, context));

// do a simulation run
int result = ct.go(true);

// assume the content fits in the initial rectangle
if (result == ColumnText.NO_MORE_TEXT) {

    // the bottom of the simulated content
    float verticalpos = ct.getYLine();

    // redefine the rectangle based on the simulation
    rect = new Rectangle(10, verticalpos, document.getPageSize().getWidth() - 2 * 10,
            document.getPageSize().getTop() - 50);
    ct.setSimpleColumn(rect);

    // the original content was consumed in the simulation, so add it again
    ct.addElement(createTable1(auditBundle, context));

    // render again
    ct.go(false);

    // draw the rectangle
    rect.setBorder(Rectangle.BOX);
    rect.setBorderWidth(1);
    rect.setBorderColor(BaseColor.RED);
    cb.rectangle(rect);

}

Дальнейшие изменения исходного кода:

  • Удалена фиксированная высота ячейки таблицы, поэтому рост и сжатие прямоугольника можно продемонстрировать более четко: удалено table.getDefaultCell().setFixedHeight(112f)
  • Удалена граница таблицы и изменен цвет прямоугольника на красный, чтобы прямоугольник отображался более четко.

Результат с коротким текстом: Result with short text

Результат с длинным текстом: Result with long text

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