diff --git a/modules/order/commerce_order.module b/modules/order/commerce_order.module
index 0ccaa7c..7c189e8 100644
--- a/modules/order/commerce_order.module
+++ b/modules/order/commerce_order.module
@@ -47,6 +47,18 @@ function commerce_order_theme($existing, $type, $theme, $path) {
 }
 
 /**
+ * Implements hook_entity_extra_field_info_alter().
+ */
+function commerce_order_entity_extra_field_info_alter(&$info) {
+  // Show the 'View PDF' link by default.
+  foreach ($info['commerce_order'] as $bundle => &$fields) {
+    if (isset($fields['display']['entity_print_view_pdf'])) {
+      $fields['display']['entity_print_view_pdf']['visible'] = TRUE;
+    }
+  }
+}
+
+/**
  * Implements hook_local_tasks_alter().
  */
 function commerce_order_local_tasks_alter(&$definitions) {
diff --git a/modules/order/src/Entity/Order.php b/modules/order/src/Entity/Order.php
index 2e26820..b4e837a 100644
--- a/modules/order/src/Entity/Order.php
+++ b/modules/order/src/Entity/Order.php
@@ -43,6 +43,7 @@ use Drupal\profile\Entity\ProfileInterface;
  *       "default" = "Drupal\commerce_order\OrderRouteProvider",
  *       "delete-multiple" = "Drupal\entity\Routing\DeleteMultipleRouteProvider",
  *     },
+ *     "entity_print" = "Drupal\commerce_order\Renderer\OrderRenderer"
  *   },
  *   base_table = "commerce_order",
  *   admin_permission = "administer commerce_order",
diff --git a/modules/order/src/Renderer/OrderRenderer.php b/modules/order/src/Renderer/OrderRenderer.php
new file mode 100644
index 0000000..b07a77d
--- /dev/null
+++ b/modules/order/src/Renderer/OrderRenderer.php
@@ -0,0 +1,121 @@
+<?php
+
+namespace Drupal\commerce_order\Renderer;
+
+use Drupal\commerce_order\Entity\OrderInterface;
+use Drupal\commerce_order\OrderTotalSummaryInterface;
+use Drupal\Core\Entity\EntityTypeInterface;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Render\RendererInterface as CoreRendererInterface;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+use Drupal\entity_print\Asset\AssetRendererInterface;
+use Drupal\entity_print\FilenameGeneratorInterface;
+use Drupal\entity_print\Renderer\ContentEntityRenderer;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+
+/**
+ * Provides a custom entity_print renderer for orders.
+ *
+ * Uses the commerce_order_receipt template for the document contents.
+ */
+class OrderRenderer extends ContentEntityRenderer {
+
+  use StringTranslationTrait;
+
+  /**
+   * The order total summary.
+   *
+   * @var \Drupal\commerce_order\OrderTotalSummaryInterface
+   */
+  protected $orderTotalSummary;
+
+  /**
+   * The entity view builder for profiles.
+   *
+   * @var \Drupal\profile\ProfileViewBuilder
+   */
+  protected $profileViewBuilder;
+
+  /**
+   * Constructs a new OrderEntityRenderer object.
+   *
+   * @param \Drupal\Core\Render\RendererInterface $renderer
+   *   The core render service.
+   * @param \Drupal\entity_print\Asset\AssetRendererInterface $asset_renderer
+   *   The entity print asset renderer.
+   * @param \Drupal\entity_print\FilenameGeneratorInterface $filename_generator
+   *   A filename generator.
+   * @param \Symfony\Component\EventDispatcher\EventDispatcherInterface $event_dispatcher
+   *   The event dispatcher.
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
+   *   The entity type manager.
+   * @param \Drupal\commerce_order\OrderTotalSummaryInterface $order_total_summary
+   *   The order total summary service.
+   */
+  public function __construct(CoreRendererInterface $renderer, AssetRendererInterface $asset_renderer, FilenameGeneratorInterface $filename_generator, EventDispatcherInterface $event_dispatcher, EntityTypeManagerInterface $entity_type_manager, OrderTotalSummaryInterface $order_total_summary) {
+    parent::__construct($renderer, $asset_renderer, $filename_generator, $event_dispatcher, $entity_type_manager);
+
+    $this->orderTotalSummary = $order_total_summary;
+    $this->profileViewBuilder = $entity_type_manager->getViewBuilder('profile');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
+    return new static (
+      $container->get('renderer'),
+      $container->get('entity_print.asset_renderer'),
+      $container->get('entity_print.filename_generator'),
+      $container->get('event_dispatcher'),
+      $container->get('entity_type.manager'),
+      $container->get('commerce_order.order_total_summary')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function render(array $orders) {
+    return array_map([$this, 'renderSingle'], $orders);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFilename(array $entities) {
+    $entities_label = $this->filenameGenerator->generateFilename($entities, function ($order) {
+      /** @var \Drupal\commerce_order\Entity\OrderInterface $order */
+      return $order->id();
+    });
+
+    return $this->t('Order @id @receipt', [
+      '@id' => $entities_label,
+      '@receipt' => $this->formatPlural(count($entities_label), 'receipt', 'receipts'),
+    ]);
+  }
+
+  /**
+   * Builds a print ready render array for a single order.
+   *
+   * @param \Drupal\commerce_order\Entity\OrderInterface $order
+   *   The order entity.
+   *
+   * @return array
+   *   The render array.
+   */
+  protected function renderSingle(OrderInterface $order) {
+    $build = [
+      '#theme' => 'commerce_order_receipt',
+      '#order_entity' => $order,
+      '#totals' => $this->orderTotalSummary->buildTotals($order),
+    ];
+    if ($billing_profile = $order->getBillingProfile()) {
+      $build['#billing_information'] = $this->profileViewBuilder->view($billing_profile);
+    }
+
+    return $build;
+  }
+
+}
diff --git a/modules/order/templates/commerce-order--admin.html.twig b/modules/order/templates/commerce-order--admin.html.twig
index f1b1c4a..1cd2ea5 100644
--- a/modules/order/templates/commerce-order--admin.html.twig
+++ b/modules/order/templates/commerce-order--admin.html.twig
@@ -37,7 +37,7 @@
         <h3 class="entity-meta__title">
           {{ order_state }}
         </h3>
-        {% for key in ['completed', 'placed', 'changed'] %}
+        {% for key in ['completed', 'placed', 'changed', 'entity_print_view_pdf'] %}
           {% if order[key] %}
             <div class="form-item">
               {{ order[key] }}
