@pdfme/pdf-lib 6.0.3 → 6.0.4-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{src/api/Embeddable.ts → dist/api/Embeddable.d.ts} +1 -1
- package/dist/api/PDFDocument.d.ts +778 -0
- package/dist/api/PDFDocumentOptions.d.ts +38 -0
- package/dist/api/PDFEmbeddedFile.d.ts +38 -0
- package/dist/api/PDFEmbeddedPage.d.ts +73 -0
- package/dist/api/PDFFont.d.ts +94 -0
- package/dist/api/PDFImage.d.ts +95 -0
- package/dist/api/PDFJavaScript.d.ts +38 -0
- package/dist/api/PDFPage.d.ts +910 -0
- package/dist/api/PDFPageOptions.d.ts +172 -0
- package/dist/api/StandardFonts.d.ts +16 -0
- package/dist/api/colors.d.ts +34 -0
- package/dist/api/errors.d.ts +42 -0
- package/dist/api/form/PDFButton.d.ts +137 -0
- package/dist/api/form/PDFCheckBox.d.ts +142 -0
- package/dist/api/form/PDFDropdown.d.ts +402 -0
- package/dist/api/form/PDFField.d.ts +203 -0
- package/dist/api/form/PDFForm.d.ts +411 -0
- package/dist/api/form/PDFOptionList.d.ts +335 -0
- package/dist/api/form/PDFRadioGroup.d.ts +252 -0
- package/dist/api/form/PDFSignature.d.ts +29 -0
- package/dist/api/form/PDFTextField.d.ts +537 -0
- package/dist/api/form/appearances.d.ts +41 -0
- package/dist/api/image/alignment.d.ts +5 -0
- package/dist/api/objects.d.ts +4 -0
- package/dist/api/operations.d.ts +226 -0
- package/dist/api/operators.d.ts +90 -0
- package/dist/api/rotations.d.ts +38 -0
- package/dist/api/sizes.d.ts +52 -0
- package/dist/api/svg.d.ts +70 -0
- package/dist/api/svgPath.d.ts +2 -0
- package/dist/api/text/alignment.d.ts +5 -0
- package/dist/api/text/layout.d.ts +54 -0
- package/dist/core/PDFContext.d.ts +84 -0
- package/dist/core/PDFObjectCopier.d.ts +37 -0
- package/dist/core/acroform/PDFAcroButton.d.ts +21 -0
- package/dist/core/acroform/PDFAcroCheckBox.d.ts +13 -0
- package/dist/core/acroform/PDFAcroChoice.d.ts +20 -0
- package/dist/core/acroform/PDFAcroComboBox.d.ts +9 -0
- package/dist/core/acroform/PDFAcroField.d.ts +36 -0
- package/dist/core/acroform/PDFAcroForm.d.ts +20 -0
- package/dist/core/acroform/PDFAcroListBox.d.ts +9 -0
- package/dist/core/acroform/PDFAcroNonTerminal.d.ts +13 -0
- package/dist/core/acroform/PDFAcroPushButton.d.ts +9 -0
- package/dist/core/acroform/PDFAcroRadioButton.d.ts +13 -0
- package/{src/core/acroform/PDFAcroSignature.ts → dist/core/acroform/PDFAcroSignature.d.ts} +2 -4
- package/dist/core/acroform/PDFAcroTerminal.d.ts +16 -0
- package/dist/core/acroform/PDFAcroText.d.ts +22 -0
- package/dist/core/acroform/flags.d.ts +141 -0
- package/dist/core/acroform/utils.d.ts +6 -0
- package/dist/core/annotation/AppearanceCharacteristics.d.ts +33 -0
- package/dist/core/annotation/BorderStyle.d.ts +11 -0
- package/dist/core/annotation/PDFAnnotation.d.ts +51 -0
- package/dist/core/annotation/PDFWidgetAnnotation.d.ts +26 -0
- package/dist/core/annotation/flags.d.ts +79 -0
- package/dist/core/crypto.d.ts +95 -0
- package/dist/core/document/PDFCrossRefSection.d.ts +27 -0
- package/dist/core/document/PDFHeader.d.ts +10 -0
- package/dist/core/document/PDFTrailer.d.ts +9 -0
- package/dist/core/document/PDFTrailerDict.d.ts +10 -0
- package/dist/core/embedders/CMap.d.ts +3 -0
- package/dist/core/embedders/CustomFontEmbedder.d.ts +44 -0
- package/dist/core/embedders/CustomFontSubsetEmbedder.d.ts +20 -0
- package/dist/core/embedders/FileEmbedder.d.ts +33 -0
- package/dist/core/embedders/FontFlags.d.ts +13 -0
- package/dist/core/embedders/JavaScriptEmbedder.d.ts +10 -0
- package/dist/core/embedders/JpegEmbedder.d.ts +23 -0
- package/dist/core/embedders/PDFPageEmbedder.d.ts +37 -0
- package/dist/core/embedders/PngEmbedder.d.ts +19 -0
- package/dist/core/embedders/StandardFontEmbedder.d.ts +36 -0
- package/dist/core/errors.d.ts +94 -0
- package/{src/core/index.ts → dist/core/index.d.ts} +1 -17
- package/dist/core/interactive/ViewerPreferences.d.ts +347 -0
- package/dist/core/objects/PDFArray.d.ts +63 -0
- package/dist/core/objects/PDFBool.d.ts +13 -0
- package/dist/core/objects/PDFDict.d.ts +62 -0
- package/dist/core/objects/PDFHexString.d.ts +16 -0
- package/dist/core/objects/PDFInvalidObject.d.ts +11 -0
- package/dist/core/objects/PDFName.d.ts +41 -0
- package/dist/core/objects/PDFNull.d.ts +10 -0
- package/dist/core/objects/PDFNumber.d.ts +15 -0
- package/dist/core/objects/PDFObject.d.ts +8 -0
- package/dist/core/objects/PDFRawStream.d.ts +16 -0
- package/dist/core/objects/PDFRef.d.ts +13 -0
- package/dist/core/objects/PDFStream.d.ts +16 -0
- package/dist/core/objects/PDFString.d.ts +16 -0
- package/dist/core/operators/PDFOperator.d.ts +19 -0
- package/dist/core/operators/PDFOperatorNames.d.ts +76 -0
- package/dist/core/parser/BaseParser.d.ts +14 -0
- package/dist/core/parser/ByteStream.d.ts +26 -0
- package/dist/core/parser/PDFObjectParser.d.ts +31 -0
- package/dist/core/parser/PDFObjectStreamParser.d.ts +13 -0
- package/dist/core/parser/PDFParser.d.ts +46 -0
- package/dist/core/parser/PDFXRefStreamParser.d.ts +21 -0
- package/dist/core/streams/Ascii85Stream.d.ts +9 -0
- package/dist/core/streams/AsciiHexStream.d.ts +9 -0
- package/dist/core/streams/DecodeStream.d.ts +26 -0
- package/dist/core/streams/DecryptStream.d.ts +12 -0
- package/dist/core/streams/FlateStream.d.ts +13 -0
- package/dist/core/streams/LZWStream.d.ts +12 -0
- package/dist/core/streams/RunLengthStream.d.ts +8 -0
- package/dist/core/streams/Stream.d.ts +34 -0
- package/dist/core/streams/decode.d.ts +3 -0
- package/dist/core/structures/PDFCatalog.d.ts +27 -0
- package/dist/core/structures/PDFContentStream.d.ts +15 -0
- package/dist/core/structures/PDFCrossRefStream.d.ts +53 -0
- package/dist/core/structures/PDFFlateStream.d.ts +13 -0
- package/dist/core/structures/PDFObjectStream.d.ts +20 -0
- package/dist/core/structures/PDFPageLeaf.d.ts +54 -0
- package/dist/core/structures/PDFPageTree.d.ts +41 -0
- package/dist/core/syntax/CharCodes.d.ts +61 -0
- package/dist/core/syntax/Delimiters.d.ts +1 -0
- package/dist/core/syntax/Irregular.d.ts +1 -0
- package/dist/core/syntax/Keywords.d.ts +22 -0
- package/dist/core/syntax/Numeric.d.ts +3 -0
- package/dist/core/syntax/Whitespace.d.ts +1 -0
- package/dist/core/writers/PDFStreamWriter.d.ts +19 -0
- package/dist/core/writers/PDFWriter.d.ts +29 -0
- package/dist/index.js +19124 -0
- package/dist/index.js.map +1 -0
- package/dist/types/fontkit.d.ts +597 -0
- package/{src/types/index.ts → dist/types/index.d.ts} +8 -13
- package/{src/types/matrix.ts → dist/types/matrix.d.ts} +1 -2
- package/dist/utils/Cache.d.ts +10 -0
- package/dist/utils/arrays.d.ts +16 -0
- package/dist/utils/async.d.ts +5 -0
- package/dist/utils/base64.d.ts +10 -0
- package/dist/utils/elements/Arc.d.ts +22 -0
- package/dist/utils/elements/Circle.d.ts +14 -0
- package/dist/utils/elements/Ellipse.d.ts +20 -0
- package/dist/utils/elements/GraphElement.d.ts +6 -0
- package/dist/utils/elements/Line.d.ts +23 -0
- package/dist/utils/elements/Plot.d.ts +11 -0
- package/dist/utils/elements/Point.d.ts +18 -0
- package/dist/utils/elements/Rectangle.d.ts +21 -0
- package/dist/utils/elements/Segment.d.ts +19 -0
- package/dist/utils/errors.d.ts +1 -0
- package/dist/utils/intersections.d.ts +9 -0
- package/dist/utils/maths.d.ts +45 -0
- package/dist/utils/numbers.d.ts +23 -0
- package/dist/utils/objects.d.ts +15 -0
- package/dist/utils/pdfDocEncoding.d.ts +7 -0
- package/dist/utils/png.d.ts +17 -0
- package/dist/utils/rng.d.ts +13 -0
- package/dist/utils/strings.d.ts +25 -0
- package/{src/utils/unicode.ts → dist/utils/unicode.d.ts} +8 -195
- package/dist/utils/validators.d.ts +26 -0
- package/package.json +6 -1
- package/__tests__/api/PDFDocument.spec.ts +0 -576
- package/__tests__/api/PDFImage.spec.ts +0 -60
- package/__tests__/api/PDFPage.spec.ts +0 -151
- package/__tests__/api/form/PDFCheckBox.spec.ts +0 -71
- package/__tests__/api/form/PDFDropdown.spec.ts +0 -118
- package/__tests__/api/form/PDFForm.spec.ts +0 -370
- package/__tests__/api/form/PDFOptionList.spec.ts +0 -104
- package/__tests__/api/form/PDFRadioGroup.spec.ts +0 -183
- package/__tests__/api/form/PDFTextField.spec.ts +0 -148
- package/__tests__/api/svgPath.spec.ts +0 -153
- package/__tests__/api/text/layout.spec.ts +0 -166
- package/__tests__/core/PDFContext.spec.ts +0 -194
- package/__tests__/core/PDFObjectCopier.spec.ts +0 -421
- package/__tests__/core/acroform/PDFAcroField.spec.ts +0 -98
- package/__tests__/core/acroform/PDFAcroTerminal.spec.ts +0 -39
- package/__tests__/core/annotation/PDFWidgetAnnotation.spec.ts +0 -40
- package/__tests__/core/document/PDFCrossRefSection.spec.ts +0 -88
- package/__tests__/core/document/PDFHeader.spec.ts +0 -22
- package/__tests__/core/document/PDFTrailer.spec.ts +0 -28
- package/__tests__/core/document/PDFTrailerDict.spec.ts +0 -24
- package/__tests__/core/embedders/CMap.spec.ts +0 -47
- package/__tests__/core/embedders/CustomFontEmbedder.spec.ts +0 -96
- package/__tests__/core/embedders/CustomFontSubsetEmbedder.spec.ts +0 -62
- package/__tests__/core/embedders/FileEmbedder.spec.ts +0 -54
- package/__tests__/core/embedders/JpegEmbedder.spec.ts +0 -67
- package/__tests__/core/embedders/PDFPageEmbedder.spec.ts +0 -65
- package/__tests__/core/embedders/PngEmbedder.spec.ts +0 -87
- package/__tests__/core/embedders/StandardFontEmbedder.spec.ts +0 -79
- package/__tests__/core/embedders/data/SourceHanSerifJP-Regular.otf.cmap +0 -16096
- package/__tests__/core/embedders/data/Ubuntu-R.ttf.cmap +0 -1211
- package/__tests__/core/objects/PDFArray.spec.ts +0 -134
- package/__tests__/core/objects/PDFBool.spec.ts +0 -42
- package/__tests__/core/objects/PDFDict.spec.ts +0 -195
- package/__tests__/core/objects/PDFHexString.spec.ts +0 -168
- package/__tests__/core/objects/PDFInvalidObject.spec.ts +0 -32
- package/__tests__/core/objects/PDFName.spec.ts +0 -122
- package/__tests__/core/objects/PDFNull.spec.ts +0 -30
- package/__tests__/core/objects/PDFNumber.spec.ts +0 -50
- package/__tests__/core/objects/PDFObject.spec.ts +0 -29
- package/__tests__/core/objects/PDFRawStream.spec.ts +0 -45
- package/__tests__/core/objects/PDFRef.spec.ts +0 -60
- package/__tests__/core/objects/PDFString.spec.ts +0 -237
- package/__tests__/core/operators/PDFOperator.spec.ts +0 -77
- package/__tests__/core/parser/PDFObjectParser.spec.ts +0 -730
- package/__tests__/core/parser/PDFObjectStreamParser.spec.ts +0 -158
- package/__tests__/core/parser/PDFParser.spec.ts +0 -398
- package/__tests__/core/parser/PDFXRefStreamParser.spec.ts +0 -187
- package/__tests__/core/parser/data/object-stream-invalid +0 -2
- package/__tests__/core/parser/data/object-stream1 +0 -16
- package/__tests__/core/parser/data/object-stream2 +0 -10
- package/__tests__/core/parser/data/object-stream3 +0 -0
- package/__tests__/core/parser/data/object-stream4 +0 -0
- package/__tests__/core/parser/data/xref-stream1 +0 -0
- package/__tests__/core/parser/data/xref-stream2 +0 -0
- package/__tests__/core/parser/data/xref-stream3 +0 -0
- package/__tests__/core/parser/data/xref-stream4 +0 -0
- package/__tests__/core/streams/Ascii85Stream.spec.ts +0 -20
- package/__tests__/core/streams/AsciiHexStream.spec.ts +0 -20
- package/__tests__/core/streams/FlateStream.spec.ts +0 -20
- package/__tests__/core/streams/LZWStream.spec.ts +0 -20
- package/__tests__/core/streams/RunLengthStream.spec.ts +0 -20
- package/__tests__/core/streams/Stream.spec.ts +0 -128
- package/__tests__/core/streams/data/ascii85/1.decoded +0 -0
- package/__tests__/core/streams/data/ascii85/1.encoded +0 -43
- package/__tests__/core/streams/data/asciihex/1.decoded +0 -1
- package/__tests__/core/streams/data/asciihex/1.encoded +0 -1
- package/__tests__/core/streams/data/asciihex/2.decoded +0 -7
- package/__tests__/core/streams/data/asciihex/2.encoded +0 -1
- package/__tests__/core/streams/data/flate/1.corrupt.encoded +0 -1
- package/__tests__/core/streams/data/flate/1.decoded +0 -0
- package/__tests__/core/streams/data/flate/1.encoded +0 -2
- package/__tests__/core/streams/data/flate/2.decoded +0 -33
- package/__tests__/core/streams/data/flate/2.encoded +0 -0
- package/__tests__/core/streams/data/flate/3.decoded +0 -15
- package/__tests__/core/streams/data/flate/3.encoded +0 -0
- package/__tests__/core/streams/data/flate/4.decoded +0 -16
- package/__tests__/core/streams/data/flate/4.encoded +0 -0
- package/__tests__/core/streams/data/flate/5.decoded +0 -0
- package/__tests__/core/streams/data/flate/5.encoded +0 -0
- package/__tests__/core/streams/data/flate/6.decoded +0 -17
- package/__tests__/core/streams/data/flate/6.encoded +0 -0
- package/__tests__/core/streams/data/flate/7.decoded +0 -20
- package/__tests__/core/streams/data/flate/7.encoded +0 -1
- package/__tests__/core/streams/data/lzw/1.decoded +0 -0
- package/__tests__/core/streams/data/lzw/1.encoded +0 -0
- package/__tests__/core/streams/data/lzw/2.decoded +0 -0
- package/__tests__/core/streams/data/lzw/2.encoded +0 -0
- package/__tests__/core/streams/data/lzw/3.decoded +0 -14
- package/__tests__/core/streams/data/lzw/3.encoded +0 -2
- package/__tests__/core/streams/data/lzw/4.decoded +0 -14
- package/__tests__/core/streams/data/lzw/4.encoded +0 -2
- package/__tests__/core/streams/data/runlength/1.decoded +0 -1
- package/__tests__/core/streams/data/runlength/1.encoded +0 -1
- package/__tests__/core/streams/data/runlength/2.decoded +0 -1
- package/__tests__/core/streams/data/runlength/2.encoded +0 -1
- package/__tests__/core/streams/data/runlength/3.decoded +0 -0
- package/__tests__/core/streams/data/runlength/3.encoded +0 -0
- package/__tests__/core/streams/data/runlength/4.decoded +0 -1
- package/__tests__/core/streams/data/runlength/4.encoded +0 -1
- package/__tests__/core/streams/data/runlength/5.decoded +0 -1
- package/__tests__/core/streams/data/runlength/5.encoded +0 -1
- package/__tests__/core/streams/data/runlength/empty.encoded +0 -1
- package/__tests__/core/structures/PDFCatalog.spec.ts +0 -108
- package/__tests__/core/structures/PDFContentStream.spec.ts +0 -117
- package/__tests__/core/structures/PDFCrossRefStream.spec.ts +0 -145
- package/__tests__/core/structures/PDFObjectStream.spec.ts +0 -138
- package/__tests__/core/structures/PDFPageLeaf.spec.ts +0 -355
- package/__tests__/core/structures/PDFPageTree.spec.ts +0 -592
- package/__tests__/core/writers/PDFStreamWriter.spec.ts +0 -71
- package/__tests__/core/writers/PDFWriter.spec.ts +0 -144
- package/__tests__/core/writers/data/stream-writer-1.pdf +0 -0
- package/__tests__/index.test.ts +0 -12
- package/__tests__/utils/base64.spec.ts +0 -61
- package/__tests__/utils/data/simple.pdf +0 -201
- package/__tests__/utils/data/simple.pdf.base64 +0 -1
- package/__tests__/utils/pdfDocEncoding.spec.ts +0 -82
- package/__tests__/utils/png.spec.ts +0 -53
- package/__tests__/utils/rng.spec.ts +0 -14
- package/__tests__/utils/strings.spec.ts +0 -98
- package/__tests__/utils/unicode.spec.ts +0 -337
- package/assets/fonts/source_hans_jp/SourceHanSerifJP-Regular.otf +0 -0
- package/assets/fonts/ubuntu/Ubuntu-B.ttf +0 -0
- package/assets/fonts/ubuntu/Ubuntu-R.ttf +0 -0
- package/assets/images/cat_riding_unicorn.jpg +0 -0
- package/assets/images/cmyk_colorspace.jpg +0 -0
- package/assets/images/greyscale_bird.png +0 -0
- package/assets/images/minions_banana_alpha.png +0 -0
- package/assets/images/minions_banana_no_alpha.png +0 -0
- package/assets/images/minions_laughing.jpg +0 -0
- package/assets/pdfs/bixby_guide.pdf +0 -0
- package/assets/pdfs/encrypted_new.pdf +0 -0
- package/assets/pdfs/encrypted_old.pdf +0 -0
- package/assets/pdfs/fancy_fields.pdf +0 -0
- package/assets/pdfs/giraffe.pdf +0 -0
- package/assets/pdfs/invalid_root_ref.pdf +0 -0
- package/assets/pdfs/just_metadata.pdf +0 -49
- package/assets/pdfs/missing_endobj_keyword.pdf +0 -70
- package/assets/pdfs/missing_xref_trailer_dict.pdf +0 -141
- package/assets/pdfs/normal.pdf +0 -0
- package/assets/pdfs/pdf20examples/PDF 2.0 with offset start.pdf +0 -179
- package/assets/pdfs/stuff_following_header.pdf +0 -0
- package/assets/pdfs/us_constitution.pdf +0 -0
- package/assets/pdfs/with_comments.pdf +0 -0
- package/assets/pdfs/with_invalid_objects.pdf +0 -53
- package/assets/pdfs/with_invalid_stream_EOL.pdf +0 -0
- package/assets/pdfs/with_null_parent_entry.pdf +0 -0
- package/assets/pdfs/with_signature.pdf +0 -0
- package/assets/pdfs/with_update_sections.pdf +0 -0
- package/assets/pdfs/with_viewer_prefs.pdf +0 -0
- package/assets/pdfs/with_xfa_fields.pdf +0 -0
- package/src/api/PDFDocument.ts +0 -1389
- package/src/api/PDFDocumentOptions.ts +0 -45
- package/src/api/PDFEmbeddedFile.ts +0 -87
- package/src/api/PDFEmbeddedPage.ts +0 -100
- package/src/api/PDFFont.ts +0 -149
- package/src/api/PDFImage.ts +0 -143
- package/src/api/PDFJavaScript.ts +0 -75
- package/src/api/PDFPage.ts +0 -1604
- package/src/api/PDFPageOptions.ts +0 -175
- package/src/api/StandardFonts.ts +0 -16
- package/src/api/colors.ts +0 -109
- package/src/api/errors.ts +0 -110
- package/src/api/form/PDFButton.ts +0 -242
- package/src/api/form/PDFCheckBox.ts +0 -247
- package/src/api/form/PDFDropdown.ts +0 -637
- package/src/api/form/PDFField.ts +0 -491
- package/src/api/form/PDFForm.ts +0 -842
- package/src/api/form/PDFOptionList.ts +0 -555
- package/src/api/form/PDFRadioGroup.ts +0 -455
- package/src/api/form/PDFSignature.ts +0 -44
- package/src/api/form/PDFTextField.ts +0 -811
- package/src/api/form/appearances.ts +0 -655
- package/src/api/image/alignment.ts +0 -5
- package/src/api/objects.ts +0 -10
- package/src/api/operations.ts +0 -873
- package/src/api/operators.ts +0 -335
- package/src/api/rotations.ts +0 -84
- package/src/api/sizes.ts +0 -52
- package/src/api/svg.ts +0 -888
- package/src/api/svgPath.ts +0 -460
- package/src/api/text/alignment.ts +0 -5
- package/src/api/text/layout.ts +0 -328
- package/src/core/PDFContext.ts +0 -274
- package/src/core/PDFObjectCopier.ts +0 -142
- package/src/core/acroform/PDFAcroButton.ts +0 -104
- package/src/core/acroform/PDFAcroCheckBox.ts +0 -48
- package/src/core/acroform/PDFAcroChoice.ts +0 -143
- package/src/core/acroform/PDFAcroComboBox.ts +0 -21
- package/src/core/acroform/PDFAcroField.ts +0 -168
- package/src/core/acroform/PDFAcroForm.ts +0 -96
- package/src/core/acroform/PDFAcroListBox.ts +0 -19
- package/src/core/acroform/PDFAcroNonTerminal.ts +0 -33
- package/src/core/acroform/PDFAcroPushButton.ts +0 -21
- package/src/core/acroform/PDFAcroRadioButton.ts +0 -57
- package/src/core/acroform/PDFAcroTerminal.ts +0 -70
- package/src/core/acroform/PDFAcroText.ts +0 -76
- package/src/core/acroform/flags.ts +0 -162
- package/src/core/acroform/utils.ts +0 -129
- package/src/core/annotation/AppearanceCharacteristics.ts +0 -133
- package/src/core/annotation/BorderStyle.ts +0 -31
- package/src/core/annotation/PDFAnnotation.ts +0 -148
- package/src/core/annotation/PDFWidgetAnnotation.ts +0 -111
- package/src/core/annotation/flags.ts +0 -90
- package/src/core/crypto.ts +0 -1844
- package/src/core/document/PDFCrossRefSection.ts +0 -161
- package/src/core/document/PDFHeader.ts +0 -48
- package/src/core/document/PDFTrailer.ts +0 -48
- package/src/core/document/PDFTrailerDict.ts +0 -39
- package/src/core/embedders/CMap.ts +0 -65
- package/src/core/embedders/CustomFontEmbedder.ts +0 -237
- package/src/core/embedders/CustomFontSubsetEmbedder.ts +0 -89
- package/src/core/embedders/FileEmbedder.ts +0 -77
- package/src/core/embedders/FontFlags.ts +0 -45
- package/src/core/embedders/JavaScriptEmbedder.ts +0 -34
- package/src/core/embedders/JpegEmbedder.ts +0 -118
- package/src/core/embedders/PDFPageEmbedder.ts +0 -139
- package/src/core/embedders/PngEmbedder.ts +0 -69
- package/src/core/embedders/StandardFontEmbedder.ts +0 -121
- package/src/core/errors.ts +0 -226
- package/src/core/interactive/ViewerPreferences.ts +0 -565
- package/src/core/objects/PDFArray.ts +0 -179
- package/src/core/objects/PDFBool.ts +0 -53
- package/src/core/objects/PDFDict.ts +0 -220
- package/src/core/objects/PDFHexString.ts +0 -94
- package/src/core/objects/PDFInvalidObject.ts +0 -34
- package/src/core/objects/PDFName.ts +0 -152
- package/src/core/objects/PDFNull.ts +0 -30
- package/src/core/objects/PDFNumber.ts +0 -44
- package/src/core/objects/PDFObject.ts +0 -22
- package/src/core/objects/PDFRawStream.ts +0 -41
- package/src/core/objects/PDFRef.ts +0 -51
- package/src/core/objects/PDFStream.ts +0 -87
- package/src/core/objects/PDFString.ts +0 -118
- package/src/core/operators/PDFOperator.ts +0 -72
- package/src/core/operators/PDFOperatorNames.ts +0 -92
- package/src/core/parser/BaseParser.ts +0 -119
- package/src/core/parser/ByteStream.ts +0 -76
- package/src/core/parser/PDFObjectParser.ts +0 -302
- package/src/core/parser/PDFObjectStreamParser.ts +0 -65
- package/src/core/parser/PDFParser.ts +0 -363
- package/src/core/parser/PDFXRefStreamParser.ts +0 -129
- package/src/core/streams/Ascii85Stream.ts +0 -97
- package/src/core/streams/AsciiHexStream.ts +0 -77
- package/src/core/streams/DecodeStream.ts +0 -188
- package/src/core/streams/DecryptStream.ts +0 -49
- package/src/core/streams/FlateStream.ts +0 -397
- package/src/core/streams/LZWStream.ts +0 -157
- package/src/core/streams/RunLengthStream.ts +0 -55
- package/src/core/streams/Stream.ts +0 -126
- package/src/core/streams/decode.ts +0 -70
- package/src/core/structures/PDFCatalog.ts +0 -81
- package/src/core/structures/PDFContentStream.ts +0 -58
- package/src/core/structures/PDFCrossRefStream.ts +0 -238
- package/src/core/structures/PDFFlateStream.ts +0 -40
- package/src/core/structures/PDFObjectStream.ts +0 -91
- package/src/core/structures/PDFPageLeaf.ts +0 -244
- package/src/core/structures/PDFPageTree.ts +0 -192
- package/src/core/syntax/CharCodes.ts +0 -62
- package/src/core/syntax/Delimiters.ts +0 -14
- package/src/core/syntax/Irregular.ts +0 -10
- package/src/core/syntax/Keywords.ts +0 -57
- package/src/core/syntax/Numeric.ts +0 -26
- package/src/core/syntax/Whitespace.ts +0 -10
- package/src/core/writers/PDFStreamWriter.ts +0 -114
- package/src/core/writers/PDFWriter.ts +0 -146
- package/src/types/fontkit.ts +0 -643
- package/src/utils/Cache.ts +0 -26
- package/src/utils/arrays.ts +0 -153
- package/src/utils/async.ts +0 -8
- package/src/utils/base64.ts +0 -98
- package/src/utils/elements/Arc.ts +0 -97
- package/src/utils/elements/Circle.ts +0 -47
- package/src/utils/elements/Ellipse.ts +0 -117
- package/src/utils/elements/GraphElement.ts +0 -14
- package/src/utils/elements/Line.ts +0 -83
- package/src/utils/elements/Plot.ts +0 -50
- package/src/utils/elements/Point.ts +0 -37
- package/src/utils/elements/Rectangle.ts +0 -65
- package/src/utils/elements/Segment.ts +0 -81
- package/src/utils/errors.ts +0 -3
- package/src/utils/intersections.ts +0 -237
- package/src/utils/maths.ts +0 -96
- package/src/utils/numbers.ts +0 -55
- package/src/utils/objects.ts +0 -13
- package/src/utils/pdfDocEncoding.ts +0 -69
- package/src/utils/png.ts +0 -100
- package/src/utils/rng.ts +0 -21
- package/src/utils/strings.ts +0 -191
- package/src/utils/validators.ts +0 -192
- package/tsconfig.build.json +0 -14
- package/tsconfig.json +0 -15
- package/vite.config.mts +0 -39
- /package/{src/api/form/index.ts → dist/api/form/index.d.ts} +0 -0
- /package/{src/api/image/index.ts → dist/api/image/index.d.ts} +0 -0
- /package/{src/api/index.ts → dist/api/index.d.ts} +0 -0
- /package/{src/api/text/index.ts → dist/api/text/index.d.ts} +0 -0
- /package/{src/core/acroform/index.ts → dist/core/acroform/index.d.ts} +0 -0
- /package/{src/core/annotation/index.ts → dist/core/annotation/index.d.ts} +0 -0
- /package/{src/index.ts → dist/index.d.ts} +0 -0
- /package/{src/utils/elements/index.ts → dist/utils/elements/index.d.ts} +0 -0
- /package/{src/utils/index.ts → dist/utils/index.d.ts} +0 -0
|
@@ -1,370 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import {
|
|
3
|
-
PDFDocument,
|
|
4
|
-
PDFTextField,
|
|
5
|
-
PDFCheckBox,
|
|
6
|
-
PDFButton,
|
|
7
|
-
PDFRadioGroup,
|
|
8
|
-
PDFOptionList,
|
|
9
|
-
PDFDropdown,
|
|
10
|
-
PDFWidgetAnnotation,
|
|
11
|
-
PDFDict,
|
|
12
|
-
PDFName,
|
|
13
|
-
PDFForm,
|
|
14
|
-
PDFAcroForm,
|
|
15
|
-
PDFRef,
|
|
16
|
-
} from '../../../src/index';
|
|
17
|
-
|
|
18
|
-
const getWidgets = (pdfDoc: PDFDocument) =>
|
|
19
|
-
pdfDoc.context
|
|
20
|
-
.enumerateIndirectObjects()
|
|
21
|
-
.map(([, obj]) => obj)
|
|
22
|
-
.filter(
|
|
23
|
-
(obj) =>
|
|
24
|
-
obj instanceof PDFDict &&
|
|
25
|
-
obj.get(PDFName.of('Type')) === PDFName.of('Annot') &&
|
|
26
|
-
obj.get(PDFName.of('Subtype')) === PDFName.of('Widget'),
|
|
27
|
-
)
|
|
28
|
-
.map((obj) => obj as PDFDict);
|
|
29
|
-
|
|
30
|
-
const getRefs = (pdfDoc: PDFDocument) =>
|
|
31
|
-
pdfDoc.context.enumerateIndirectObjects().map(([ref]) => ref as PDFRef);
|
|
32
|
-
|
|
33
|
-
const getApRefs = (widget: PDFWidgetAnnotation) => {
|
|
34
|
-
const onValue = widget.getOnValue() ?? PDFName.of('Yes');
|
|
35
|
-
const aps = widget.getAppearances();
|
|
36
|
-
return [
|
|
37
|
-
(aps?.normal as PDFDict).get(onValue),
|
|
38
|
-
(aps?.rollover as PDFDict | undefined)?.get(onValue),
|
|
39
|
-
(aps?.down as PDFDict | undefined)?.get(onValue),
|
|
40
|
-
(aps?.normal as PDFDict).get(PDFName.of('Off')),
|
|
41
|
-
(aps?.rollover as PDFDict | undefined)?.get(PDFName.of('Off')),
|
|
42
|
-
(aps?.down as PDFDict | undefined)?.get(PDFName.of('Off')),
|
|
43
|
-
].filter(Boolean);
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
const flatten = <T>(arr: T[][]): T[] =>
|
|
47
|
-
arr.reduce((curr, acc) => [...acc, ...curr], []);
|
|
48
|
-
|
|
49
|
-
const fancyFieldsPdfBytes = fs.readFileSync('assets/pdfs/fancy_fields.pdf');
|
|
50
|
-
// const sampleFormPdfBytes = fs.readFileSync('assets/pdfs/sample_form.pdf');
|
|
51
|
-
// const combedPdfBytes = fs.readFileSync('assets/pdfs/with_combed_fields.pdf');
|
|
52
|
-
// const dodPdfBytes = fs.readFileSync('assets/pdfs/dod_character.pdf');
|
|
53
|
-
const xfaPdfBytes = fs.readFileSync('assets/pdfs/with_xfa_fields.pdf');
|
|
54
|
-
const signaturePdfBytes = fs.readFileSync('assets/pdfs/with_signature.pdf');
|
|
55
|
-
|
|
56
|
-
describe(`PDFForm`, () => {
|
|
57
|
-
const origConsoleWarn = console.warn;
|
|
58
|
-
|
|
59
|
-
beforeAll(() => {
|
|
60
|
-
const ignoredWarnings = [
|
|
61
|
-
'Removing XFA form data as pdf-lib does not support reading or writing XFA',
|
|
62
|
-
];
|
|
63
|
-
console.warn = vi.fn((...args) => {
|
|
64
|
-
const isIgnored = ignoredWarnings.find((iw) => args[0].includes(iw));
|
|
65
|
-
if (!isIgnored) origConsoleWarn(...args);
|
|
66
|
-
});
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
beforeEach(() => {
|
|
70
|
-
vi.clearAllMocks();
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
afterAll(() => {
|
|
74
|
-
console.warn = origConsoleWarn;
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
// prettier-ignore
|
|
78
|
-
it(`provides access to all terminal fields in an AcroForm`, async () => {
|
|
79
|
-
const pdfDoc = await PDFDocument.load(fancyFieldsPdfBytes);
|
|
80
|
-
const form = pdfDoc.getForm();
|
|
81
|
-
const fields = form.getFields();
|
|
82
|
-
|
|
83
|
-
expect(fields.length).toBe(15);
|
|
84
|
-
|
|
85
|
-
expect(form.getField('Prefix ⚽️')).toBeInstanceOf(PDFTextField);
|
|
86
|
-
expect(form.getField('First Name 🚀')).toBeInstanceOf(PDFTextField);
|
|
87
|
-
expect(form.getField('MiddleInitial 🎳')).toBeInstanceOf(PDFTextField);
|
|
88
|
-
expect(form.getField('LastName 🛩')).toBeInstanceOf(PDFTextField);
|
|
89
|
-
expect(form.getField('Are You A Fairy? 🌿')).toBeInstanceOf(PDFCheckBox);
|
|
90
|
-
expect(form.getField('Is Your Power Level Over 9000? 💪')).toBeInstanceOf(PDFCheckBox);
|
|
91
|
-
expect(form.getField('Can You Defeat Enemies In One Punch? 👊')).toBeInstanceOf(PDFCheckBox);
|
|
92
|
-
expect(form.getField('Will You Ever Let Me Down? ☕️')).toBeInstanceOf(PDFCheckBox);
|
|
93
|
-
expect(form.getField('Eject 📼')).toBeInstanceOf(PDFButton);
|
|
94
|
-
expect(form.getField('Submit 📝')).toBeInstanceOf(PDFButton);
|
|
95
|
-
expect(form.getField('Play ▶️')).toBeInstanceOf(PDFButton);
|
|
96
|
-
expect(form.getField('Launch 🚀')).toBeInstanceOf(PDFButton);
|
|
97
|
-
expect(form.getField('Historical Figures 🐺')).toBeInstanceOf(PDFRadioGroup);
|
|
98
|
-
expect(form.getField('Which Are Planets? 🌎')).toBeInstanceOf(PDFOptionList);
|
|
99
|
-
expect(form.getField('Choose A Gundam 🤖')).toBeInstanceOf(PDFDropdown);
|
|
100
|
-
|
|
101
|
-
const fieldDicts = fields.map(f => f.acroField.dict);
|
|
102
|
-
const getFieldDict = (name: string) => form.getField(name)?.acroField.dict;
|
|
103
|
-
|
|
104
|
-
expect(fieldDicts).toContain(getFieldDict('Prefix ⚽️'));
|
|
105
|
-
expect(fieldDicts).toContain(getFieldDict('First Name 🚀'));
|
|
106
|
-
expect(fieldDicts).toContain(getFieldDict('MiddleInitial 🎳'));
|
|
107
|
-
expect(fieldDicts).toContain(getFieldDict('LastName 🛩'));
|
|
108
|
-
expect(fieldDicts).toContain(getFieldDict('Are You A Fairy? 🌿'));
|
|
109
|
-
expect(fieldDicts).toContain(getFieldDict('Is Your Power Level Over 9000? 💪'));
|
|
110
|
-
expect(fieldDicts).toContain(getFieldDict('Can You Defeat Enemies In One Punch? 👊'));
|
|
111
|
-
expect(fieldDicts).toContain(getFieldDict('Will You Ever Let Me Down? ☕️'));
|
|
112
|
-
expect(fieldDicts).toContain(getFieldDict('Eject 📼'));
|
|
113
|
-
expect(fieldDicts).toContain(getFieldDict('Submit 📝'));
|
|
114
|
-
expect(fieldDicts).toContain(getFieldDict('Play ▶️'));
|
|
115
|
-
expect(fieldDicts).toContain(getFieldDict('Launch 🚀'));
|
|
116
|
-
expect(fieldDicts).toContain(getFieldDict('Historical Figures 🐺'));
|
|
117
|
-
expect(fieldDicts).toContain(getFieldDict('Which Are Planets? 🌎'));
|
|
118
|
-
expect(fieldDicts).toContain(getFieldDict('Choose A Gundam 🤖'));
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
// Need to also run this test with assets/pdfs/with_xfa_fields.pdf as it has "partial/50%" APs for checkboxes (is only missing the /Off APs)
|
|
122
|
-
it(`does not override existing appearance streams for check boxes and radio groups if they already exist`, async () => {
|
|
123
|
-
const pdfDoc = await PDFDocument.load(fancyFieldsPdfBytes);
|
|
124
|
-
const form = pdfDoc.getForm();
|
|
125
|
-
|
|
126
|
-
// Get fields
|
|
127
|
-
const cb1 = form.getCheckBox('Are You A Fairy? 🌿');
|
|
128
|
-
const cb2 = form.getCheckBox('Is Your Power Level Over 9000? 💪');
|
|
129
|
-
const cb3 = form.getCheckBox('Can You Defeat Enemies In One Punch? 👊');
|
|
130
|
-
const cb4 = form.getCheckBox('Will You Ever Let Me Down? ☕️');
|
|
131
|
-
const rg1 = form.getRadioGroup('Historical Figures 🐺');
|
|
132
|
-
|
|
133
|
-
// Assert preconditions
|
|
134
|
-
expect(cb1.isChecked()).toBe(true);
|
|
135
|
-
expect(cb2.isChecked()).toBe(false);
|
|
136
|
-
expect(cb3.isChecked()).toBe(true);
|
|
137
|
-
expect(cb4.isChecked()).toBe(false);
|
|
138
|
-
expect(rg1.getSelected()).toEqual('Marcus Aurelius 🏛️');
|
|
139
|
-
|
|
140
|
-
// Collect all existing appearance streams
|
|
141
|
-
const fields = [cb1, cb2, cb3, cb4, rg1];
|
|
142
|
-
const widgets = flatten(fields.map((f) => f.acroField.getWidgets()));
|
|
143
|
-
const originalAps = flatten(widgets.map(getApRefs));
|
|
144
|
-
|
|
145
|
-
// (1) Run appearance update
|
|
146
|
-
form.updateFieldAppearances();
|
|
147
|
-
|
|
148
|
-
// (1) Make sure no new appearance streams were created
|
|
149
|
-
expect(flatten(widgets.map(getApRefs))).toEqual(originalAps);
|
|
150
|
-
|
|
151
|
-
// (2) Flip check box values
|
|
152
|
-
cb1.uncheck();
|
|
153
|
-
cb2.check();
|
|
154
|
-
cb3.uncheck();
|
|
155
|
-
cb4.check();
|
|
156
|
-
|
|
157
|
-
// (2) un appearance update
|
|
158
|
-
form.updateFieldAppearances();
|
|
159
|
-
|
|
160
|
-
// (2) Make sure no new appearance streams were created
|
|
161
|
-
expect(flatten(widgets.map(getApRefs))).toEqual(originalAps);
|
|
162
|
-
|
|
163
|
-
// (3) Change radio group value
|
|
164
|
-
rg1.select('Alexander Hamilton 🇺🇸');
|
|
165
|
-
|
|
166
|
-
// (3) Run appearance update
|
|
167
|
-
form.updateFieldAppearances();
|
|
168
|
-
|
|
169
|
-
// (3) Make sure no new appearance streams were created
|
|
170
|
-
expect(flatten(widgets.map(getApRefs))).toEqual(originalAps);
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
it(`creates appearance streams for widgets that do not have any`, async () => {
|
|
174
|
-
const pdfDoc = await PDFDocument.create();
|
|
175
|
-
|
|
176
|
-
const page = pdfDoc.addPage();
|
|
177
|
-
|
|
178
|
-
const form = pdfDoc.getForm();
|
|
179
|
-
|
|
180
|
-
const btn = form.createButton('a.button.field');
|
|
181
|
-
const cb = form.createCheckBox('a.checkbox.field');
|
|
182
|
-
const dd = form.createDropdown('a.dropdown.field');
|
|
183
|
-
const ol = form.createOptionList('a.optionlist.field');
|
|
184
|
-
const tf = form.createTextField('a.text.field');
|
|
185
|
-
|
|
186
|
-
// Skipping Radio Groups for this test as they _must_ have APs or else the
|
|
187
|
-
// value represented by each radio button is undefined.
|
|
188
|
-
// const rg = form.createRadioGroup('a.radiogroup.field');
|
|
189
|
-
|
|
190
|
-
btn.addToPage('foo', page);
|
|
191
|
-
cb.addToPage(page);
|
|
192
|
-
dd.addToPage(page);
|
|
193
|
-
ol.addToPage(page);
|
|
194
|
-
tf.addToPage(page);
|
|
195
|
-
// rg.addOptionToPage('bar', page);
|
|
196
|
-
|
|
197
|
-
const widgets = getWidgets(pdfDoc);
|
|
198
|
-
|
|
199
|
-
expect(widgets.length).toBe(5);
|
|
200
|
-
|
|
201
|
-
const aps = () => widgets.filter((w) => w.has(PDFName.of('AP'))).length;
|
|
202
|
-
|
|
203
|
-
expect(aps()).toBe(5);
|
|
204
|
-
|
|
205
|
-
widgets.forEach((w) => w.delete(PDFName.of('AP')));
|
|
206
|
-
|
|
207
|
-
expect(aps()).toBe(0);
|
|
208
|
-
|
|
209
|
-
form.updateFieldAppearances();
|
|
210
|
-
|
|
211
|
-
expect(aps()).toBe(5);
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
it(`removes XFA entries when it is accessed`, async () => {
|
|
215
|
-
const pdfDoc = await PDFDocument.load(xfaPdfBytes);
|
|
216
|
-
const acroForm = pdfDoc.catalog.getOrCreateAcroForm();
|
|
217
|
-
expect(acroForm.dict.has(PDFName.of('XFA'))).toBe(true);
|
|
218
|
-
expect(pdfDoc.getForm()).toBeInstanceOf(PDFForm);
|
|
219
|
-
expect(acroForm.dict.has(PDFName.of('XFA'))).toBe(false);
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
it(`is only created if it is accessed`, async () => {
|
|
223
|
-
const pdfDoc = await PDFDocument.create();
|
|
224
|
-
expect(pdfDoc.catalog.getAcroForm()).toBe(undefined);
|
|
225
|
-
expect(pdfDoc.getForm()).toBeInstanceOf(PDFForm);
|
|
226
|
-
expect(pdfDoc.catalog.getAcroForm()).toBeInstanceOf(PDFAcroForm);
|
|
227
|
-
});
|
|
228
|
-
|
|
229
|
-
it(`does not update appearance streams if "updateFieldAppearances" is true, but no fields are dirty`, async () => {
|
|
230
|
-
const pdfDoc = await PDFDocument.load(fancyFieldsPdfBytes);
|
|
231
|
-
|
|
232
|
-
const widgets = getWidgets(pdfDoc);
|
|
233
|
-
expect(widgets.length).toBe(24);
|
|
234
|
-
|
|
235
|
-
const aps = () => widgets.filter((w) => w.has(PDFName.of('AP'))).length;
|
|
236
|
-
expect(aps()).toBe(24);
|
|
237
|
-
|
|
238
|
-
widgets.forEach((w) => w.delete(PDFName.of('AP')));
|
|
239
|
-
expect(aps()).toBe(0);
|
|
240
|
-
|
|
241
|
-
await pdfDoc.save({ updateFieldAppearances: true });
|
|
242
|
-
expect(aps()).toBe(0);
|
|
243
|
-
});
|
|
244
|
-
|
|
245
|
-
it(`does not update appearance streams if "updateFieldAppearances" is false, even if fields are dirty`, async () => {
|
|
246
|
-
const pdfDoc = await PDFDocument.load(fancyFieldsPdfBytes);
|
|
247
|
-
|
|
248
|
-
const widgets = getWidgets(pdfDoc);
|
|
249
|
-
expect(widgets.length).toBe(24);
|
|
250
|
-
|
|
251
|
-
const aps = () => widgets.filter((w) => w.has(PDFName.of('AP'))).length;
|
|
252
|
-
expect(aps()).toBe(24);
|
|
253
|
-
|
|
254
|
-
widgets.forEach((w) => w.delete(PDFName.of('AP')));
|
|
255
|
-
expect(aps()).toBe(0);
|
|
256
|
-
|
|
257
|
-
const form = pdfDoc.getForm();
|
|
258
|
-
form.getFields().forEach((f) => form.markFieldAsDirty(f.ref));
|
|
259
|
-
|
|
260
|
-
await pdfDoc.save({ updateFieldAppearances: false });
|
|
261
|
-
expect(aps()).toBe(0);
|
|
262
|
-
});
|
|
263
|
-
|
|
264
|
-
it(`does update appearance streams if "updateFieldAppearances" is true, and fields are dirty`, async () => {
|
|
265
|
-
const pdfDoc = await PDFDocument.load(fancyFieldsPdfBytes);
|
|
266
|
-
|
|
267
|
-
const widgets = getWidgets(pdfDoc);
|
|
268
|
-
expect(widgets.length).toBe(24);
|
|
269
|
-
|
|
270
|
-
const aps = () => widgets.filter((w) => w.has(PDFName.of('AP'))).length;
|
|
271
|
-
expect(aps()).toBe(24);
|
|
272
|
-
|
|
273
|
-
widgets.forEach((w) => w.delete(PDFName.of('AP')));
|
|
274
|
-
expect(aps()).toBe(0);
|
|
275
|
-
|
|
276
|
-
const form = pdfDoc.getForm();
|
|
277
|
-
form.getFields().forEach((f) => form.markFieldAsDirty(f.ref));
|
|
278
|
-
|
|
279
|
-
await pdfDoc.save({ updateFieldAppearances: true });
|
|
280
|
-
expect(aps()).toBe(20);
|
|
281
|
-
});
|
|
282
|
-
|
|
283
|
-
it(`does not throw errors for PDFSignature fields`, async () => {
|
|
284
|
-
const pdfDoc = await PDFDocument.load(signaturePdfBytes);
|
|
285
|
-
|
|
286
|
-
const widgets = getWidgets(pdfDoc);
|
|
287
|
-
expect(widgets.length).toBe(1);
|
|
288
|
-
|
|
289
|
-
const form = pdfDoc.getForm();
|
|
290
|
-
|
|
291
|
-
expect(() => form.updateFieldAppearances()).not.toThrow();
|
|
292
|
-
|
|
293
|
-
expect(
|
|
294
|
-
pdfDoc.save({ updateFieldAppearances: true }),
|
|
295
|
-
).resolves.toBeInstanceOf(Uint8Array);
|
|
296
|
-
});
|
|
297
|
-
|
|
298
|
-
it(`it cleans references of removed fields and their widgets`, async () => {
|
|
299
|
-
const pdfDoc = await PDFDocument.load(fancyFieldsPdfBytes);
|
|
300
|
-
const form = pdfDoc.getForm();
|
|
301
|
-
|
|
302
|
-
const refs1 = getRefs(pdfDoc);
|
|
303
|
-
|
|
304
|
-
const cb = form.getCheckBox('Will You Ever Let Me Down? ☕️');
|
|
305
|
-
const rg = form.getRadioGroup('Historical Figures 🐺');
|
|
306
|
-
|
|
307
|
-
const cbWidgetRefs = cb.acroField.normalizedEntries().Kids.asArray();
|
|
308
|
-
const rgWidgetRefs = cb.acroField.normalizedEntries().Kids.asArray();
|
|
309
|
-
|
|
310
|
-
expect(cbWidgetRefs.length).toBeGreaterThan(0);
|
|
311
|
-
expect(rgWidgetRefs.length).toBeGreaterThan(0);
|
|
312
|
-
|
|
313
|
-
// Assert that refs are present before their fields have been removed
|
|
314
|
-
expect(refs1.includes(cb.ref)).toBe(true);
|
|
315
|
-
expect(refs1.includes(rg.ref)).toBe(true);
|
|
316
|
-
cbWidgetRefs.forEach((ref) => expect(refs1).toContain(ref));
|
|
317
|
-
rgWidgetRefs.forEach((ref) => expect(refs1).toContain(ref));
|
|
318
|
-
|
|
319
|
-
form.removeField(cb);
|
|
320
|
-
form.removeField(rg);
|
|
321
|
-
|
|
322
|
-
const refs2 = getRefs(pdfDoc);
|
|
323
|
-
|
|
324
|
-
// Assert that refs are not present after their fields have been removed
|
|
325
|
-
expect(refs2.includes(cb.ref)).toBe(false);
|
|
326
|
-
expect(refs2.includes(rg.ref)).toBe(false);
|
|
327
|
-
cbWidgetRefs.forEach((ref) => expect(refs2).not.toContain(ref));
|
|
328
|
-
rgWidgetRefs.forEach((ref) => expect(refs2).not.toContain(ref));
|
|
329
|
-
});
|
|
330
|
-
|
|
331
|
-
it(`it cleans references of removed fields and their widgets when created with pdf-lib`, async () => {
|
|
332
|
-
const pdfDoc = await PDFDocument.create();
|
|
333
|
-
const page = pdfDoc.addPage();
|
|
334
|
-
const form = pdfDoc.getForm();
|
|
335
|
-
|
|
336
|
-
const cb = form.createCheckBox('a.new.check.box');
|
|
337
|
-
const tf = form.createTextField('a.new.text.field');
|
|
338
|
-
|
|
339
|
-
cb.addToPage(page);
|
|
340
|
-
tf.addToPage(page);
|
|
341
|
-
|
|
342
|
-
const refs1 = getRefs(pdfDoc);
|
|
343
|
-
|
|
344
|
-
const cbWidgetRefs = cb.acroField.normalizedEntries().Kids.asArray();
|
|
345
|
-
const tfWidgetRefs = cb.acroField.normalizedEntries().Kids.asArray();
|
|
346
|
-
|
|
347
|
-
expect(cbWidgetRefs.length).toBeGreaterThan(0);
|
|
348
|
-
expect(tfWidgetRefs.length).toBeGreaterThan(0);
|
|
349
|
-
|
|
350
|
-
// Assert that refs are present before their fields have been removed
|
|
351
|
-
expect(refs1.includes(cb.ref)).toBe(true);
|
|
352
|
-
expect(refs1.includes(tf.ref)).toBe(true);
|
|
353
|
-
cbWidgetRefs.forEach((ref) => expect(refs1).toContain(ref));
|
|
354
|
-
tfWidgetRefs.forEach((ref) => expect(refs1).toContain(ref));
|
|
355
|
-
|
|
356
|
-
form.removeField(cb);
|
|
357
|
-
form.removeField(tf);
|
|
358
|
-
|
|
359
|
-
const refs2 = getRefs(pdfDoc);
|
|
360
|
-
|
|
361
|
-
// Assert that refs are not present after their fields have been removed
|
|
362
|
-
expect(refs2.includes(cb.ref)).toBe(false);
|
|
363
|
-
expect(refs2.includes(tf.ref)).toBe(false);
|
|
364
|
-
cbWidgetRefs.forEach((ref) => expect(refs2).not.toContain(ref));
|
|
365
|
-
tfWidgetRefs.forEach((ref) => expect(refs2).not.toContain(ref));
|
|
366
|
-
});
|
|
367
|
-
|
|
368
|
-
// TODO: Add method to remove APs and use `NeedsAppearances`? How would this
|
|
369
|
-
// work with RadioGroups? Just set the APs to `null`but keep the keys?
|
|
370
|
-
});
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import { PDFDocument, AnnotationFlags } from '../../../src/index';
|
|
3
|
-
|
|
4
|
-
const fancyFieldsPdfBytes = fs.readFileSync('assets/pdfs/fancy_fields.pdf');
|
|
5
|
-
|
|
6
|
-
describe(`PDFOptionList`, () => {
|
|
7
|
-
it(`can read its options`, async () => {
|
|
8
|
-
const pdfDoc = await PDFDocument.load(fancyFieldsPdfBytes);
|
|
9
|
-
const form = pdfDoc.getForm();
|
|
10
|
-
const planets = form.getOptionList('Which Are Planets? 🌎');
|
|
11
|
-
expect(planets.getOptions()).toEqual(['Earth', 'Mars', 'Pluto', 'Neptune']);
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
it(`can read its selected value`, async () => {
|
|
15
|
-
const pdfDoc = await PDFDocument.load(fancyFieldsPdfBytes);
|
|
16
|
-
const form = pdfDoc.getForm();
|
|
17
|
-
const planets = form.getOptionList('Which Are Planets? 🌎');
|
|
18
|
-
expect(planets.getSelected()).toEqual(['Mars']);
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
it(`can clear its value`, async () => {
|
|
22
|
-
const pdfDoc = await PDFDocument.load(fancyFieldsPdfBytes);
|
|
23
|
-
const form = pdfDoc.getForm();
|
|
24
|
-
const planets = form.getOptionList('Which Are Planets? 🌎');
|
|
25
|
-
planets.clear();
|
|
26
|
-
expect(planets.getSelected()).toEqual([]);
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
it(`can select a single value`, async () => {
|
|
30
|
-
const pdfDoc = await PDFDocument.load(fancyFieldsPdfBytes);
|
|
31
|
-
const form = pdfDoc.getForm();
|
|
32
|
-
const planets = form.getOptionList('Which Are Planets? 🌎');
|
|
33
|
-
planets.select('Neptune');
|
|
34
|
-
expect(planets.getSelected()).toEqual(['Neptune']);
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
it(`can select multiple values`, async () => {
|
|
38
|
-
const pdfDoc = await PDFDocument.load(fancyFieldsPdfBytes);
|
|
39
|
-
const form = pdfDoc.getForm();
|
|
40
|
-
const planets = form.getOptionList('Which Are Planets? 🌎');
|
|
41
|
-
planets.select(['Pluto', 'Neptune']);
|
|
42
|
-
expect(planets.getSelected()).toEqual(['Pluto', 'Neptune']);
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it(`can't select a value not in the options list`, async () => {
|
|
46
|
-
const pdfDoc = await PDFDocument.load(fancyFieldsPdfBytes);
|
|
47
|
-
const form = pdfDoc.getForm();
|
|
48
|
-
const planets = form.getOptionList('Which Are Planets? 🌎');
|
|
49
|
-
expect(() => planets.select('One Punch Man')).toThrow();
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
it(`can merge options when selecting`, async () => {
|
|
53
|
-
const pdfDoc = await PDFDocument.load(fancyFieldsPdfBytes);
|
|
54
|
-
const form = pdfDoc.getForm();
|
|
55
|
-
const planets = form.getOptionList('Which Are Planets? 🌎');
|
|
56
|
-
planets.select(['Pluto'], true);
|
|
57
|
-
expect(planets.getSelected()).toEqual(['Mars', 'Pluto']);
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
it(`can read its flag states`, async () => {
|
|
61
|
-
const pdfDoc = await PDFDocument.load(fancyFieldsPdfBytes);
|
|
62
|
-
const form = pdfDoc.getForm();
|
|
63
|
-
const planets = form.getOptionList('Which Are Planets? 🌎');
|
|
64
|
-
|
|
65
|
-
expect(planets.isExported()).toBe(true);
|
|
66
|
-
expect(planets.isReadOnly()).toBe(false);
|
|
67
|
-
expect(planets.isRequired()).toBe(false);
|
|
68
|
-
expect(planets.isMultiselect()).toBe(false);
|
|
69
|
-
expect(planets.isSelectOnClick()).toBe(false);
|
|
70
|
-
expect(planets.isSorted()).toBe(false);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it(`produces printable widgets when added to a page`, async () => {
|
|
74
|
-
const pdfDoc = await PDFDocument.create();
|
|
75
|
-
const page = pdfDoc.addPage();
|
|
76
|
-
|
|
77
|
-
const form = pdfDoc.getForm();
|
|
78
|
-
|
|
79
|
-
const optionList = form.createOptionList('a.new.option.list');
|
|
80
|
-
|
|
81
|
-
const widgets = () => optionList.acroField.getWidgets();
|
|
82
|
-
expect(widgets().length).toBe(0);
|
|
83
|
-
|
|
84
|
-
optionList.addToPage(page);
|
|
85
|
-
expect(widgets().length).toBe(1);
|
|
86
|
-
expect(widgets()[0].hasFlag(AnnotationFlags.Print)).toBe(true);
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
it(`sets page reference when added to a page`, async () => {
|
|
90
|
-
const pdfDoc = await PDFDocument.create();
|
|
91
|
-
const page = pdfDoc.addPage();
|
|
92
|
-
|
|
93
|
-
const form = pdfDoc.getForm();
|
|
94
|
-
|
|
95
|
-
const optionList = form.createOptionList('a.new.option.list');
|
|
96
|
-
|
|
97
|
-
const widgets = () => optionList.acroField.getWidgets();
|
|
98
|
-
expect(widgets().length).toBe(0);
|
|
99
|
-
|
|
100
|
-
optionList.addToPage(page);
|
|
101
|
-
expect(widgets().length).toBe(1);
|
|
102
|
-
expect(widgets()[0].P()).toBe(page.ref);
|
|
103
|
-
});
|
|
104
|
-
});
|
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import {
|
|
3
|
-
PDFDocument,
|
|
4
|
-
PDFName,
|
|
5
|
-
PDFArray,
|
|
6
|
-
PDFHexString,
|
|
7
|
-
AnnotationFlags,
|
|
8
|
-
} from '../../../src/index';
|
|
9
|
-
|
|
10
|
-
const fancyFieldsPdfBytes = fs.readFileSync('assets/pdfs/fancy_fields.pdf');
|
|
11
|
-
|
|
12
|
-
describe(`PDFRadioGroup`, () => {
|
|
13
|
-
it(`can read its options`, async () => {
|
|
14
|
-
const pdfDoc = await PDFDocument.load(fancyFieldsPdfBytes);
|
|
15
|
-
const form = pdfDoc.getForm();
|
|
16
|
-
const historicalFigures = form.getRadioGroup('Historical Figures 🐺');
|
|
17
|
-
expect(historicalFigures.getOptions()).toEqual([
|
|
18
|
-
'Marcus Aurelius 🏛️',
|
|
19
|
-
'Ada Lovelace 💻',
|
|
20
|
-
'Marie Curie ☢️',
|
|
21
|
-
'Alexander Hamilton 🇺🇸',
|
|
22
|
-
]);
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
it(`can read its selected value`, async () => {
|
|
26
|
-
const pdfDoc = await PDFDocument.load(fancyFieldsPdfBytes);
|
|
27
|
-
const form = pdfDoc.getForm();
|
|
28
|
-
const historicalFigures = form.getRadioGroup('Historical Figures 🐺');
|
|
29
|
-
expect(historicalFigures.getSelected()).toEqual('Marcus Aurelius 🏛️');
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
it(`can clear its value`, async () => {
|
|
33
|
-
const pdfDoc = await PDFDocument.load(fancyFieldsPdfBytes);
|
|
34
|
-
const form = pdfDoc.getForm();
|
|
35
|
-
const historicalFigures = form.getRadioGroup('Historical Figures 🐺');
|
|
36
|
-
historicalFigures.clear();
|
|
37
|
-
expect(historicalFigures.getSelected()).toBe(undefined);
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
it(`can select a value`, async () => {
|
|
41
|
-
const pdfDoc = await PDFDocument.load(fancyFieldsPdfBytes);
|
|
42
|
-
const form = pdfDoc.getForm();
|
|
43
|
-
const historicalFigures = form.getRadioGroup('Historical Figures 🐺');
|
|
44
|
-
historicalFigures.select('Marie Curie ☢️');
|
|
45
|
-
expect(historicalFigures.getSelected()).toBe('Marie Curie ☢️');
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
it(`can read its flag states`, async () => {
|
|
49
|
-
const pdfDoc = await PDFDocument.load(fancyFieldsPdfBytes);
|
|
50
|
-
const form = pdfDoc.getForm();
|
|
51
|
-
const historicalFigures = form.getRadioGroup('Historical Figures 🐺');
|
|
52
|
-
|
|
53
|
-
expect(historicalFigures.isExported()).toBe(true);
|
|
54
|
-
expect(historicalFigures.isReadOnly()).toBe(false);
|
|
55
|
-
expect(historicalFigures.isRequired()).toBe(false);
|
|
56
|
-
expect(historicalFigures.isMutuallyExclusive()).toBe(true);
|
|
57
|
-
expect(historicalFigures.isOffToggleable()).toBe(false);
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
it(`supports mutualExclusion=true`, async () => {
|
|
61
|
-
const pdfDoc = await PDFDocument.create();
|
|
62
|
-
const page = pdfDoc.addPage();
|
|
63
|
-
const form = pdfDoc.getForm();
|
|
64
|
-
|
|
65
|
-
const radioGroup = form.createRadioGroup('test.group');
|
|
66
|
-
radioGroup.enableMutualExclusion();
|
|
67
|
-
|
|
68
|
-
radioGroup.addOptionToPage('foo', page);
|
|
69
|
-
radioGroup.addOptionToPage('bar', page);
|
|
70
|
-
radioGroup.addOptionToPage('foo', page);
|
|
71
|
-
radioGroup.addOptionToPage('qux', page);
|
|
72
|
-
|
|
73
|
-
const getOnWidgets = () =>
|
|
74
|
-
radioGroup.acroField
|
|
75
|
-
.getWidgets()
|
|
76
|
-
.filter((w) => w.getOnValue() === radioGroup.acroField.getValue());
|
|
77
|
-
|
|
78
|
-
expect(getOnWidgets().length).toBe(0);
|
|
79
|
-
|
|
80
|
-
radioGroup.select('foo');
|
|
81
|
-
|
|
82
|
-
expect(getOnWidgets().length).toBe(1);
|
|
83
|
-
|
|
84
|
-
expect(radioGroup.getOptions()).toEqual(['foo', 'bar', 'foo', 'qux']);
|
|
85
|
-
|
|
86
|
-
const onValues = radioGroup.acroField
|
|
87
|
-
.getWidgets()
|
|
88
|
-
.map((w) => w.getOnValue());
|
|
89
|
-
|
|
90
|
-
expect(onValues).toEqual([
|
|
91
|
-
PDFName.of('0'),
|
|
92
|
-
PDFName.of('1'),
|
|
93
|
-
PDFName.of('2'),
|
|
94
|
-
PDFName.of('3'),
|
|
95
|
-
]);
|
|
96
|
-
|
|
97
|
-
const opt = radioGroup.acroField.Opt() as PDFArray;
|
|
98
|
-
expect(opt).toBeInstanceOf(PDFArray);
|
|
99
|
-
expect(opt.size()).toBe(4);
|
|
100
|
-
expect((opt.get(0) as PDFHexString).decodeText()).toBe('foo');
|
|
101
|
-
expect((opt.get(1) as PDFHexString).decodeText()).toBe('bar');
|
|
102
|
-
expect((opt.get(2) as PDFHexString).decodeText()).toBe('foo');
|
|
103
|
-
expect((opt.get(3) as PDFHexString).decodeText()).toBe('qux');
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
it(`supports mutualExclusion=false`, async () => {
|
|
107
|
-
const pdfDoc = await PDFDocument.create();
|
|
108
|
-
const page = pdfDoc.addPage();
|
|
109
|
-
const form = pdfDoc.getForm();
|
|
110
|
-
|
|
111
|
-
const radioGroup = form.createRadioGroup('test.group');
|
|
112
|
-
radioGroup.disableMutualExclusion();
|
|
113
|
-
|
|
114
|
-
radioGroup.addOptionToPage('foo', page);
|
|
115
|
-
radioGroup.addOptionToPage('bar', page);
|
|
116
|
-
radioGroup.addOptionToPage('foo', page);
|
|
117
|
-
radioGroup.addOptionToPage('qux', page);
|
|
118
|
-
|
|
119
|
-
const getOnWidgets = () =>
|
|
120
|
-
radioGroup.acroField
|
|
121
|
-
.getWidgets()
|
|
122
|
-
.filter((w) => w.getOnValue() === radioGroup.acroField.getValue());
|
|
123
|
-
|
|
124
|
-
expect(getOnWidgets().length).toBe(0);
|
|
125
|
-
|
|
126
|
-
radioGroup.select('foo');
|
|
127
|
-
|
|
128
|
-
expect(getOnWidgets().length).toBe(2);
|
|
129
|
-
|
|
130
|
-
expect(radioGroup.getOptions()).toEqual(['foo', 'bar', 'foo', 'qux']);
|
|
131
|
-
|
|
132
|
-
const onValues = radioGroup.acroField
|
|
133
|
-
.getWidgets()
|
|
134
|
-
.map((w) => w.getOnValue());
|
|
135
|
-
|
|
136
|
-
expect(onValues).toEqual([
|
|
137
|
-
PDFName.of('0'),
|
|
138
|
-
PDFName.of('1'),
|
|
139
|
-
PDFName.of('0'),
|
|
140
|
-
PDFName.of('3'),
|
|
141
|
-
]);
|
|
142
|
-
|
|
143
|
-
const opt = radioGroup.acroField.Opt() as PDFArray;
|
|
144
|
-
expect(opt).toBeInstanceOf(PDFArray);
|
|
145
|
-
expect(opt.size()).toBe(4);
|
|
146
|
-
expect((opt.get(0) as PDFHexString).decodeText()).toBe('foo');
|
|
147
|
-
expect((opt.get(1) as PDFHexString).decodeText()).toBe('bar');
|
|
148
|
-
expect((opt.get(2) as PDFHexString).decodeText()).toBe('foo');
|
|
149
|
-
expect((opt.get(3) as PDFHexString).decodeText()).toBe('qux');
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
it(`produces printable widgets when added to a page`, async () => {
|
|
153
|
-
const pdfDoc = await PDFDocument.create();
|
|
154
|
-
const page = pdfDoc.addPage();
|
|
155
|
-
|
|
156
|
-
const form = pdfDoc.getForm();
|
|
157
|
-
|
|
158
|
-
const radioGroup = form.createRadioGroup('a.new.radio.group');
|
|
159
|
-
|
|
160
|
-
const widgets = () => radioGroup.acroField.getWidgets();
|
|
161
|
-
expect(widgets().length).toBe(0);
|
|
162
|
-
|
|
163
|
-
radioGroup.addOptionToPage('foo', page);
|
|
164
|
-
expect(widgets().length).toBe(1);
|
|
165
|
-
expect(widgets()[0].hasFlag(AnnotationFlags.Print)).toBe(true);
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
it(`sets page reference when added to a page`, async () => {
|
|
169
|
-
const pdfDoc = await PDFDocument.create();
|
|
170
|
-
const page = pdfDoc.addPage();
|
|
171
|
-
|
|
172
|
-
const form = pdfDoc.getForm();
|
|
173
|
-
|
|
174
|
-
const radioGroup = form.createRadioGroup('a.new.radio.group');
|
|
175
|
-
|
|
176
|
-
const widgets = () => radioGroup.acroField.getWidgets();
|
|
177
|
-
expect(widgets().length).toBe(0);
|
|
178
|
-
|
|
179
|
-
radioGroup.addOptionToPage('foo', page);
|
|
180
|
-
expect(widgets().length).toBe(1);
|
|
181
|
-
expect(widgets()[0].P()).toBe(page.ref);
|
|
182
|
-
});
|
|
183
|
-
});
|