【问题标题】:Determine the number of lines in a PDF page确定 PDF 页面中的行数
【发布时间】:2015-05-25 16:20:58
【问题描述】:

如何在 Java 中确定 Apache PDFBox 中页面中的行数?

我需要将每个页面分成三个不同的页面,以便对每个部分进行一些统计。然后,我需要确定页面有多少行。之后,我需要遍历每一行并在新页面中写入尽可能多的行。

我想知道是否可以使用PDFBox。 (我对这个库完全陌生,需要快速弄清楚)

【问题讨论】:

  • 您的问题有点令人困惑-您只需要知道页面上的文本行数(使用 PDFTextStripper 非常简单),还是您还询问如何将页面分成三页?最后会很困难。 PDF 中的行不能按顺序排列,而且通常不是。 PDF 不是 HTML。
  • “线条”是什么意思?文本行还是矢量元素?
  • 我的意思是文本行。在这一点上,我不想让它变得复杂。我只需要将一个页面分成三个不同的页面。例如,如果我有一个包含 3 页的文档,我需要创建一个包含 9 页的新文档(包含准确的文本)。这可行吗?
  • 要计算行数,请参阅 Luis 的答案。 (设置起始页和结束页)。然而,将页面一分为三几乎是不可能的。 PDF 甚至没有文本行的概念。大多数 PDF 一次输出几个字符或单词,而且通常不是您在屏幕上看到的顺序。您必须分析内容流,然后针对每个小部分序列,决定它应该转到三个页面中的哪一个。如果所有 PDF 文件都来自同一个制作者,可能会更容易。
  • 实际上拆分确实很困难,但 OP 可能会使用类似于 this answer 中用于 iText 的技术:他可能会将原始页面放入 Xobject 并绘制该 Xobject 的剪辑部分到目标页面上。

标签: java pdf pdfbox


【解决方案1】:

查看我为您制作的这个示例,希望对您有所帮助

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.util.PDFTextStripper;

import java.io.*;
import java.util.List;
/**
 * Created by ljcp on 5/25/15.
 */

public class TestReadLinePdf {

    public static void  main(String [] args) {

        try {

            File pdfFile = new File("/Users/ljcp/Desktop/test2.pdf");
            PDDocument pdDocument = PDDocument.load(pdfFile);


            List allPages = pdDocument.getDocumentCatalog().getAllPages();
            for (int i = 1; i <= allPages.size(); i++) {
                PDFTextStripper stripper = new PDFTextStripper();
                stripper.setStartPage(i);
                stripper.setEndPage(i);
                String text = stripper.getText(pdDocument).replaceAll("visiblespace", " ");

                String[] lines = text.split("\n");
                System.out.println("Page Number " + i + " lines " + lines.length);
            }

        } catch(Exception e){
            System.out.print(e);
        }
    }
}

【讨论】:

  • 您的答案不计算每页的行数,而是计算所有页面的行数。
  • 为此,您需要按页处理文本剥离器,只需执行循环并将 startPage 和 EndPage 设置为 1 以读取第一页,其余部分相同
  • 我知道。我只是建议您更新答案,以便回答问题的第一部分。
  • 非常感谢。就一个问题!以下行是做什么的? String text = stripper.getText(pdDocument).replaceAll("visiblespace", " "); 为什么我们需要它?
  • @Suo6613 这个答案解决了你的问题吗?如果是,请接受。
猜你喜欢
  • 2013-12-07
  • 1970-01-01
  • 2011-05-07
  • 2010-11-03
  • 2010-09-24
  • 2014-09-29
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
相关资源
最近更新 更多