diff --git a/composer.json b/composer.json
index 54070ed..bc0c4de 100644
--- a/composer.json
+++ b/composer.json
@@ -19,6 +19,7 @@
   "minimum-stability": "dev",
   "suggest": {
     "sainsburys/guzzle-oauth2-plugin": "3.0 required for the OAuth2 authentication plugin",
-    "ext-soap": "*"
+    "ext-soap": "*",
+    "smalot/pdfparser": "*"
   }
 }
diff --git a/src/Plugin/migrate/process/ParsePDF.php b/src/Plugin/migrate/process/ParsePDF.php
new file mode 100644
index 0000000..2a35e80
--- /dev/null
+++ b/src/Plugin/migrate/process/ParsePDF.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace Drupal\migrate_plus\Plugin\migrate\process;
+
+use Drupal\migrate\MigrateException;
+use Drupal\migrate\MigrateExecutableInterface;
+use Drupal\migrate\ProcessPluginBase;
+use Drupal\migrate\Row;
+use Smalot\PdfParser\Parser;
+
+/**
+ * Extracts text from a PDF source.
+ *
+ * @MigrateProcessPlugin(
+ *   id = "parse_pdf"
+ * )
+ *
+ * @code
+ *   pdf_text:
+ *     plugin: parse_pdf
+ *     source: filename
+ * @endcode
+ */
+class ParsePDF extends ProcessPluginBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
+    if (!class_exists('\Smalot\PdfParser\Parser')) {
+      echo "You need to install the smalot/pdfparser package with composer require 'smalot/pdfparser' to use parse_pdf.\n";
+      echo "Reset you migration with drush migrate:reset-status migration_id.\n";
+      exit();
+    }
+
+    if (!$value) {
+      throw new MigrateException('Input must not be null or empty.');
+    }
+    if (is_array($value)) {
+      throw new MigrateException('Input must not be an array.');
+    }
+    if (!file_exists($value)) {
+      throw new MigrateException('File ' . $value . ' not found.');
+    }
+    $parser = new Parser();
+    $pdf = $parser->parseFile($value);
+    $text = $pdf->getText();
+    return $text;
+  }
+
+}
