Skip to content

Commit f983f29

Browse files
authored
Merge pull request #9 from benconda/field-flags
chore: add form field flags handling
2 parents d551eff + 75ba466 commit f983f29

File tree

5 files changed

+106
-3
lines changed

5 files changed

+106
-3
lines changed

include/pdfium.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -734,6 +734,10 @@ FPDFAnnot_GetLinkedAnnot(FPDF_ANNOTATION annot, FPDF_BYTESTRING key);
734734
int
735735
FPDFAnnot_GetFormFieldFlags(FPDF_FORMHANDLE handle,
736736
FPDF_ANNOTATION annot);
737+
FPDF_BOOL
738+
FPDFAnnot_SetFormFieldFlags(FPDF_FORMHANDLE handle,
739+
FPDF_ANNOTATION annot,
740+
int flags);
737741
FPDF_ANNOTATION
738742
FPDFAnnot_GetFormFieldAtPoint(FPDF_FORMHANDLE hHandle,
739743
FPDF_PAGE page,

src/Page/Annotation/FormField.php

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public function getExportValue(): string
6060
return $this->getFormText('FPDFAnnot_GetFormFieldExportValue');
6161
}
6262

63-
public function isChecked()
63+
public function isChecked(): bool
6464
{
6565
return (bool) $this->ffi->FPDFAnnot_IsChecked($this->getFormHandler(), $this->handler);
6666
}
@@ -75,6 +75,21 @@ public function getFormControlIndex(): int
7575
return $this->ffi->FPDFAnnot_GetFormControlIndex($this->getFormHandler(), $this->handler);
7676
}
7777

78+
public function getFieldFlags(): FormFieldFlagList
79+
{
80+
$flags = $this->ffi->FPDFAnnot_GetFormFieldFlags($this->getFormHandler(), $this->handler);
81+
82+
return new FormFieldFlagList($flags);
83+
}
84+
85+
/**
86+
* Added in pdfium version 138.0.7188.0
87+
*/
88+
public function setFieldFlags(FormFieldFlagList $flags): bool
89+
{
90+
return 1 === $this->ffi->FPDFAnnot_SetFormFieldFlags($this->getFormHandler(), $this->handler, $flags->flags);
91+
}
92+
7893
private function getFormText(string $methodName): string
7994
{
8095
$formHandler = $this->getFormHandler();
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace BenConda\PhpPdfium\Page\Annotation;
6+
7+
enum FormFieldFlag: int
8+
{
9+
// Common flags
10+
case READ_ONLY = (1 << 0);
11+
case REQUIRED = (1 << 1);
12+
case NO_EXPORT = (1 << 2);
13+
14+
// TextFieldFlags
15+
case MULTILINE = (1 << 13);
16+
case PASSWORD = (1 << 14);
17+
case FILE_SELECT = (1 << 21);
18+
case DO_NOT_SPELL_CHECK = (1 << 23);
19+
case DO_NOT_SCROLL = (1 << 24);
20+
case COMB = (1 << 25);
21+
case RICH_TEXT = (1 << 26);
22+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
3+
namespace BenConda\PhpPdfium\Page\Annotation;
4+
5+
class FormFieldFlagList
6+
{
7+
8+
/**
9+
* @param int $flags
10+
*/
11+
public function __construct(
12+
public int $flags,
13+
)
14+
{
15+
}
16+
17+
public function hasFlag(FormFieldFlag $flag): bool
18+
{
19+
return ($this->flags & $flag->value) === $flag->value;
20+
}
21+
22+
/**
23+
* @return list<FormFieldFlag>
24+
*/
25+
public function list(): array
26+
{
27+
if ($this->flags === 0) {
28+
return [];
29+
}
30+
31+
$flags = [];
32+
foreach (FormFieldFlag::cases() as $flag) {
33+
if ($this->hasFlag($flag)) {
34+
$flags[] = $flag;
35+
}
36+
}
37+
38+
return $flags;
39+
}
40+
41+
public function withFlag(FormFieldFlag $flag): self
42+
{
43+
return new self($this->flags | $flag->value);
44+
}
45+
46+
public function withoutFlag(FormFieldFlag $flag): self
47+
{
48+
return new self($this->flags & ~$flag->value);
49+
}
50+
}

tests/unit/AnnotationTest.php

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
namespace BenCondaTest\PhpPdfium;
66

77
use BenConda\PhpPdfium\DocumentSaveFlags;
8-
use BenConda\PhpPdfium\Page\Annotation\Annotation;
98
use BenConda\PhpPdfium\Page\Annotation\FormField;
9+
use BenConda\PhpPdfium\Page\Annotation\FormFieldFlag;
1010
use BenConda\PhpPdfium\Page\Annotation\FormFieldType;
1111
use BenConda\PhpPdfium\Page\PageCoordRectangle;
1212
use PHPUnit\Framework\TestCase;
@@ -20,9 +20,21 @@ public function testGetAnnotation(): void
2020
$cerfaDoc = $this->loadDocument('cerfa_13750-05');
2121
$firstPage = $cerfaDoc->loadPage(0);
2222
$annot = $firstPage->loadAnnotation(13);
23-
self::assertInstanceOf(Annotation::class, $annot);
23+
self::assertInstanceOf(FormField::class, $annot);
2424
$rect = $annot->getRectangle();
2525
self::assertInstanceOf(PageCoordRectangle::class, $rect);
26+
$flags = $annot->getFieldFlags();
27+
self::assertTrue($flags->hasFlag(FormFieldFlag::DO_NOT_SPELL_CHECK));
28+
self::assertContainsOnlyInstancesOf(FormFieldFlag::class, $flags->list());
29+
self::assertCount(1, $flags->list());
30+
31+
$newFlags = $flags->withFlag(FormFieldFlag::READ_ONLY);
32+
self::assertTrue($newFlags->hasFlag(FormFieldFlag::READ_ONLY));
33+
self::assertNotSame($newFlags, $flags);
34+
35+
$annot->setFieldFlags($newFlags);
36+
$updatedFlags = $annot->getFieldFlags();
37+
self::assertSame($newFlags->list(), $updatedFlags->list());
2638
}
2739

2840
public function testMoveAnnotation(): void

0 commit comments

Comments
 (0)