gpt4 book ai didi

iText - 使用 ColumnText 更改列/页面的奇怪行为

转载 作者:行者123 更新时间:2023-12-04 05:07:07 29 4
gpt4 key购买 nike

我对 iText 很陌生,并试图完成以下工作:

  • 从本地高清读取文本文件列表
  • 将文件的文本排列成 2 列布局 pdf 文件
  • 在每个文本前添加一个连续编号的索引

  • 我从 MovieColumns1 示例( http://itextpdf.com/examples/iia.php?id=64 )开始,最后得到以下代码:
        final float[][] COLUMNS_COORDS = { { 36, 36, 296, 806 }, { 299, 36, 559, 806 } };

    Document document = new Document(PageSize.A4);
    PdfWriter writer = PdfWriter.getInstance(document, resultFile);
    document.open();

    ColumnText ct = new ColumnText(writer.getDirectContent());
    ct.setSimpleColumn(COLUMNS_COORDS[0][0], COLUMNS_COORDS[0][1],
    COLUMNS_COORDS[0][2], COLUMNS_COORDS[0][3]);

    File textDir = new File("c:/Users/raddatz/Desktop/123/texts/");
    File[] files = textDir.listFiles();

    int i = 1;
    int column = 0;
    for (File file : files) {
    String text = FileUtils.readFileToString(file, "UTF-8");
    float yLine = ct.getYLine();
    System.out.println("adding '" + file.getName() + "'");

    PdfPCell theText = new PdfPCell(new Phrase(text, new Font(Font.HELVETICA, 10)));
    theText.setBorder(Rectangle.NO_BORDER);
    theText.setPaddingBottom(10);
    PdfPCell runningNumber = new PdfPCell(new Phrase(new DecimalFormat("00").format(i++), new Font(
    Font.HELVETICA, 14, Font.BOLDITALIC,
    new Color(0.7f, 0.7f, 0.7f))));
    runningNumber.setBorder(Rectangle.NO_BORDER);
    runningNumber.setPaddingBottom(10);
    PdfPTable table = new PdfPTable(2);
    table.setWidths(new int[] { 12, 100 });
    table.addCell(runningNumber);
    table.addCell(theText);
    ct.addElement(table);
    int status = ct.go(true);
    if (ColumnText.hasMoreText(status)) {
    column = Math.abs(column - 1);
    if (column == 0) {
    document.newPage();
    System.out.println("inserting new page with size :" + document.getPageSize());
    }
    ct.setSimpleColumn(
    COLUMNS_COORDS[column][0], COLUMNS_COORDS[column][1],
    COLUMNS_COORDS[column][2], COLUMNS_COORDS[column][3]);
    yLine = COLUMNS_COORDS[column][3];
    System.out.println("correcting yLine to: " + yLine);
    } else {
    ct.addElement(table);
    }
    ct.setYLine(yLine);
    System.out.println("before adding: " + ct.getYLine());
    status = ct.go(false);
    System.out.println("after adding: " + ct.getYLine());
    System.out.println("--------------------------------");
    }

    document.close();

    在这里你可以看到结果:
    http://d.pr/f/NEmx

    查看生成的 PDF 的第一页,我认为一切正常。

    但在第二页你可以看到问题:
  • 文本 #31 未完全显示(第一行 + 索引被剪切/不在可见区域)
  • 文本 #46 未完全显示(前三行 + 索引被剪切/不在可见区域)

  • 在第 3 页上,一切似乎又好了。我真的迷失在这里。

    -- 更新 (2013-03-14) --

    我现在已经分析了PDF的内容。问题不在于内容显示在不可见区域,而是内容根本不存在于 pdf 中。内容的缺失部分正是适合上一列/页面的内容。所以看起来 ColumnText.go(true) 正在操纵 addElement() 之前传递的对象。有人可以证实这一点吗?如果是这样:我该怎么办?

    -- 结束更新 (2013-03-14) --

    期待您的回复

    问候,
    斯文

    最佳答案

    解决了!一旦 ColumnText 指示表不适合当前列,我就使用 ColumnText 的新实例重新初始化 ct 并再次添加表。

    换句话说:
    ColumnText 的每个实例正好处理我文档的一列。

    if (ColumnText.hasMoreText(status) || mediaPoolSwitch) {
    column = Math.abs(column - 1);
    if (mediaPoolSwitch) {
    currentMediaPool = mediapool;
    column = 0;
    }
    if (column == 0) {
    document.newPage();
    writeTitle(writer.getDirectContent(), mediapool.getName());
    }
    ct = new ColumnText(writer.getDirectContent());
    ct.addElement(table);
    ct.setSimpleColumn(
    COLUMNS_COORDS[column][0], COLUMNS_COORDS[column][1],
    COLUMNS_COORDS[column][2], COLUMNS_COORDS[column][3]);
    yLine = COLUMNS_COORDS[column][3];
    LOG.debug("correcting yLine to: " + yLine);
    } else {
    ct.addElement(table);
    }
    ct.setYLine(yLine);
    ct.go();

    关于iText - 使用 ColumnText 更改列/页面的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15387642/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com