【问题标题】:Convert PDF to CSV using java使用java将PDF转换为CSV
【发布时间】:2019-06-29 06:07:36
【问题描述】:

我已经尝试了堆栈溢出和外部的大部分内容

问题: 我有一个包含内容和表格的 pdf。 我还需要解析表格和内容。

API: https://github.com/tabulapdf/tabula-java 我正在使用tabula-java,它忽略了一些内容,并且表格单元格内的内容没有以正确的方式分隔。

我的 PDF 包含这样的内容

 DATE :1/1/2018         ABCD                   SCODE:FFFT
                       --ACCEPTED--
    USER:ADMIN         BATCH:RR               EEE
    CON BATCH
    =======================================================================
    MAIN SNO SUB  VALUE DIS %
    R    12   rr1 0125  24.5
            SLNO  DESC  QTY  TOTAL  CODE   FREE
            1     ABD   12   90     BBNEW  -NILL-
            2     XDF   45   55     GHT55  MRP
            3     QWE   08   77     CAT    -NILL-
    =======================================================================
    MAIN SNO SUB  VALUE DIS %
    QW    14   rr2 0122  24.5
            SLNO  DESC  QTY  TOTAL  CODE   FREE
            1     ABD   12   90     BBNEW  -NILL-
            2     XDF   45   55     GHT55  MRP
            3     QWE   08   77     CAT    -NILL-

要转换的表格代码:

public static void toCsv() throws ParseException {
        String commandLineOptions[] = { "-p", "1", "-o", "$csv", };
        CommandLineParser parser = new DefaultParser();
        try {
            CommandLine line = parser.parse(TabulaUtil.buildOptions(), commandLineOptions);
            new TabulaUtil(System.out, line).extractFileInto(
                    new File("/home/sample/firstPage.pdf"),
                    new File("/home/sample/onePage.csv"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

tabula 甚至支持命令行界面

java -jar TabulaJar/tabula-1.0.2-jar-with-dependencies.jar -p all  -o  $csv -b Pdfs

我尝试过使用-c,--columns <COLUMNS> 的制表符 即按列边界的 X 坐标获取单元格

但问题是我的 pdf 内容是动态的。即表大小已更改。

堆栈溢出中的这些链接以及更多功能对我有用。

How to convert PDF to CSV with tabula-py?

How to extract table data from PDF as CSV from the command line?

Convert PDF to Excel in Java

How to convert a pdf file into CSV file?

itext Converting PDF to csv

Parse PDF table and display it as CSV(Java)

我使用了 pdf 框,它给出了未格式化的文本,我无法正确读取表格内容。

可以使用 java 将带有表格的 pdf 转换为 csv/excel 而不会丢失内容和格式。

我不想使用付费图书馆。

【问题讨论】:

  • 我认为 PDF 文档中的任何表格都不可能。这些方法显然在一定程度上受到限制,因为表可以具有嵌套列行,例如使用乳胶等的多列包 - 你有一个到目前为止不起作用的示例 PDF 吗?
  • 我认为最终 CSV 的整个过程在阅读您的发现时都是虚幻的。显示 PDF、您的尝试和修复/确认步骤似乎是最好的可行解决方案。
  • 我同意@AKSW 和@Joop Eggen 的观点,但在我脑海中浮现的一件事是这个api 如何实现与嵌套表格和内容的完美转换。 pdftables.com 是付费的。这意味着有办法。我想知道怎么做?
  • 你知道,商业化是有原因的,通常在它上面花费了更多的精力。为什么只能有人告诉你,谁知道商业 API 的代码并将其与开源项目进行比较。我的意思是,它是开源的——您也可以深入研究代码并对其进行扩展。或者问开发者。但是不要忘记,人们这样做可能只是为了满足他们非常有限的要求。你可能得不到任何支持
  • 如果您正在寻找商业工具,我建议您也可以查看 iText 的 pdf2Data。它还从表格等中提取内容。

标签: java csv pdf tabula


【解决方案1】:

在此处查看使用 Java 将 PDF 提取为 CSV 的任何示例:https://github.com/pdftables/java-pdftables-api。每个页面都是独立考虑的,因此您的 PDF 的动态特性不应该成为问题。您可以在他们的网站上免费试用。

package com.pdftables.examples;

import java.io.File;
import java.util.Arrays;
import java.util.List;

import org.apache.commons.io.FileUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class ConvertToFile {
    private static List<String> formats = Arrays.asList(new String[] { "csv", "xml", "xlsx-single", "xlsx-multiple" });

    public static void main(String[] args) throws Exception {
        if (args.length != 3) {
            System.out.println("Command line: <API_KEY> <FORMAT> <PDF filename>");
            System.exit(1);
        }

        final String apiKey = args[0];
        final String format = args[1].toLowerCase();
        final String pdfFilename = args[2];

        if (!formats.contains(format)) {
            System.out.println("Invalid output format: \"" + format + "\"");
            System.exit(1);
        }

        // Avoid cookie warning with default cookie configuration
        RequestConfig globalConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD).build();

        File inputFile = new File(pdfFilename);

        if (!inputFile.canRead()) {
            System.out.println("Can't read input PDF file: \"" + pdfFilename + "\"");
            System.exit(1);
        }

        try (CloseableHttpClient httpclient = HttpClients.custom().setDefaultRequestConfig(globalConfig).build()) {
            HttpPost httppost = new HttpPost("https://pdftables.com/api?format=" + format + "&key=" + apiKey);
            FileBody fileBody = new FileBody(inputFile);

            HttpEntity requestBody = MultipartEntityBuilder.create().addPart("f", fileBody).build();
            httppost.setEntity(requestBody);

            System.out.println("Sending request");

            try (CloseableHttpResponse response = httpclient.execute(httppost)) {
                if (response.getStatusLine().getStatusCode() != 200) {
                    System.out.println(response.getStatusLine());
                    System.exit(1);
                }
                HttpEntity resEntity = response.getEntity();
                if (resEntity != null) {
                    final String outputFilename = getOutputFilename(pdfFilename, format.replaceFirst("-.*$", ""));
                    System.out.println("Writing output to " + outputFilename);

                    final File outputFile = new File(outputFilename);
                    FileUtils.copyToFile(resEntity.getContent(), outputFile);
                } else {
                    System.out.println("Error: file missing from response");
                    System.exit(1);
                }
            }
        }
    }

    private static String getOutputFilename(String pdfFilename, String suffix) {
        if (pdfFilename.length() >= 5 && pdfFilename.toLowerCase().endsWith(".pdf")) {
            return pdfFilename.substring(0, pdfFilename.length() - 4) + "." + suffix;
        } else {
            return pdfFilename + "." + suffix;
        }
    }
}

【讨论】:

    【解决方案2】:

    Apache 基金会的项目很少

    Tikka 支持广泛的扩展,包括 pdf、ppt、xls。 https://tika.apache.org/1.24.1/formats.html中提到了支持的格式

    https://tika.apache.org/

    PDF Box - 特定于 pdf 相关功能

    https://pdfbox.apache.org/

    【讨论】:

      猜你喜欢
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-24
      相关资源
      最近更新 更多