Всем привет! Есть задача: скачать pdf файл и проверить не только сам факт успешного скачивания, но и текст внутри pdf файла.
У кого-нибудь есть опыт реализации такой задачи на java? Вроде как есть инструменты парсинга pdf в строку, но хотелось бы найти оптимальный инструмент.
@Test
public void bankTransaction() throws Exception {
PDF pdf = new PDF(getClass().getClassLoader().getResource("transaction.pdf"));
assertThat(pdf, containsText("24.06.2015"));
}
Правильно пониманию что данный тест проверит только первое вхождение даты в документе?
А есть решение если нужно проверить несколько таких дат в разных частях документа?
Привет!
Да, такая строчка проверит только первое вхождение даты.
А как мог бы выглядеть метод для проверки нескольких дат?
Насколько я понимаю, PDF не даёт возможности проверить, в каком именно месте документа была та или иная дата.
Я думал что-то вроде containsText(String, int number)
Метод должен определить что искомая строка встречается в документе n кол-во раз.
Например, у нас документ из 10 страниц и на каждой в шапке есть номер документа, и надо проверить что этот номер документа 10 раз встречается в PDF (без привязки к конкретному месту документа)
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature;
import org.apache.pdfbox.text.PDFTextStripper;
PDF pdf = new PDF(f.toURL());
assertThat(pdf.text, containsString("The Free Encyclopedia"));
// NOTE: locale UTF8
assertThat(pdf.text, containsString("Русский"));
assertThat(pdf.text, containsString("Français"));
public static class PDF {
public final byte[] content;
public final String text;
public final int numberOfPages;
public final String author;
public final String creator;
public final String keywords;
public final String producer;
public final String subject;
public final String title;
public final boolean encrypted;
public final boolean signed;
public final String signerName;
private PDF(String name, byte[] content) {
this(name, content, 1, Integer.MAX_VALUE);
}
private PDF(String name, byte[] content, int startPage, int endPage) {
this.content = content;
try (InputStream inputStream = new ByteArrayInputStream(content)) {
try (PDDocument pdf = PDDocument.load(inputStream)) {
PDFTextStripper pdfTextStripper = new PDFTextStripper();
pdfTextStripper.setStartPage(startPage);
pdfTextStripper.setEndPage(endPage);
this.text = pdfTextStripper.getText(pdf);
this.numberOfPages = pdf.getNumberOfPages();
this.author = pdf.getDocumentInformation().getAuthor();
// this.creationDate = pdf.getDocumentInformation().getCreationDate();
this.creator = pdf.getDocumentInformation().getCreator();
this.keywords = pdf.getDocumentInformation().getKeywords();
this.producer = pdf.getDocumentInformation().getProducer();
this.subject = pdf.getDocumentInformation().getSubject();
this.title = pdf.getDocumentInformation().getTitle();
this.encrypted = pdf.isEncrypted();
PDSignature signature = pdf.getLastSignatureDictionary();
this.signed = signature != null;
this.signerName = signature == null ? null : signature.getName();
}
} catch (Exception e) {
throw new IllegalArgumentException("Invalid PDF file: " + name, e);
}
}