1

itext 7 とその ColumnDocumentRenderer を使用してドキュメントを作成しました。最後の列にテキストを強制したいと思います。「最後の列」とは、たとえば、ColumnDocumentRenderer で 3 つの列を持つように定義された単一のページがあるが、テキストの列が 1 つしかない場合でも、列 3 に強制値を含める必要があることを意味します。したがって、私がいる列番号を知り、列を強制的に分割するメカニズムが必要になると思います(解決策を前提として、他の人は高く評価しています)。StackOverflow はこれを質問の形式で求めているため、(a) これらのメカニズムは何ですか? (b) 代替アプローチとは?

質問iText を使用してテキスト挿入ポイントを次の列にスキップするにはどうすればよいですか? 明らかに同様の質問をしますが、どうやらitextの以前のリリースを使用しているようです。私が見つけることができるColumnTextはありません。

助けてくれてありがとう。

4

1 に答える 1

1

昨日は携帯電話から応答していましたが、パソコンにアクセスできるようになったので、次のColumnDocumentRendererように変更しました。

public class ColumnDocumentRenderer extends DocumentRenderer {

    protected Rectangle[] columns;
    protected int nextAreaNumber;

    public ColumnDocumentRenderer(Document document, Rectangle[] columns) {
        super(document);
        this.columns = columns;
    }

    public ColumnDocumentRenderer(Document document, boolean immediateFlush, Rectangle[] columns) {
        super(document, immediateFlush);
        this.columns = columns;
    }

    @Override
    protected LayoutArea updateCurrentArea(LayoutResult overflowResult) {
        if (overflowResult != null && overflowResult.getAreaBreak() != null && overflowResult.getAreaBreak().getType() != AreaBreakType.NEXT_AREA) {
            nextAreaNumber = 0;
        }
        if (nextAreaNumber % columns.length == 0) {
            super.updateCurrentArea(overflowResult);
        }
        return (currentArea = new LayoutArea(currentPageNumber, columns[nextAreaNumber++ % columns.length].clone()));
    }

    public int getNextAreaNumber() {
        return nextAreaNumber;
    }
}

変更は iText 7.0.1 で行われますが、このコードを独自のレンダラーで使用できます。

このレンダラーを次のように使用できます。

public void createPdf(String dest) throws IOException {
    OutputStream fos = new FileOutputStream(dest);
    PdfWriter writer = new PdfWriter(fos);
    PdfDocument pdf = new PdfDocument(writer);
    Document document = new Document(pdf);

    float offSet = 36;
    float gutter = 23;
    float columnWidth = (PageSize.A4.getWidth() - offSet * 2) / 3 - gutter * 2;
    float columnHeight = PageSize.A4.getHeight() - offSet * 2;
    Rectangle[] columns = {
        new Rectangle(offSet, offSet, columnWidth, columnHeight),
        new Rectangle(offSet + columnWidth + gutter, offSet, columnWidth, columnHeight),
        new Rectangle(offSet + 2 * (columnWidth + gutter), offSet, columnWidth, columnHeight)};
    ColumnDocumentRenderer renderer = new ColumnDocumentRenderer(document, columns);
    document.setRenderer(renderer);

    for (int i = 0; i < 50; i++) {
        document.add(new Paragraph("Hello World"));
    }
    while (renderer.getNextAreaNumber() % 3 != 0)
        document.add(new AreaBreak());
    document.add(new Paragraph("Third column"));
    document.add(new AreaBreak());
    for (int i = 0; i < 80; i++) {
        document.add(new Paragraph("Hello World"));
    }
    while (renderer.getNextAreaNumber() % 3 != 0)
        document.add(new AreaBreak());
    document.add(new Paragraph("Third column"));
    document.add(new AreaBreak());
    for (int i = 0; i < 10; i++) {
        document.add(new Paragraph("Hello World"));
    }
    while (renderer.getNextAreaNumber() % 3 != 0)
        document.add(new AreaBreak());
    document.add(new Paragraph("Third column"));
    document.close();

}

最初の列のインデックスは 0 で次の領域番号は 1、2 番目の列のインデックスは 1 で次の領域番号は 2、というように続きます。

これは、このようなページの 3 番目の列を確認して移動できることを意味します。

while (renderer.getNextAreaNumber() % 3 != 0)
    document.add(new AreaBreak());
于 2016-06-12T05:11:06.910 に答える