Install

Works with Drupal: ^10.3 || ^11 || ^12

Using Composer to manage Drupal site dependencies

Alternative installation files

Download tar.gz 37.44 KB
MD5: d6c57ee2895decc032d32c7541ddbafb
SHA-1: 053f689953d47fddacc68d1e26b562604f478110
SHA-256: ff2970d0410869fe1f219c82a65bfaaf6577524a0be4aa7508f9d0a834a632d2
Download zip 56.02 KB
MD5: f153bd2d39427d6e1b872650da19d542
SHA-1: 0cd777bb0a597074f96c7a7f10224303e99561ec
SHA-256: cc4bceb3a3c2a2762d1507abf4cf27f637e8e1aad0632085f5f08f3405c2f16b

Release notes

Fairly big release. The main addition is appending the export to an existing PDF, and deferred exports got a security overhaul. Read the upgrade notes before updating: deferred exports need the private file system now, and there are a few update hooks.

Before you update

  • Run composer update, the module now depends on setasign/fpdi ^2.6.
  • Minimum Drupal version is 10.3.
  • Set up the private file system first, then run drush updb. Without it, exports are generated inline and you'll see a warning in the status report.
  • Run cron before updating. Deferred exports queued by the old version are discarded (a warning is logged).
  • The update hooks move existing exports from public://views_data_export_tcpdf_exports to private and delete the public folder.
  • They also rename the PDF format to pdf in your views and drop unused options.
  • Default settings are installed (keep exports 7 days, email users). Check them afterwards.
  • Roles that saw other users' exports through "administer users" need the new "View any generated PDF export" permission.
  • If cron runs from Drush, pass --uri or the links in notification emails will point to the wrong domain.
  • PDFs with compressed cross-reference streams (PDF 1.5+) can't be used as templates, the free FPDI parser doesn't support them.

New

  • Append the export to an existing PDF, either uploaded or set as the display's default file. Works with deferred exports too.
  • Font option: Helvetica, Times, Courier, DejaVu Sans, FreeSans. Use the last two for non-Latin text.
  • Tokens in header title, subtitle, address, notes and footer ([site:name], [view:title], [current-date:short], etc).
  • Per-field column width (%) and alignment.
  • Group rows by a field, with subtotals and a grand total for numeric columns.
  • Diagonal watermark (text with tokens, opacity).
  • PDF protection with AES-256: open password (tokens allowed), owner password, and allowed actions.
  • Email when a deferred export is ready.
  • Old deferred exports are deleted on cron, 7 days by default.
  • Settings page under Configuration » Content authoring » PDF Views Data Export.
  • Drush command: drush views-data-export-tcpdf:export (alias vdet-export).
  • New permission "View any generated PDF export".
  • Worker logs go to the views_data_export_tcpdf channel.
  • Config schema and kernel tests.

Security

  • Deferred exports were stored in the public file system. They're in private:// now, downloadable only by the owner or users with the new permission.
  • File names use a cryptographically random suffix.
  • Exported rows are no longer stored in the queue. The worker re-runs the view as the requesting user, so access checks apply and blocked users get nothing.
  • Anonymous users no longer share deferred exports. Deferred processing is for authenticated users only.
  • Uploaded PDFs get renamed instead of overwriting temp files with the same name.
  • Uploaded and preselected files are checked by PDF signature and must actually parse, not just match the MIME type.
  • Upload errors don't show internal exception messages anymore.

Fixes

  • Installing the module restricted every Views Data Export display to PDF. CSV, XLS etc. are back.
  • "Current page only" exported everything.
  • Export route was missing display_id.
  • The selected PDF file was being passed to the view as a contextual argument.
  • Fatal error on PDF upload (wrong FileUploadHandler call).
  • Upload validators moved to FileExtension / FileSizeLimit, the old ones are gone in Drupal 11.
  • "PDF exports" page gave a 500 instead of 403 for unauthorized users, and used format_size() which no longer exists in D11.
  • Going over the row limit threw an error instead of scheduling a deferred export.
  • Views were executed and rendered twice per export.
  • Deferred exports used a different, unstyled table and ignored field labels.
  • Header logo was never made permanent, so file GC could delete it.
  • & showing up literally in cells (double-encoded entities).
  • Deferred export failures were silently swallowed.
  • Uninstalling could delete entire views that had a PDF display. Now only the PDF displays are removed, along with generated files and pending queue items.
  • "Page X of Y", summary, empty text and Yes/No are translatable.

Other changes

  • After scheduling a deferred export you're redirected to your exports page.
  • Exports page uses a route access check and proper cache metadata.
  • Removed unused metadata options (last modified by, description, category, manager, company).
  • Added dependency on file.
  • Removed hardcoded version from composer.json and .info.yml, packaging adds it.
Created by: markisich
Created on: 21 Oct 2026 at 02:32 UTC
Last updated: 21 Oct 2026 at 02:34 UTC
Bug fixes
New features

Other releases