From 81020b989e540df6b299d4a26f1029c75499ae51 Mon Sep 17 00:00:00 2001 From: Jules Bousrez Date: Sun, 21 Dec 2025 11:39:00 +0100 Subject: [PATCH 1/7] feat: migrated critical functions --- .gitignore | 2 ++ composer.json | 6 +++++- src/export/fdf/forge_fdf.php | 22 +++++++++++----------- src/export/pdf/pdftk.php | 19 ++++--------------- src/filters/FilterASCII85.php | 7 ++----- src/filters/FilterASCIIHex.php | 6 +++--- src/filters/FilterFlate.php | 3 +-- src/filters/FilterLZW.php | 7 ++----- src/fpdm.php | 15 ++++++--------- src/lib/url.php | 2 +- 10 files changed, 37 insertions(+), 52 deletions(-) diff --git a/.gitignore b/.gitignore index c422267..8cf1a6e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ composer.phar +composer.lock /vendor/ +/migration_todo.txt # Commit your application's lock file http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file # You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file diff --git a/composer.json b/composer.json index 6eb9723..b437b09 100644 --- a/composer.json +++ b/composer.json @@ -31,7 +31,7 @@ } ], "require": { - "php": ">=5.3.0" + "php": ">=8.0" }, "keywords": [ "FPDM", @@ -45,5 +45,9 @@ "support": { "issues": "https://github.com/codeshell/fpdm/issues", "source": "https://github.com/codeshell/fpdm/tree/master" + }, + "require-dev": { + "squizlabs/php_codesniffer": "^3.13", + "phpcompatibility/php-compatibility": "^9.3" } } diff --git a/src/export/fdf/forge_fdf.php b/src/export/fdf/forge_fdf.php index 99845d8..bcc4a6d 100644 --- a/src/export/fdf/forge_fdf.php +++ b/src/export/fdf/forge_fdf.php @@ -29,17 +29,17 @@ function escape_pdf_string( $ss ) $ss_esc= ''; $ss_len= strlen( $ss ); for( $ii= 0; $ii< $ss_len; ++$ii ) { - if( ord($ss{$ii})== 0x28 || // open paren - ord($ss{$ii})== 0x29 || // close paren - ord($ss{$ii})== 0x5c ) // backslash + if( ord($ss[$ii])== 0x28 || // open paren + ord($ss[$ii])== 0x29 || // close paren + ord($ss[$ii])== 0x5c ) // backslash { - $ss_esc.= chr(0x5c).$ss{$ii}; // escape the character w/ backslash + $ss_esc.= chr(0x5c).$ss[$ii]; // escape the character w/ backslash } - else if( ord($ss{$ii}) < 32 || 126 < ord($ss{$ii}) ) { - $ss_esc.= sprintf( "\\%03o", ord($ss{$ii}) ); // use an octal code + else if( ord($ss[$ii]) < 32 || 126 < ord($ss[$ii]) ) { + $ss_esc.= sprintf( "\\%03o", ord($ss[$ii]) ); // use an octal code } else { - $ss_esc.= $ss{$ii}; + $ss_esc.= $ss[$ii]; } } return $ss_esc; @@ -55,13 +55,13 @@ function escape_pdf_name( $ss ) $ss_esc= ''; $ss_len= strlen( $ss ); for( $ii= 0; $ii< $ss_len; ++$ii ) { - if( ord($ss{$ii}) < 33 || 126 < ord($ss{$ii}) || - ord($ss{$ii})== 0x23 ) // hash mark + if( ord($ss[$ii]) < 33 || 126 < ord($ss[$ii]) || + ord($ss[$ii])== 0x23 ) // hash mark { - $ss_esc.= sprintf( "#%02x", ord($ss{$ii}) ); // use a hex code + $ss_esc.= sprintf( "#%02x", ord($ss[$ii]) ); // use a hex code } else { - $ss_esc.= $ss{$ii}; + $ss_esc.= $ss[$ii]; } } return $ss_esc; diff --git a/src/export/pdf/pdftk.php b/src/export/pdf/pdftk.php index 5b9e92a..ff98426 100644 --- a/src/export/pdf/pdftk.php +++ b/src/export/pdf/pdftk.php @@ -15,8 +15,7 @@ ******************************************************************/ if (!defined('URL_TOOLBOX')) die("Requires the URL_TOOLBOX package!"); - - define("PHP5_ENGINE",version_compare(phpversion(), "5")); + //!NOTE try to detect your OS @@ -104,22 +103,12 @@ function pdftk($pdf_file,$fdf_file,$settings) { //echo htmlentities("$cmdline , $descriptorspec, $cwd, $env"); - if(PHP5_ENGINE) { // Php5 - $process = proc_open($cmdline, $descriptorspec, $pipes, $cwd, $env); - }else { //Php4 - $process = proc_open($cmdline, $descriptorspec, $pipes); - } + $process = proc_open($cmdline, $descriptorspec, $pipes, $cwd, $env); if (is_resource($process)) { - if(PHP5_ENGINE) { - $err=stream_get_contents($pipes[2]); - }else { //Php4 - $err= ""; - while (($str = fgets($pipes[2], 4096))) { - $err.= "$str\n"; - } - } + $err=stream_get_contents($pipes[2]); + fclose($pipes[2]); diff --git a/src/filters/FilterASCII85.php b/src/filters/FilterASCII85.php index d5a1c05..1bad986 100644 --- a/src/filters/FilterASCII85.php +++ b/src/filters/FilterASCII85.php @@ -26,8 +26,7 @@ if (!defined('ORD_tilde')) define('ORD_tilde', ord('~')); -$__tmp = version_compare(phpversion(), "5") == -1 ? array('FilterASCII85') : array('FilterASCII85', false); -if (!call_user_func_array('class_exists', $__tmp)) { +if (!class_exists('FilterASCII85', false)) { if(isset($FPDM_FILTERS)) array_push($FPDM_FILTERS,"ASCII85Decode"); @@ -103,6 +102,4 @@ function encode($in) { return $this->error("ASCII85 encoding not implemented."); } } -} - -unset($__tmp); \ No newline at end of file +} \ No newline at end of file diff --git a/src/filters/FilterASCIIHex.php b/src/filters/FilterASCIIHex.php index abad13a..aee26e2 100644 --- a/src/filters/FilterASCIIHex.php +++ b/src/filters/FilterASCIIHex.php @@ -16,7 +16,7 @@ class FilterASCIIHex { *@internal same as _hex2bin ($hexString) *@access public *@note Function was written because PHP has a bin2hex, but not a hex2bin! - *@internal note pack(“C”,hexdec(substr($data,$i,2))) DOES NOT WORK + *@internal note pack(ā€œCā€,hexdec(substr($data,$i,2))) DOES NOT WORK * **/ function decode($data) { @@ -44,7 +44,7 @@ function decode($data) { * *@internal same as bin2hex *@access public - *@internal dechex(ord($str{$i})); is buggy because for hex value of 0-15 heading 0 is missing! Using sprintf() to get it right. + *@internal dechex(ord($str[$i])); is buggy because for hex value of 0-15 heading 0 is missing! Using sprintf() to get it right. *@param string $str a binary string *@return string hex the hexified string **/ @@ -54,7 +54,7 @@ function encode($data) { $hex = ""; $i = 0; do { - $hex .= sprintf("%02x", ord($str{$i})); + $hex .= sprintf("%02x", ord($str[$i])); $i++; } while ($i < strlen($str)); return $hex; diff --git a/src/filters/FilterFlate.php b/src/filters/FilterFlate.php index 908a3b6..e30724f 100644 --- a/src/filters/FilterFlate.php +++ b/src/filters/FilterFlate.php @@ -4,8 +4,7 @@ // NOTE: requires ZLIB >= 1.0.9! // -$__tmp = version_compare(phpversion(), "5") == -1 ? array('FilterFlateDecode') : array('FilterFlateDecode', false); -if (!call_user_func_array('class_exists', $__tmp)) { +if (!class_exists('FilterFlate', false)) { if(isset($FPDM_FILTERS)) array_push($FPDM_FILTERS,"FlateDecode"); diff --git a/src/filters/FilterLZW.php b/src/filters/FilterLZW.php index 7bc40b6..15ec3fe 100644 --- a/src/filters/FilterLZW.php +++ b/src/filters/FilterLZW.php @@ -17,8 +17,7 @@ // limitations under the License. // -$__tmp = version_compare(phpversion(), "5") == -1 ? array('FilterLZW') : array('FilterLZW', false); -if (!call_user_func_array('class_exists', $__tmp)) { +if (!class_exists('FilterLZW', false)) { if(isset($FPDM_FILTERS)) array_push($FPDM_FILTERS,"LZWDecode"); @@ -157,6 +156,4 @@ function encode($in) { $this->error("LZW encoding not implemented."); } } -} - -unset($__tmp); \ No newline at end of file +} \ No newline at end of file diff --git a/src/fpdm.php b/src/fpdm.php index fb8627d..56c2b4e 100644 --- a/src/fpdm.php +++ b/src/fpdm.php @@ -56,8 +56,7 @@ // require_once("filters/FilterStandard.php"); -$__tmp = version_compare(phpversion(), "5") == -1 ? array('FPDM') : array('FPDM', false); -if (!call_user_func_array('class_exists', $__tmp)) { +if (!class_exists('FPDM', false)) { define('FPDM_VERSION',2.9); @@ -790,16 +789,16 @@ function _set_field_value($line,$value) { $OldLen=strlen($CurLine); - //My PHP4/5 static call hack, only to make the callback $this->replace_value($matches,"$value") possible! - $callback_code='$THIS=new FPDM("[_STATIC_]");return $THIS->replace_value($matches,"'.$value.'");'; - $field_regexp='/^\/(\w+)\s?(\<|\()([^\)\>]*)(\)|\>)/'; if(preg_match($field_regexp,$CurLine)) { //modify it according to the new value $value + $self = $this; $CurLine = preg_replace_callback( $field_regexp, - create_function('$matches',$callback_code), + function($matches) use ($self, $value) { + return $self->replace_value($matches, $value); + }, $CurLine ); }else { @@ -1114,7 +1113,7 @@ function _hex2bin ($hexString) *Encodes a binary string to its hexadecimal representation * *@access private - *@internal dechex(ord($str{$i})); is buggy because for hex value of 0-15 heading 0 is missing! Using sprintf() to get it right. + *@internal dechex(ord($str[$i])); is buggy because for hex value of 0-15 heading 0 is missing! Using sprintf() to get it right. *@param string $str a binary string *@return string $hex the hexified string **/ @@ -2229,5 +2228,3 @@ function Error($msg) { } } - -unset($__tmp); diff --git a/src/lib/url.php b/src/lib/url.php index 52e946c..ef43761 100644 --- a/src/lib/url.php +++ b/src/lib/url.php @@ -130,7 +130,7 @@ function resolve_path($path) { if ($fold=='' || $fold=='.') continue; if ($fold=='..' && $i>0 && end($out)!='..') array_pop($out); else $out[]= $fold; - } return ($path{0}=='/'?'/':'').join('/', $out); + } return ($path[0]=='/'?'/':'').join('/', $out); } From c4b3556863e289f33d753fc3d42c83df35b7ae8c Mon Sep 17 00:00:00 2001 From: Jules Bousrez Date: Sun, 21 Dec 2025 11:44:31 +0100 Subject: [PATCH 2/7] feat: phpcs recommendations --- src/fpdm.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fpdm.php b/src/fpdm.php index 56c2b4e..751f378 100644 --- a/src/fpdm.php +++ b/src/fpdm.php @@ -1576,7 +1576,7 @@ function _set_text_value($stream,$value) { //--------------------------------------- $chunks=preg_split("/(\s*Td\s+[\<\(])([^\>\)]+)([\>\)]\s+Tj)/",$stream,0,PREG_SPLIT_DELIM_CAPTURE); $chunks[2]=$value; - $stream=implode($chunks,''); + $stream=implode('', $chunks); return $stream; } From 5f344af97ad79db46d9bb3a9f75c9a0ca2da10c5 Mon Sep 17 00:00:00 2001 From: Jules Bousrez Date: Sun, 21 Dec 2025 11:49:19 +0100 Subject: [PATCH 3/7] fix: FPDM:: is deprecated && Class FilterFlate not found --- src/fpdm.php | 11 ++++++----- src/output.pdf | Bin 0 -> 77290 bytes 2 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 src/output.pdf diff --git a/src/fpdm.php b/src/fpdm.php index 751f378..f8f7d34 100644 --- a/src/fpdm.php +++ b/src/fpdm.php @@ -48,12 +48,12 @@ //Major stream filters come from FPDI's stuff but I've added some :) if (!defined('FPDM_DIRECT')) { $FPDM_FILTERS = array("LZWDecode", "ASCIIHexDecode", "ASCII85Decode", "FlateDecode", "Standard" ); + require_once(__DIR__ . "/filters/FilterASCIIHex.php"); + require_once(__DIR__ . "/filters/FilterASCII85.php"); + require_once(__DIR__ . "/filters/FilterFlate.php"); + require_once(__DIR__ . "/filters/FilterLZW.php"); + require_once(__DIR__ . "/filters/FilterStandard.php"); } -// require_once("filters/FilterASCIIHex.php"); -// require_once("filters/FilterASCII85.php"); -// require_once("filters/FilterFlate.php"); -// require_once("filters/FilterLZW.php"); -// require_once("filters/FilterStandard.php"); if (!class_exists('FPDM', false)) { @@ -111,6 +111,7 @@ class FPDM { var $needAppearancesTrue = false; //boolean, indicates if /NeedAppearances is already set to true var $isUTF8 = false; //boolean (true for UTF-8, false for ISO-8859-1) + var $n = 0; //integer, Position counter for objects /** * Constructor diff --git a/src/output.pdf b/src/output.pdf new file mode 100644 index 0000000000000000000000000000000000000000..574a674ebd6dab9cf244cbe6870f701b8ee3a8db GIT binary patch literal 77290 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 Q4{p#~z5aSXXT|D&09L0QC;$Ke literal 0 HcmV?d00001 From f21472232136a857a700676733cf72c2040cd6d8 Mon Sep 17 00:00:00 2001 From: Jules Bousrez Date: Sun, 21 Dec 2025 11:54:48 +0100 Subject: [PATCH 4/7] docs: add PHP 8.5 fork notice to README --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index 531863a..439588b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,18 @@ # PDF Form Filling with FPDM +> **šŸ”€ Fork Notice** +> +> This is a **PHP 8.5 compatible fork** of [codeshell/fpdm](https://github.com/codeshell/fpdm). +> +> **Changes in this fork:** +> - Full PHP 8.5 compatibility +> - Replaced deprecated `create_function()` with closures +> - Fixed curly brace string access syntax (`$str{0}` → `$str[0]`) +> - Fixed deprecated `implode()` parameter order +> - Added missing class property declarations +> - Removed legacy PHP 4/5 compatibility code +> - Updated minimum PHP requirement to 8.0+ + ## Package The FPDM class allows to fill out PDF forms, i.e. populate fields of a PDF file. It is **developed by Olivier Plathey**, author of the [FDPF Library](http://www.fpdf.org/), and has been released as [Skript 93](http://www.fpdf.org/en/script/script93.php). From be8e3605370f009c006277f28911ab8054cb60e9 Mon Sep 17 00:00:00 2001 From: Jules Bousrez Date: Tue, 23 Dec 2025 08:33:19 +0100 Subject: [PATCH 5/7] feat: add indirect AP reference support for checkbox parser --- .DS_Store | Bin 0 -> 6148 bytes README.md | 173 ++++++++++++++++++------------------------------- src/.DS_Store | Bin 0 -> 6148 bytes src/ex.pdf | Bin 77214 -> 0 bytes src/fpdm.php | 119 ++++++++++++++++++++++++++++++++++ src/output.pdf | Bin 77290 -> 0 bytes 6 files changed, 183 insertions(+), 109 deletions(-) create mode 100644 .DS_Store create mode 100644 src/.DS_Store delete mode 100644 src/ex.pdf delete mode 100644 src/output.pdf diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..b6663fac72a7cbbc10064a5e9f512493e36b04c6 GIT binary patch literal 6148 zcmeHKPjAyO9R0a1Te@jd4@}wxDH7MJlz=87E?L(eCIN>9!2wWdn$U%1ah0~~p{kTK zd-ppZDzgC9!KF61_!qpQuGd4iaNy57|$G`#If+ znrYbw3LfJumE$m#A?iG!4eNk);NNzDzug9PXhI3iE8p)4`a0iLs735;c;HSbBS|^M zWsUe)(Hzhiyepa_pHU1&hu)(kDXS>I{f07yZcLYDWo=SXI`j_nMVPe%yr5~BPrR;A zTkG1TCv--qG@xe`(4fNpTwyoq9Ly8y(^FsvvqWWuxKmNovEH1CH?Ngb} zM@bgvN{~b`D6d~8StOS|xyYiK(gwQ2X*Qd~*3oL^d0yM~y2tCbyL#kx+wQ{$$Ln>| zIlO!C@%ivFy~^YV{BnfAp0DD-;0E{|Fsr!^@+_4ZKOtuC&^6wH49^DdPT3FT+O{8? z(JcNc2h8(xcn`2)9k32q2euvH{lP_I^bHmo)z*PbT>*d%G^;>a{q+aB+yL|q78=ol z5LybP_0623;8TL-KIWe4iI+T!zn z@ay}3S!8S00qekj<$!4PgMJT7GH2_J#qn9|BE3c8U|yk7NsyW2SQYpvK0;D~K9>tX V-(aB;EeQKZK-pk3>%d=i;0J5;zDxiB literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 439588b..23f89b5 100644 --- a/README.md +++ b/README.md @@ -1,151 +1,106 @@ -# PDF Form Filling with FPDM +# FPDM - PDF Form Data Merge -> **šŸ”€ Fork Notice** -> -> This is a **PHP 8.5 compatible fork** of [codeshell/fpdm](https://github.com/codeshell/fpdm). -> -> **Changes in this fork:** -> - Full PHP 8.5 compatibility -> - Replaced deprecated `create_function()` with closures -> - Fixed curly brace string access syntax (`$str{0}` → `$str[0]`) -> - Fixed deprecated `implode()` parameter order -> - Added missing class property declarations -> - Removed legacy PHP 4/5 compatibility code -> - Updated minimum PHP requirement to 8.0+ +A PHP library for filling PDF forms by merging data into form fields. -## Package +> **Fork Notice**: This is a **PHP 8.x compatible fork** of [codeshell/fpdm](https://github.com/codeshell/fpdm), originally based on [Olivier Plathey's FPDM script](http://www.fpdf.org/en/script/script93.php). -The FPDM class allows to fill out PDF forms, i.e. populate fields of a PDF file. It is **developed by Olivier Plathey**, author of the [FDPF Library](http://www.fpdf.org/), and has been released as [Skript 93](http://www.fpdf.org/en/script/script93.php). +## Features -I created this repository for the following reasons: +- Fill PDF text fields from PHP arrays or FDF files +- Checkbox support with automatic state detection +- PHP 8.0+ compatible +- No external dependencies (pure PHP) -- make the current FPDM source available via [composer](https://packagist.org/packages/tmw/fpdm), autoload via classmaps -- bugfixing - - FIX: compatibility issues with PHP 7.x [e376dc1](https://github.com/codeshell/fpdm/commit/e376dc157655ded24c61e098199586f3325d63c1) v2.9.1 - - FIX: filling forms in multiple files (wrong buffer usage, invalid offsets) [e376dc1](https://github.com/codeshell/fpdm/commit/e376dc157655ded24c61e098199586f3325d63c1) v2.9.1 - - FIX: convert ASCII object names to utf-8 [1eddba7](https://github.com/codeshell/fpdm/commit/1eddba76f610690821e8c0b3753df337a6cf65f7) v2.9.2 -- improvements (changes to the original codebase are prefixed with `//FIX: change description` and ended with `//ENDFIX`) - - ADD: support for checkboxes (disabled by default, activate with `$pdf->useCheckboxParser = true;`) [0375dd9](https://github.com/codeshell/fpdm/commit/0375dd95f05fd2d8d32d9ae1ab882fa0895b07b3) v2.9.2 - -## Version - -Based on version 2.9 (2017-05-11) available from [fpdf.org/en/script/script93.php](http://www.fpdf.org/en/script/script93.php). - -_Note: If you find that a new version has been hosted on fpdf.org, please do not hesitate to drop me [a short note](https://github.com/codeshell/fpdm/issues) to make sure I do not miss it out._ - -This repository only contains the separate php class written for form filling (FPD**M**). If you are looking for a repository containing the main FPD**F** Library, please head over to [github.com/Setasign/FPDF](https://github.com/Setasign/FPDF). - -Once again, all credits to Olivier Plathey for providing an easy to use script for form filling in addition to his FPDF library! - -## Installation +## Installation ### Composer -The preferred way of making FPDM available in your app is to install it via composer with - -`composer require tmw/fpdm` - -## Usage - -### Composer (autoload) - -[autoload](https://getcomposer.org/doc/01-basic-usage.md#autoloading) FPDM class files by adding this to your code: - -`require 'vendor/autoload.php';` - -### Standalone Script (legacy) - -Load the top level entry point by calling - -`require_once '/abolute/path/to/fpdm.php';` - -or - -`require_once './relative/path/to/fpdm.php';` +```bash +composer require tmw/fpdm +``` -## Customization to original code +### Manual -### classmaps vs. psr-4 (or: legacy code vs modern frameworks Ć” la Laravel) +```php +require_once 'path/to/fpdm.php'; +``` -Autoloading classes with [namespaces](https://www.php.net/manual/en/language.namespaces.basics.php) and following [PSR-4: Autoloader](https://www.php-fig.org/psr/psr-4/) would be desireable. Especially reducing the risk of naming conflicts by using vendor namespaces. +## Usage -However, FPDM has been around for a long time and as such is used in many projects that use non-namespaced code (I refer to them as legacy projects). Legacy projects instantiate FPDM by calling `$mypdf = new FPDM()` which is unqualified but defaults to the global namespace with non-namespaced code. +### Basic Text Fields -Using psr-4 would autoload the class to a subnamespace (e.g. \codeshell\fpdm\FPDM) instead of the global namespace (e.g. \FPDM) thus breaking any legacy code no matter if it used `new FPDM()` or `new \FPDM()`. +```php + 'John Doe', + 'address' => '123 Main St', + 'city' => 'New York', +); -That's my reasoning for using classmaps over psr-4 for FPDM. Please let me know if there are use cases where classmaps won't work with modern frameworks. +$pdf = new FPDM('template.pdf'); +$pdf->Load($fields, true); // true = UTF-8, false = ISO-8859-1 +$pdf->Merge(); +$pdf->Output('F', 'filled.pdf'); // Save to file +``` ### Checkboxes -I added support for checkboxes. The feature is not heavily tested but works for me. Can be enabled with `useCheckboxParser = true` like so: +Enable checkbox support to toggle checkboxes in your PDF forms: ```php 'anything that evaluates to true.', // checkbox will be checked; Careful, that includes ANY non-empty string (even "no" or "unchecked") - 'another_checkbox' => false, // checkbox will be UNchecked; empty string or 0 work as well + 'agree_terms' => true, // Checked + 'newsletter' => false, // Unchecked ); -$pdf = new FPDM('template.pdf'); -$pdf->useCheckboxParser = true; // Checkbox parsing is ignored (default FPDM behaviour) unless enabled with this setting +$pdf = new FPDM('form.pdf'); +$pdf->useCheckboxParser = true; // Enable checkbox support $pdf->Load($fields, true); $pdf->Merge(); $pdf->Output(); ``` -You don't have to figure out the technical names of checkbox states. They are retrieved during the parsing process. +Checkbox state names (e.g., `Yes`/`Off`, `Oui`/`Off`) are automatically detected during parsing. -## Original Info Page -_Everything below is mirrored from http://www.fpdf.org/en/script/script93.php ._ +## Output Options -### Information - -Author: Olivier - -License: FPDF - -### Description - -This script allows to merge data into a PDF form. Given a template PDF with text fields, it's -possible to inject values in two different ways: - -- from a PHP array -- from an FDF file +```php +$pdf->Output(); // Send to browser (inline) +$pdf->Output('D', 'f.pdf'); // Force download +$pdf->Output('F', 'f.pdf'); // Save to file +$pdf->Output('S'); // Return as string +``` -The resulting document is produced by the Output() method, which works the same as for FPDF. +## Debugging -Note: if your template PDF is not compatible with this script, you can process it with -[PDFtk](https://www.pdflabs.com/tools/pdftk-server/) this way: +Enable verbose mode to see parsing details: -`pdftk modele.pdf output modele2.pdf` +```php +$pdf->set_modes('verbose', true); +$pdf->set_modes('verbose_level', 3); // 1-4, higher = more detail +``` -Then try again with modele2.pdf. +> **Note**: Disable verbose mode before generating PDF output. -### Example +## Fork Changes -This example shows how to merge data from an array: +This fork includes: -```php - 'My name', - 'address' => 'My address', - 'city' => 'My city', - 'phone' => 'My phone number' -); +- **Original Author**: [Olivier Plathey](http://www.fpdf.org/) (FPDM v2.9) +- **Upstream Fork**: [codeshell/fpdm](https://github.com/codeshell/fpdm) -$pdf = new FPDM('template.pdf'); -$pdf->Load($fields, false); // second parameter: false if field values are in ISO-8859-1, true if UTF-8 -$pdf->Merge(); -$pdf->Output(); -?> -``` +## License -View the result [here](http://www.fpdf.org/en/script/ex93.pdf). +FPDF License diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..157209d57a45af4756ec627f545bf283e245a779 GIT binary patch literal 6148 zcmeHK%}N6?5T3L}OYNZ-!AoJmvjyK^E%o5p2hg_LYGLax{egPhyYJvD_iF6s7;8D0QBn;CYbie;2*j(V6UEE98&pT}t;v_o!2hyBe=+Sahz!WGd(DaWzKL0QG-~Wpw zdol$~fq$idYmKf)LkvmJ*2>`ctPPNEk=VFh=20lf^f;CRAH^p~Vt5yD0T?P~9#I3c O9|4iUGE?AJ6?g|yjK`t? literal 0 HcmV?d00001 diff --git a/src/ex.pdf b/src/ex.pdf deleted file mode 100644 index 62eb154da95c6e061a6786356d059c4e0144ea79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77214 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 diff --git a/src/fpdm.php b/src/fpdm.php index f8f7d34..c82311f 100644 --- a/src/fpdm.php +++ b/src/fpdm.php @@ -91,6 +91,7 @@ class FPDM { var $streams = ''; //Holds streams configuration found during parsing var $streams_filter = ''; //Regexp to decode filter streams + var $ap_objects = array(); //Maps object IDs to their checkbox state names for indirect /AP references var $safe_mode = false; //boolean, if set, ignore previous offsets do no calculations for the new xref table, seek pos directly in file var $check_mode = false; //boolean, Use this to track offset calculations errors in corrupteds pdfs files for sample @@ -981,6 +982,105 @@ public function set_field_checkbox($name, $value) } return $offset_shift; } + + /** + * Resolves checkbox state names from an indirect /AP reference + * Looks up the referenced object and extracts state names from /N dictionary + * + * @param int $ap_ref_id The object ID referenced by /AP + * @return array|false Array with 'yes' and 'no' state names, or false if not found + */ + private function resolveIndirectAP($ap_ref_id) { + // Check if already resolved + if (isset($this->ap_objects[$ap_ref_id])) { + return $this->ap_objects[$ap_ref_id]; + } + + $verbose_parsing = ($this->verbose && ($this->verbose_level > 3)); + $entries = &$this->pdf_entries; + $countLines = count($entries); + + // Find the AP object (e.g., "101 0 obj") + $ap_obj_pattern = "/^" . $ap_ref_id . " 0 obj/"; + $n_ref_id = 0; + + for ($i = 0; $i < $countLines; $i++) { + if (preg_match($ap_obj_pattern, $entries[$i])) { + if ($verbose_parsing) { + echo "
Found AP object $ap_ref_id at line $i"; + } + // Look for /N reference within this object (next few lines) + for ($j = $i + 1; $j < min($i + 10, $countLines); $j++) { + if (preg_match("/^\\/N\\s+(\\d+)\\s+0\\s+R/", $entries[$j], $match)) { + $n_ref_id = intval($match[1]); + if ($verbose_parsing) { + echo "
Found /N reference to object $n_ref_id"; + } + break; + } + if (preg_match("/^endobj/", $entries[$j])) { + break; // End of object, /N not found + } + } + break; + } + } + + if (!$n_ref_id) { + if ($verbose_parsing) { + echo "
Could not find /N reference in AP object $ap_ref_id"; + } + return false; + } + + // Find the N object (contains the state names) + $n_obj_pattern = "/^" . $n_ref_id . " 0 obj/"; + $state_yes = ''; + $state_no = ''; + + for ($i = 0; $i < $countLines; $i++) { + if (preg_match($n_obj_pattern, $entries[$i])) { + if ($verbose_parsing) { + echo "
Found N object $n_ref_id at line $i"; + } + // Look for state names within this object (next few lines) + for ($j = $i + 1; $j < min($i + 10, $countLines); $j++) { + // Match state names like "/Oui 137 0 R" or "/Off 138 0 R" or "/Yes 5 0 R" + if (preg_match("/^\\/(\\w+)\\s+\\d+\\s+0\\s+R/", $entries[$j], $match)) { + $state_name = $match[1]; + // "Off" is typically the unchecked state + if (strtolower($state_name) === 'off') { + $state_no = $state_name; + } else { + // Any other state is considered the "checked" state + $state_yes = $state_name; + } + if ($verbose_parsing) { + echo "
Found state name: $state_name"; + } + } + if (preg_match("/^endobj/", $entries[$j]) || preg_match("/^>>/", $entries[$j])) { + break; // End of object + } + } + break; + } + } + + if ($state_yes && $state_no) { + $result = array('yes' => $state_yes, 'no' => $state_no); + $this->ap_objects[$ap_ref_id] = $result; + if ($verbose_parsing) { + echo "
Resolved AP $ap_ref_id: yes='$state_yes', no='$state_no'"; + } + return $result; + } + + if ($verbose_parsing) { + echo "
Could not resolve checkbox states for AP object $ap_ref_id (yes='$state_yes', no='$state_no')"; + } + return false; + } //ENDFIX /** @@ -1851,6 +1951,25 @@ function parsePDFEntries(&$lines){ echo("
Found AP Line '$Counter'"); } $ap_line = $Counter; + + // Check if this is an indirect reference (e.g., /AP 101 0 R) + if (preg_match("/^\\/AP\\s+(\\d+)\\s+0\\s+R/", $CurLine, $ap_match)) { + $ap_ref_id = intval($ap_match[1]); + if ($verbose_parsing) { + echo("
Found indirect AP reference to object $ap_ref_id"); + } + // Resolve the indirect reference to get checkbox state names + $resolved = $this->resolveIndirectAP($ap_ref_id); + if ($resolved) { + $ap_d_yes = $resolved['yes']; + $ap_d_no = $resolved['no']; + $object["infos"]["checkbox_yes"] = $ap_d_yes; + $object["infos"]["checkbox_no"] = $ap_d_no; + if ($verbose_parsing) { + echo("
Resolved checkbox states: yes='$ap_d_yes', no='$ap_d_no'"); + } + } + } } elseif (!$ap_d_line && '/D' == substr($CurLine, 0, 2)) { if ($verbose_parsing) { echo("
Found D Line '$Counter'"); diff --git a/src/output.pdf b/src/output.pdf deleted file mode 100644 index 574a674ebd6dab9cf244cbe6870f701b8ee3a8db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77290 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 Q4{p#~z5aSXXT|D&09L0QC;$Ke From 2b8deee0b97f4e7f60f73fc262605ce0e4923be8 Mon Sep 17 00:00:00 2001 From: Jules Bousrez Date: Sat, 27 Dec 2025 18:17:13 +0100 Subject: [PATCH 6/7] feat: natively flatten pdf by making fields read-only --- src/ex-array.php | 3 +- src/fpdm.php | 168 +++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 165 insertions(+), 6 deletions(-) diff --git a/src/ex-array.php b/src/ex-array.php index 657c062..95524f9 100644 --- a/src/ex-array.php +++ b/src/ex-array.php @@ -15,6 +15,7 @@ $pdf = new FPDM('template.pdf'); $pdf->Load($fields, false); // second parameter: false if field values are in ISO-8859-1, true if UTF-8 +$pdf->Flatten(); $pdf->Merge(); -$pdf->Output(); +$pdf->Output('F', 'output.pdf'); ?> diff --git a/src/fpdm.php b/src/fpdm.php index c82311f..e52fa04 100644 --- a/src/fpdm.php +++ b/src/fpdm.php @@ -358,11 +358,164 @@ function Uncompress() { } /** *Activates the flatten output to remove form from pdf file keeping field datas. + *@note Now supports native flattening without pdftk **/ function Flatten() { //----------------- $this->set_modes('flatten',true); - $this->support="pdftk"; + // Native support is maintained - no longer forces pdftk + } + + /** + *Flattens all form fields by making them read-only + * + *@access private + *@note This is called after values have been merged to make fields non-editable + *@note This approach sets the ReadOnly flag (Ff bit 1) on all fields to prevent editing + * while preserving the field structure needed for value rendering + **/ + function flattenFields() { + //------------------------ + $entries = &$this->pdf_entries; + $countLines = count($entries); + $verbose_flatten = ($this->verbose && ($this->verbose_level > 1)); + + if($verbose_flatten) $this->dumpContent("Starting native flatten process", "Flatten"); + + $in_widget = false; + $current_obj = 0; + $widget_start_line = 0; + $ff_found = false; + $modified_count = 0; + $widgets_to_add_ff = array(); // Widgets that don't have /Ff line + + // First pass: Find all widgets and set read-only flag + for ($i = 0; $i < $countLines; $i++) { + $line = $entries[$i]; + + // Track object boundaries + if (preg_match("/^(\d+) (\d+) obj/", $line, $match)) { + // If we were in a widget that had no /Ff, remember to add it + if ($in_widget && !$ff_found && $widget_start_line > 0) { + $widgets_to_add_ff[] = $widget_start_line; + } + $current_obj = intval($match[1]); + $in_widget = false; + $ff_found = false; + $widget_start_line = 0; + } + + // Detect Widget subtype (form field annotation) + if (preg_match("/\/Subtype\s*\/Widget/", $line)) { + $in_widget = true; + $widget_start_line = $i; + if($verbose_flatten) $this->dumpContent("Found Widget annotation in object $current_obj at line $i", "Flatten"); + } + + // Inside a widget - modify field flags for flattening + if ($in_widget && $current_obj > 0) { + // Set read-only flag (Ff bit 1 = ReadOnly) + if (preg_match("/^\/Ff\s+(\d+)/", $line, $match)) { + $ff_found = true; + $old_len = strlen($line); + $flags = intval($match[1]) | 1; // Set bit 1 (ReadOnly) + $entries[$i] = '/Ff ' . $flags; + $this->shift += strlen($entries[$i]) - $old_len; + $modified_count++; + if($verbose_flatten) $this->dumpContent("Set read-only flag at line $i (flags=$flags)", "Flatten"); + } + } + + // End of object - check if we need to add /Ff + if (preg_match("/^endobj/", $line)) { + if ($in_widget && !$ff_found && $widget_start_line > 0) { + $widgets_to_add_ff[] = $widget_start_line; + } + $in_widget = false; + $current_obj = 0; + $ff_found = false; + } + } + + // Second pass: Add /Ff 1 to widgets that don't have it + // We insert after the /Subtype /Widget line + foreach ($widgets_to_add_ff as $widget_line) { + $old_line = $entries[$widget_line]; + $new_line = $old_line . "\n/Ff 1"; + $entries[$widget_line] = $new_line; + $this->shift += strlen($new_line) - strlen($old_line); + $modified_count++; + if($verbose_flatten) $this->dumpContent("Added /Ff 1 after line $widget_line", "Flatten"); + } + + if($verbose_flatten) $this->dumpContent("Flatten complete. Modified $modified_count field(s) to read-only", "Flatten"); + } + + /** + *Removes the AcroForm dictionary reference from the document catalog + * + *@access private + *@note This disables form functionality at the document level + **/ + function removeAcroForm() { + //------------------------ + $entries = &$this->pdf_entries; + $countLines = count($entries); + $verbose_flatten = ($this->verbose && ($this->verbose_level > 1)); + + $in_catalog = false; + $acroform_removed = false; + + for ($i = 0; $i < $countLines; $i++) { + $line = $entries[$i]; + + // Find the Catalog object + if (preg_match("/\/Type\s*\/Catalog/", $line)) { + $in_catalog = true; + if($verbose_flatten) $this->dumpContent("Found Catalog at line $i", "Flatten"); + } + + // If in catalog, look for AcroForm reference + if ($in_catalog) { + // Match /AcroForm with object reference (e.g., /AcroForm 5 0 R) + if (preg_match("/\/AcroForm\s+\d+\s+\d+\s+R/", $line)) { + $old_len = strlen($line); + // Remove the AcroForm reference from this line + $new_line = preg_replace("/\/AcroForm\s+\d+\s+\d+\s+R\s*/", "", $line); + $entries[$i] = $new_line; + $this->shift += strlen($new_line) - $old_len; + $acroform_removed = true; + if($verbose_flatten) $this->dumpContent("Removed /AcroForm reference at line $i", "Flatten"); + } + // Also handle inline AcroForm dictionary (less common) + if (preg_match("/^\/AcroForm\s*<shift -= $old_len; + $acroform_removed = true; + if($verbose_flatten) $this->dumpContent("Removed inline /AcroForm at line $i", "Flatten"); + } + + // Also remove /NeedAppearances if present (cleanup) + if (preg_match("/\/NeedAppearances\s+(true|false)/", $line)) { + $old_len = strlen($line); + $new_line = preg_replace("/\/NeedAppearances\s+(true|false)\s*/", "", $line); + $entries[$i] = $new_line; + $this->shift += strlen($new_line) - $old_len; + if($verbose_flatten) $this->dumpContent("Removed /NeedAppearances at line $i", "Flatten"); + } + } + + // Stop when we exit the catalog object + if ($in_catalog && preg_match("/^endobj/", $line)) { + $in_catalog = false; + if ($acroform_removed) break; // We're done + } + } + + if($verbose_flatten && !$acroform_removed) { + $this->dumpContent("Warning: /AcroForm reference not found in Catalog", "Flatten"); + } } /*** @@ -464,13 +617,12 @@ function Allow($permissions=null) { //############################# - /** + /** *Merge FDF file with a PDF file * *@access public *@note files has been provided during the instantiation of this class - *@internal flatten mode is not yet supported - *@param Boolean flatten Optional, false by default, if true will use pdftk (requires a shell) to flatten the pdf form + *@param Boolean flatten Optional, false by default, if true will flatten the pdf form (now supported natively) **/ function Merge($flatten=false) { //------------------------------ @@ -490,7 +642,7 @@ function Merge($flatten=false) { if($this->verbose&&($count_fields==0)) $this->dumpContent("The FDF content has either no field data or parsing may failed","FDF parser: "); - + $fields_value_definition_lines=array(); $count_entries=$this->parsePDFEntries($fields_value_definition_lines); @@ -512,6 +664,12 @@ function Merge($flatten=false) { } } //=========================================================== + + //==== Native flatten: remove form field interactivity ===== + if($this->flatten_mode) { + $this->flattenFields(); + } + //=========================================================== //===== Cross refs/size fixes (offsets calculations for objects have been previously be done in set_field_value) ======= From 7a549f8524406d4e0284ba8f2fa43f8887a11d34 Mon Sep 17 00:00:00 2001 From: Jules Bousrez Date: Sat, 27 Dec 2025 18:19:57 +0100 Subject: [PATCH 7/7] docs: flattening info --- .DS_Store | Bin 6148 -> 6148 bytes README.md | 20 ++++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/.DS_Store b/.DS_Store index b6663fac72a7cbbc10064a5e9f512493e36b04c6..9decb4b9f7bc9bb87a6653ef210f045a8359620e 100644 GIT binary patch delta 34 pcmZoMXffEZla-Nu@-EhBeh$uf0g38rBXdg~1!Du#%_?jU1OcyL34H(n delta 34 pcmZoMXffEZla-NU@-EhBeooGK0g38rBO@an1tSBq%_?jU1OcxD33C7d diff --git a/README.md b/README.md index 23f89b5..5249d53 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ A PHP library for filling PDF forms by merging data into form fields. - Fill PDF text fields from PHP arrays or FDF files - Checkbox support with automatic state detection +- Native form flattening (experimental) - make fields read-only without external tools - PHP 8.0+ compatible - No external dependencies (pure PHP) @@ -65,6 +66,24 @@ $pdf->Output(); Checkbox state names (e.g., `Yes`/`Off`, `Oui`/`Off`) are automatically detected during parsing. +### Flatten (Experimental) + +Make form fields read-only after filling to prevent users from editing: + +```php +Load(['name' => 'John Doe']); +$pdf->Flatten(); // Enable flatten mode +$pdf->Merge(); +$pdf->Output('F', 'flattened.pdf'); + +// Or use shorthand: +$pdf->Merge(true); // true = flatten +``` + +> **āš ļø Experimental**: This feature sets the ReadOnly flag on all form fields. The form structure is preserved but fields cannot be edited. This is a native PHP implementation that doesn't require external tools like pdftk. + ## Output Options ```php @@ -91,6 +110,7 @@ This fork includes: - Full PHP 8.0 - 8.5 compatibility - Enhanced checkbox parser with support for indirect `/AP` references +- Native form flattening (experimental) - sets ReadOnly flags without requiring pdftk - Replaced deprecated `create_function()` with closures - Fixed curly brace string access syntax - Fixed `implode()` parameter order