Конвертировать PDF в CSV, используя Java
Я пробовал большинство вещей на переполнение стека и за его пределами
Проблема: у меня есть 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 координатам границ столбцов
Но проблема в том, что мой PDF-контент динамический. т.е. размеры таблицы изменены.
Эти ссылки в стеке переполнены, и многие другие работают на меня.
Как конвертировать PDF в CSV с помощью tabula-py?
Как извлечь данные таблицы из PDF как CSV из командной строки?
Конвертировать PDF в Excel в Java
Как преобразовать PDF-файл в CSV-файл?
itext Преобразование PDF в CSV
Разбор таблицы PDF и отображение ее в формате CSV(Java)
Я использовал окно PDF, которое дает текст, который не отформатирован, где я не могу прочитать содержимое таблицы должным образом.
Можно конвертировать PDF с таблицами в CSV / Excel с использованием Java без потери содержимого и форматирования.
Я не хочу использовать платные библиотеки.
0 ответов
Смотрите любой пример извлечения PDF в CSV с помощью Java здесь: 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;
}
}
}
У фонда Apache есть несколько проектов
Tikka поддерживает широкий спектр расширений, включая pdf, ppt, xls. Поддерживаемые форматы указаны в https://tika.apache.org/1.24.1/formats.html.
PDF Box - Специально для функций, связанных с PDF