【问题标题】:Having three columns layout in PDF using itext7使用 itext7 在 PDF 中进行三列布局
【发布时间】:2016-12-28 03:34:01
【问题描述】:

我是 itext7 的新手。
我看到了一个关于 columndocumentrenderer 的例子。代码如下。

package com.itextpdf.highlevel.chapter02;

import com.itextpdf.io.font.FontConstants;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.ColumnDocumentRenderer;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.AreaBreak;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.hyphenation.HyphenationConfig;
import com.itextpdf.layout.property.AreaBreakType;
import com.itextpdf.layout.property.TextAlignment;
import com.itextpdf.test.annotations.WrapToTest;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

/**
 *
 * @author RNDPC-03
 */@WrapToTest
 public class C02E08_JekyllHydeV4 {


     public static final String SRC = "src/main/resources/txt/jekyll_hyde.txt";
     public static final String DEST = "results/chapter02/jekyll_hyde_v4.pdf";

     public static void main(String args[]) throws IOException {
         File file = new File(DEST);
         file.getParentFile().mkdirs();
         new C02E08_JekyllHydeV4().createPdf(DEST);
     }

     public void createPdf(String dest) throws IOException {
         //Initialize PDF document
         PdfDocument pdf = new PdfDocument(new PdfWriter(dest));

         // Initialize document
         Document document = new Document(pdf);

         //Set column parameters
         float offSet = 36;
         float gutter = 23;
         float columnWidth = (PageSize.A4.getWidth() - offSet * 2) / 2 - gutter;
         float columnHeight = PageSize.A4.getHeight() - offSet * 2;

         //Define column areas
         Rectangle[] columns = {
             new Rectangle(offSet, offSet, columnWidth, columnHeight),
             new Rectangle(offSet + columnWidth + gutter, offSet, columnWidth, columnHeight)};
         document.setRenderer(new ColumnDocumentRenderer(document, columns));    

         PdfFont font = PdfFontFactory.createFont(FontConstants.TIMES_ROMAN);
         PdfFont bold = PdfFontFactory.createFont(FontConstants.HELVETICA_BOLD);
         document.setTextAlignment(TextAlignment.JUSTIFIED)
             .setFont(font)
             .setHyphenation(new HyphenationConfig("en", "uk", 3, 3));

         BufferedReader br = new BufferedReader(new FileReader(SRC));
         String line;
         Paragraph p;
         boolean title = true;
         AreaBreak nextArea = new AreaBreak(AreaBreakType.NEXT_AREA);
         while ((line = br.readLine()) != null) {
             p = new Paragraph(line);
             if (title) {
                 p.setFont(bold).setFontSize(12);
                 title = false;
             }
             else {
                 p.setFirstLineIndent(36);
             }
             if (line.isEmpty()) {
                 document.add(nextArea);
                 title = true;
             }
             document.add(p);
         }

         //Close document
         document.close();
     }
} 

现在 this 将得到 this 的结果。下图

现在我想把它变成一个三 (3) 列。这个怎么做?请任何人?或者只是指导我。谢谢!

【问题讨论】:

  • 亲爱的投反对票的人,你介意告诉你为什么投反对票吗?谢谢。
  • 我不知道他们为什么投了反对票,但我也不知道为什么我的回答也没有被接受......

标签: java itext


【解决方案1】:

这里是你定义两列的地方:

float offSet = 36;
float gutter = 23;
float columnWidth = (PageSize.A4.getWidth() - offSet * 2) / 2 - gutter;
float columnHeight = PageSize.A4.getHeight() - offSet * 2;

//Define column areas
Rectangle[] columns = {
    new Rectangle(offSet, offSet, columnWidth, columnHeight),
    new Rectangle(offSet + columnWidth + gutter, offSet, columnWidth, columnHeight)};

将其更改为三列很容易。

只需将以上所有内容替换为以下内容:

Rectangle[] columns = {
    new Rectangle(20, 20, 180, 802),
    new Rectangle(207, 15, 180, 802),
    new Rectangle(394, 15, 180, 802) };

现在columns 有三个Rectangle 元素,将绘制三列。如果三列没有所需的大小,请随意调整Rectangle 构造函数中xywidthheight 的值。

【讨论】:

  • 您好布鲁诺爵士,谢谢您运行良好,现在我的问题是此代码仅限于 txt 文件吗?我尝试使用 pdf 并且输出不好。你知道如何?我的文件是pdf而不是文本格式
  • 如果您的原始文档格式是 PDF,那么您应该很明显这个答案中给出的代码不起作用。您的评论是一个全新的问题,与您的原始问题完全无关,因此您应该将其作为新问题发布。请注意,PDF 不是文字处理格式。 一页就是一页。您不能期望 PDF 的内容表现为文本。页面上的所有内容都添加在绝对位置,不一定按照您期望的顺序。
猜你喜欢
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
  • 2014-08-25
  • 2011-07-24
  • 1970-01-01
  • 2023-02-01
相关资源
最近更新 更多