Проверка PDF файла после скачивания в автотесте

Всем привет! Есть задача: скачать pdf файл и проверить не только сам факт успешного скачивания, но и текст внутри pdf файла.

У кого-нибудь есть опыт реализации такой задачи на java? Вроде как есть инструменты парсинга pdf в строку, но хотелось бы найти оптимальный инструмент.

        FileInputStream fis = new FileInputStream("build/reports/tests/" + doc_name);
        PDFTextStripper tStripper = new PDFTextStripper();
        String pdfFileInText = tStripper.getText(PDDocument.load(fis)).replace("\n", "").replace("\r", "");

я вот так делаю, ну и потом уде выполняю проверки.

1 лайк

Конечно есть!

7 лайков
@Test
  public void bankTransaction() throws Exception {
    PDF pdf = new PDF(getClass().getClassLoader().getResource("transaction.pdf"));
    assertThat(pdf, containsText("24.06.2015"));
}

Правильно пониманию что данный тест проверит только первое вхождение даты в документе?
А есть решение если нужно проверить несколько таких дат в разных частях документа?

Привет!
Да, такая строчка проверит только первое вхождение даты.
А как мог бы выглядеть метод для проверки нескольких дат?
Насколько я понимаю, PDF не даёт возможности проверить, в каком именно месте документа была та или иная дата.

Может быть, вам поможет новый метод matchesText?

assertThat(pdf).matchesText(".*24\\.06\\.2015.*25\\.07\\.2015.*26\\.08\\.2015.*");

Я зарелизил версию 1.8.1 с этим методом, через несколько минут она будет доступна.

Я думал что-то вроде containsText(String, int number)

Метод должен определить что искомая строка встречается в документе n кол-во раз.

Например, у нас документ из 10 страниц и на каждой в шапке есть номер документа, и надо проверить что этот номер документа 10 раз встречается в PDF (без привязки к конкретному месту документа)

А, ну да, такой матчер легко сделать.

советую использнуть pdfbox
https://mvnrepository.com/artifact/org.apache.pdfbox

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);
			}
		}


полный пример здесь

или здесь

или здесь

Вышеупомянутая pdf-test как раз и использует pdfbox, просто нужные матчеры уже есть из коробки.

спасибо

А есть ли софт ассерты в pdf test? если необходимо проверить несколько значений, но нет желания обваливаться на первом несоответствии.

Для ассерта пока нет. Добавим в версии 1.9.0 (надеюсь сегодня вечером зарелизить).

А вот в JUnit5 можно использовать метод assertAll.

2 лайка