为了账号安全,请及时绑定邮箱和手机立即绑定

使用java将PDF转换为CSV

使用java将PDF转换为CSV

牛魔王的故事 2022-06-04 17:26:12
我已经尝试了堆栈溢出和外部的大部分内容问题:我有一个包含内容和表格的 pdf。我还需要解析表格和内容。APIs: 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 坐标获取单元格但问题是我的 pdfs 内容是动态的。即表大小已更改。堆栈溢出中的这些链接和更多的力对我有用。
查看完整描述

2 回答

?
守着一只汪

TA贡献1872条经验 获得超3个赞

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/


查看完整回答
反对 回复 2022-06-04
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

在此处查看使用 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;

        }

    }

}



查看完整回答
反对 回复 2022-06-04
  • 2 回答
  • 0 关注
  • 262 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号