Стол на одной линии

Я использую itextpdf-5.5.6 в моем проекте издателя. Я хочу установить таблицу в той же строке, что абзац или фраза или текст?

Что-то вроде того:

В Моем Параграфе | МОЙ БАК ОДНОЙ КОЛОННЫ | присутствует на одной линии.

Является ли это возможным?

1 ответ

Решение

Вам не нужен стол. Что вам нужно, это общее событие тега. Посмотрите на ответ Криса Хааса на этот вопрос: как вы подчеркиваете текст с помощью пунктирной линии в ITEXT PDF

В этом ответе он описывает, как использовать событие страницы, часто называемое универсальной функциональностью тега. Вы можете найти пример Java здесь: DashedUnderline

В этом примере мы используем универсальную функциональность тега, чтобы подчеркнуть Chunk, но вместо того, чтобы рисовать пунктирную линию, вы можете легко нарисовать прямоугольник.

Вы создаете кусок, подобный этому, и устанавливаете общий тег:

Chunk chunk = new Chunk(" This chunk needs to be inside a rectangle ");
chunk.setGenericTag("");

Вы можете сделать это chunk часть Paragraph:

Paragraph p = new Paragraph("[Before]");
p.add(chunk);
p.add("[After]");

Это будет работать, только если вы объявите событие страницы следующим образом:

PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
writer.setPageEvent(new DrawRectangle());

Конечно, нам нужно реализовать DrawRectangle учебный класс;

public class DrawRectangle extends PdfPageEventHelper {

    @Override
    public void onGenericTag(PdfWriter writer, Document document, Rectangle rect, String text) {
        PdfContentByte canvas = writer.getDirectContent();
        canvas.rectangle(rect.getLeft(), rect.getBottom(), rect.getWidth(), rect.getHeight());
        canvas.stroke();
        canvas.restoreState();
    }
}

Для большего вдохновения взгляните на пример MovieYears, взятый из моей книги. Он добавляет эллипсы и видеоклипы в определенных местах: movie_years.pdf

В этом случае onGenericTag() Метод создается так:

class GenericTags extends PdfPageEventHelper {

    public void onGenericTag(PdfWriter writer, Document pdfDocument,
            Rectangle rect, String text) {
        if ("strip".equals(text))
            strip(writer.getDirectContent(), rect);
        else if ("ellipse".equals(text))
            ellipse(writer.getDirectContentUnder(), rect);
        else
            countYear(text);
    }

    public void strip(PdfContentByte content, Rectangle rect) {
        content.rectangle(rect.getLeft() - 1, rect.getBottom() - 5f,
                rect.getWidth(), rect.getHeight() + 8);
        content.rectangle(rect.getLeft(), rect.getBottom() - 2,
                rect.getWidth() - 2, rect.getHeight() + 2);
        float y1 = rect.getTop() + 0.5f;
        float y2 = rect.getBottom() - 4;
        for (float f = rect.getLeft(); f < rect.getRight() - 4; f += 5) {
            content.rectangle(f, y1, 4f, 1.5f);
            content.rectangle(f, y2, 4f, 1.5f);
        }
        content.eoFill();
    }

    public void ellipse(PdfContentByte content, Rectangle rect) {
        content.saveState();
        content.setRGBColorFill(0x00, 0x00, 0xFF);
        content.ellipse(rect.getLeft() - 3f, rect.getBottom() - 5f,
                rect.getRight() + 3f, rect.getTop() + 3f);
        content.fill();
        content.restoreState();
    }

    TreeMap<String, Integer> years = new TreeMap<String, Integer>();

    public void countYear(String text) {
        Integer count = years.get(text);
        if (count == null) {
            years.put(text, 1);
        }
        else {
            years.put(text, count + 1);
        }
    }
}

Как видите, мы проверяем значение, которое было передано setGenericTag() метод здесь. Также: мы не всегда используем метод для рисования чего-либо. В этом случае мы также используем универсальные теги для подсчета вещей.

Другие вопросы по тегам