【问题标题】:PDF to Excel in Java [closed]Java中的PDF到Excel [关闭]
【发布时间】:2018-04-09 05:37:37
【问题描述】:

我正在将数据从 PDF 转换为 excel。 PDF 包含表格。我使用 Itext- pdf 读取数据并在 apache poi 的帮助下将其转换为 excel。但所有内容都转换为文本,甚至表格行和列。我喜欢像在 PDF 中一样将表格写为行和列,所以请帮助我阅读 PDF 中的表格以写入 Excel。

这是我的代码:

PdfReader reader;
try {
    reader = new PdfReader("D:/JDEV_WORK/MANOJ/ItemPriceReport.pdf");
    PdfReaderContentParser parser = new PdfReaderContentParser(reader);
    TextExtractionStrategy strategy;
    String line = null;
    for (int i = 1; i <= reader.getNumberOfPages(); i++) {
        strategy = parser.processContent(i,new SimpleTextExtractionStrategy());
        line = strategy.getResultantText();
        System.out.println("line --- "+line);
    }

//conversion starts here....

HSSFRow myRow = null;
HSSFCell myCell = null;
CreationHelper helper = myWorkBook.getCreationHelper();
List<String> lines = IOUtils.readLines(new StringReader(line));

for (int i = 0; i < lines.size(); i++) {
    String str[] = lines.get(i).split(",");
    myRow = mySheet.createRow((short) i);
    for (int j = 0; j < str.length; j++) {
    myRow.createCell(j).setCellValue(helper.createRichTextString(str[j]));
   }
}



        FileOutputStream fileOut;
        try {
            fileOut = new FileOutputStream("D:/JDEV_WORK/MANOJ/ItemPriceExcel.xls");
            myWorkBook.write(fileOut);
            fileOut.close();
        } catch (FileNotFoundException e) {
            System.out.println("FILE NOT FOUND");
        }
    reader.close();
    } catch (IOException e) {
}

【问题讨论】:

  • 我真的不明白这两个赞成票。您甚至没有告诉我们您的 PDF 是否为标记的 PDF。如果没有,那么 iText 的开源版本将无济于事。您需要一个封闭源代码的 iText 插件,例如 pdf2Data,并且如果您的文档不包含任何 real,您需要系统如何检测表格i> 表。不是因为看到有一张桌子,而是有一张桌子;如果您的 PDF 没有被标记,那么当 机器 查看 PDF 时没有表格
  • 我对 PDF 了解不多,无论它是否是 Tagged PDF。它只是开源版本。您的意思是在封闭源 itext 中添加诸如 pdf2Data 将有助于检测 pdf 中的表格。那么请问如何获得封闭源代码。如果您有任何示例来源,请发送链接。
  • 您可以在 Adob​​e Reader 中打开 PDF 并查看文档属性以查看 PDF 是否为标记 PDF。至于pdf2Data,我已经提供了一个链接,但你可能忽略了它:itextpdf.com/itext7/pdf2Data

标签: java itext apache-poi


【解决方案1】:

如果您对 PDF 有一点了解,那将非常有意义。 PDF 不是所见即所得的格式。它更像是一个指令容器,而不是人类可读内容的容器。

PDF 文件在内部看起来是这样的

转到坐标 50、50
使用字体 Helvetica Bold
将字体大小设置为 12
绘制字符“H”的字形
转到坐标 56、50
绘制字符'e'的字形

话虽如此,将这些非结构化数据恢复到合理的表是非常困难的。

【讨论】:

    【解决方案2】:

    对于 Ubuntu (Linux),开源命令行程序 pdftotext 可用 [http://poppler.freedesktop.org]。您可以将文本 PDF 文件转换为其文本字符。正在将输出写入文件。

    语法如下: pdftotext [options] [PDF-file] [text-file]

    您可以在 Java 中轻松调用 pdftotext, 请参阅以下代码片段:

    String pdfFilenameWithPath = "C:\myPdfFileToParse.pdf"
    String cmd = "pdftotext " + pdfFilenameWithPath;
    try {
       Runtime.getRuntime().exec(cmd);
    } catch (IOException e) {
        LOG.error("pdftotext: cannot run");
        LOG.error("[{}]", e);
    }
    

    生成的文本文件随后可以被BufferedReader 读取, 并在 Java 中进一步处理。

    您需要对 PDF 文件中的文本格式做出简单的假设。一个合理的猜想是该表由一个标签行组成,随后是随后的数据行。您需要将所有这些行读入一个单独的文件,其中每个字段都用“;”分隔(标准 CSV 格式)。在这个中间文件中,您可以检查您对 PDF 文件中的表结构所做的假设是否正确。

    读取文本文件的结果可以解析为 csv 文件。我为此使用 Apache 的 CSV 库 (org.apache.commons.csv):

    public List<List<String>> readCSVFile(String filename, boolean bypassHeader) {
    
        List<List<String>> csvFile = new ArrayList<>();
    
    
        try {
    
            Reader in = new FileReader(filename);
            Iterable<CSVRecord> records = null;
            if (bypassHeader) {
                records = CSVFormat.EXCEL.withFirstRecordAsHeader().parse(in);
            } else {
                records = CSVFormat.EXCEL.parse(in);
            }
    
            for (CSVRecord record : records) {
                List<String> csvLine = new ArrayList<>();
                for (String field : record) {
                    csvLine.add(field);
                }
                csvFile.add(csvLine);
            }
        } catch (Exception e) {
            LOG.error("readCSVFile: exception [{}]", e);
        }
        return csvFile;
    }
    

    最后,您可以将 CSV 解析的数据写入所需的 Excel 格式,就像您在提供的 Java 代码中所做的那样

    【讨论】:

    • 如何将使用pdftotext 生成的纯文本转换为结构化表格(区分表格标题、表格行/列、表格数据)?您的建议是,OP 已经在使用 iText:他获取了所有文本。 OP 正在询问内容的语义信息。
    • 我同意。我的解决方案已扩展为解析表数据。
    • 有没有其他方法可以将 PDF 转换为 HTML,然后将 HTML 转换为 Excel。是否有可能或者我需要做两个单独的工作流程,比如数据 --> pdf 和数据 -->Excel。
    • 您认为 HTML 会将内容显示为表格数据的假设可能是错误的。只有当您的 PDF 是 Tagged PDF 时,这才有可能。由于您没有告诉我们您的 PDF 是否为 Tagged PDF,我假设它不是,在这种情况下将 PDF 转换为 HTML,然后将 HTML 转换为 Excel帮不了你。
    • 如果一个 PDF 被正确标记,那么一个表格就知道它是一个表格。标签将告诉您在哪里可以找到标题行和数据行。标签将告诉您哪些内容属于每行中的哪个单元格。如果您拥有所有这些信息,那么您将不需要 HTML,并且所有这些信息都存在于 正确标记 PDF 中。 (请注意,并非所有 PDF 都被正确标记!)
    猜你喜欢
    • 2011-07-26
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    相关资源
    最近更新 更多