Install

Works with Drupal: ^11 || ^12

Using Composer to manage Drupal site dependencies

Alternative installation files

Download tar.gz 37.43 KB
MD5: 3553195ebb9fe5a2b1280f098ac8bc9e
SHA-1: 5a8b6691c6377920c63909eeb344b0b90dd49563
SHA-256: c2f94607105c3ff70e495a9591c5353e36d6e1abbedf0defebdd2742b18a689e
Download zip 56.03 KB
MD5: a74369afa2d25452c53d33b202311b26
SHA-1: 51ae7d150fa7663b95f60baeef47ec6ec6d5a56e
SHA-256: 0bb84ac086dedde0153b925731e7601154920bac4090e0dbbb43c42b97886825

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 11.
  • 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:41 UTC
Last updated: 21 Oct 2026 at 02:42 UTC
Bug fixes
New features

Other releases