Spaces:
Paused
Paused
| """ | |
| See Portable Document Format Reference Manual, 1993. ISBN 0-201-62628-4. | |
| See https://ia802202.us.archive.org/8/items/pdfy-0vt8s-egqFwDl7L2/PDF%20Reference%201.0.pdf | |
| PDF Reference, third edition, Version 1.4, 2001. ISBN 0-201-75839-3. | |
| PDF Reference, sixth edition, Version 1.7, 2006. | |
| """ | |
| from enum import IntFlag | |
| from typing import Dict, Tuple | |
| class Core: | |
| """Keywords that don't quite belong anywhere else.""" | |
| OUTLINES = "/Outlines" | |
| THREADS = "/Threads" | |
| PAGE = "/Page" | |
| PAGES = "/Pages" | |
| CATALOG = "/Catalog" | |
| class TrailerKeys: | |
| ROOT = "/Root" | |
| ENCRYPT = "/Encrypt" | |
| ID = "/ID" | |
| INFO = "/Info" | |
| SIZE = "/Size" | |
| class CatalogAttributes: | |
| NAMES = "/Names" | |
| DESTS = "/Dests" | |
| class EncryptionDictAttributes: | |
| """ | |
| Additional encryption dictionary entries for the standard security handler. | |
| TABLE 3.19, Page 122 | |
| """ | |
| R = "/R" # number, required; revision of the standard security handler | |
| O = "/O" # 32-byte string, required | |
| U = "/U" # 32-byte string, required | |
| P = "/P" # integer flag, required; permitted operations | |
| ENCRYPT_METADATA = "/EncryptMetadata" # boolean flag, optional | |
| class UserAccessPermissions(IntFlag): | |
| """TABLE 3.20 User access permissions""" | |
| R1 = 1 | |
| R2 = 2 | |
| PRINT = 4 | |
| MODIFY = 8 | |
| EXTRACT = 16 | |
| ADD_OR_MODIFY = 32 | |
| R7 = 64 | |
| R8 = 128 | |
| FILL_FORM_FIELDS = 256 | |
| EXTRACT_TEXT_AND_GRAPHICS = 512 | |
| ASSEMBLE_DOC = 1024 | |
| PRINT_TO_REPRESENTATION = 2048 | |
| R13 = 2**12 | |
| R14 = 2**13 | |
| R15 = 2**14 | |
| R16 = 2**15 | |
| R17 = 2**16 | |
| R18 = 2**17 | |
| R19 = 2**18 | |
| R20 = 2**19 | |
| R21 = 2**20 | |
| R22 = 2**21 | |
| R23 = 2**22 | |
| R24 = 2**23 | |
| R25 = 2**24 | |
| R26 = 2**25 | |
| R27 = 2**26 | |
| R28 = 2**27 | |
| R29 = 2**28 | |
| R30 = 2**29 | |
| R31 = 2**30 | |
| R32 = 2**31 | |
| class Ressources: | |
| """TABLE 3.30 Entries in a resource dictionary.""" | |
| EXT_G_STATE = "/ExtGState" # dictionary, optional | |
| COLOR_SPACE = "/ColorSpace" # dictionary, optional | |
| PATTERN = "/Pattern" # dictionary, optional | |
| SHADING = "/Shading" # dictionary, optional | |
| XOBJECT = "/XObject" # dictionary, optional | |
| FONT = "/Font" # dictionary, optional | |
| PROC_SET = "/ProcSet" # array, optional | |
| PROPERTIES = "/Properties" # dictionary, optional | |
| class PagesAttributes: | |
| """Page Attributes, Table 6.2, Page 52.""" | |
| TYPE = "/Type" # name, required; must be /Pages | |
| KIDS = "/Kids" # array, required; List of indirect references | |
| COUNT = "/Count" # integer, required; the number of all nodes und this node | |
| PARENT = "/Parent" # dictionary, required; indirect reference to pages object | |
| class PageAttributes: | |
| """TABLE 3.27 Entries in a page object.""" | |
| TYPE = "/Type" # name, required; must be /Page | |
| PARENT = "/Parent" # dictionary, required; a pages object | |
| LAST_MODIFIED = ( | |
| "/LastModified" # date, optional; date and time of last modification | |
| ) | |
| RESOURCES = "/Resources" # dictionary, required if there are any | |
| MEDIABOX = "/MediaBox" # rectangle, required; rectangle specifying page size | |
| CROPBOX = "/CropBox" # rectangle, optional; rectangle | |
| BLEEDBOX = "/BleedBox" # rectangle, optional; rectangle | |
| TRIMBOX = "/TrimBox" # rectangle, optional; rectangle | |
| ARTBOX = "/ArtBox" # rectangle, optional; rectangle | |
| BOX_COLOR_INFO = "/BoxColorInfo" # dictionary, optional | |
| CONTENTS = "/Contents" # stream or array, optional | |
| ROTATE = "/Rotate" # integer, optional; page rotation in degrees | |
| GROUP = "/Group" # dictionary, optional; page group | |
| THUMB = "/Thumb" # stream, optional; indirect reference to image of the page | |
| B = "/B" # array, optional | |
| DUR = "/Dur" # number, optional | |
| TRANS = "/Trans" # dictionary, optional | |
| ANNOTS = "/Annots" # array, optional; an array of annotations | |
| AA = "/AA" # dictionary, optional | |
| METADATA = "/Metadata" # stream, optional | |
| PIECE_INFO = "/PieceInfo" # dictionary, optional | |
| STRUCT_PARENTS = "/StructParents" # integer, optional | |
| ID = "/ID" # byte string, optional | |
| PZ = "/PZ" # number, optional | |
| TABS = "/Tabs" # name, optional | |
| TEMPLATE_INSTANTIATED = "/TemplateInstantiated" # name, optional | |
| PRES_STEPS = "/PresSteps" # dictionary, optional | |
| USER_UNIT = "/UserUnit" # number, optional | |
| VP = "/VP" # dictionary, optional | |
| class FileSpecificationDictionaryEntries: | |
| """TABLE 3.41 Entries in a file specification dictionary""" | |
| Type = "/Type" | |
| FS = "/FS" # The name of the file system to be used to interpret this file specification | |
| F = "/F" # A file specification string of the form described in Section 3.10.1 | |
| EF = "/EF" # dictionary, containing a subset of the keys F , UF , DOS , Mac , and Unix | |
| class StreamAttributes: | |
| """Table 4.2.""" | |
| LENGTH = "/Length" # integer, required | |
| FILTER = "/Filter" # name or array of names, optional | |
| DECODE_PARMS = "/DecodeParms" # variable, optional -- 'decodeParams is wrong | |
| class FilterTypes: | |
| """ | |
| Table 4.3 of the 1.4 Manual. | |
| Page 354 of the 1.7 Manual | |
| """ | |
| ASCII_HEX_DECODE = "/ASCIIHexDecode" # abbreviation: AHx | |
| ASCII_85_DECODE = "/ASCII85Decode" # abbreviation: A85 | |
| LZW_DECODE = "/LZWDecode" # abbreviation: LZW | |
| FLATE_DECODE = "/FlateDecode" # abbreviation: Fl, PDF 1.2 | |
| RUN_LENGTH_DECODE = "/RunLengthDecode" # abbreviation: RL | |
| CCITT_FAX_DECODE = "/CCITTFaxDecode" # abbreviation: CCF | |
| DCT_DECODE = "/DCTDecode" # abbreviation: DCT | |
| class FilterTypeAbbreviations: | |
| """Table 4.44 of the 1.7 Manual (page 353ff).""" | |
| AHx = "/AHx" | |
| A85 = "/A85" | |
| LZW = "/LZW" | |
| FL = "/Fl" # FlateDecode | |
| RL = "/RL" | |
| CCF = "/CCF" | |
| DCT = "/DCT" | |
| class LzwFilterParameters: | |
| """Table 4.4.""" | |
| PREDICTOR = "/Predictor" # integer | |
| COLUMNS = "/Columns" # integer | |
| COLORS = "/Colors" # integer | |
| BITS_PER_COMPONENT = "/BitsPerComponent" # integer | |
| EARLY_CHANGE = "/EarlyChange" # integer | |
| class CcittFaxDecodeParameters: | |
| """Table 4.5.""" | |
| K = "/K" # integer | |
| END_OF_LINE = "/EndOfLine" # boolean | |
| ENCODED_BYTE_ALIGN = "/EncodedByteAlign" # boolean | |
| COLUMNS = "/Columns" # integer | |
| ROWS = "/Rows" # integer | |
| END_OF_BLOCK = "/EndOfBlock" # boolean | |
| BLACK_IS_1 = "/BlackIs1" # boolean | |
| DAMAGED_ROWS_BEFORE_ERROR = "/DamagedRowsBeforeError" # integer | |
| class ImageAttributes: | |
| """Table 6.20.""" | |
| TYPE = "/Type" # name, required; must be /XObject | |
| SUBTYPE = "/Subtype" # name, required; must be /Image | |
| NAME = "/Name" # name, required | |
| WIDTH = "/Width" # integer, required | |
| HEIGHT = "/Height" # integer, required | |
| BITS_PER_COMPONENT = "/BitsPerComponent" # integer, required | |
| COLOR_SPACE = "/ColorSpace" # name, required | |
| DECODE = "/Decode" # array, optional | |
| INTERPOLATE = "/Interpolate" # boolean, optional | |
| IMAGE_MASK = "/ImageMask" # boolean, optional | |
| class ColorSpaces: | |
| DEVICE_RGB = "/DeviceRGB" | |
| DEVICE_CMYK = "/DeviceCMYK" | |
| DEVICE_GRAY = "/DeviceGray" | |
| class TypArguments: | |
| """Table 8.2 of the PDF 1.7 reference.""" | |
| LEFT = "/Left" | |
| RIGHT = "/Right" | |
| BOTTOM = "/Bottom" | |
| TOP = "/Top" | |
| class TypFitArguments: | |
| """Table 8.2 of the PDF 1.7 reference.""" | |
| FIT = "/Fit" | |
| FIT_V = "/FitV" | |
| FIT_BV = "/FitBV" | |
| FIT_B = "/FitB" | |
| FIT_H = "/FitH" | |
| FIT_BH = "/FitBH" | |
| FIT_R = "/FitR" | |
| XYZ = "/XYZ" | |
| class GoToActionArguments: | |
| S = "/S" # name, required: type of action | |
| D = "/D" # name / byte string /array, required: Destination to jump to | |
| class AnnotationDictionaryAttributes: | |
| """TABLE 8.15 Entries common to all annotation dictionaries""" | |
| Type = "/Type" | |
| Subtype = "/Subtype" | |
| Rect = "/Rect" | |
| Contents = "/Contents" | |
| P = "/P" | |
| NM = "/NM" | |
| M = "/M" | |
| F = "/F" | |
| AP = "/AP" | |
| AS = "/AS" | |
| Border = "/Border" | |
| C = "/C" | |
| StructParent = "/StructParent" | |
| OC = "/OC" | |
| class InteractiveFormDictEntries: | |
| Fields = "/Fields" | |
| NeedAppearances = "/NeedAppearances" | |
| SigFlags = "/SigFlags" | |
| CO = "/CO" | |
| DR = "/DR" | |
| DA = "/DA" | |
| Q = "/Q" | |
| XFA = "/XFA" | |
| class FieldDictionaryAttributes: | |
| """TABLE 8.69 Entries common to all field dictionaries (PDF 1.7 reference).""" | |
| FT = "/FT" # name, required for terminal fields | |
| Parent = "/Parent" # dictionary, required for children | |
| Kids = "/Kids" # array, sometimes required | |
| T = "/T" # text string, optional | |
| TU = "/TU" # text string, optional | |
| TM = "/TM" # text string, optional | |
| Ff = "/Ff" # integer, optional | |
| V = "/V" # text string, optional | |
| DV = "/DV" # text string, optional | |
| AA = "/AA" # dictionary, optional | |
| def attributes(cls) -> Tuple[str, ...]: | |
| return ( | |
| cls.TM, | |
| cls.T, | |
| cls.FT, | |
| cls.Parent, | |
| cls.TU, | |
| cls.Ff, | |
| cls.V, | |
| cls.DV, | |
| cls.Kids, | |
| cls.AA, | |
| ) | |
| def attributes_dict(cls) -> Dict[str, str]: | |
| return { | |
| cls.FT: "Field Type", | |
| cls.Parent: "Parent", | |
| cls.T: "Field Name", | |
| cls.TU: "Alternate Field Name", | |
| cls.TM: "Mapping Name", | |
| cls.Ff: "Field Flags", | |
| cls.V: "Value", | |
| cls.DV: "Default Value", | |
| } | |
| class CheckboxRadioButtonAttributes: | |
| """TABLE 8.76 Field flags common to all field types""" | |
| Opt = "/Opt" # Options, Optional | |
| def attributes(cls) -> Tuple[str, ...]: | |
| return (cls.Opt,) | |
| def attributes_dict(cls) -> Dict[str, str]: | |
| return { | |
| cls.Opt: "Options", | |
| } | |
| class FieldFlag(IntFlag): | |
| """TABLE 8.70 Field flags common to all field types""" | |
| READ_ONLY = 1 | |
| REQUIRED = 2 | |
| NO_EXPORT = 4 | |
| class DocumentInformationAttributes: | |
| """TABLE 10.2 Entries in the document information dictionary.""" | |
| TITLE = "/Title" # text string, optional | |
| AUTHOR = "/Author" # text string, optional | |
| SUBJECT = "/Subject" # text string, optional | |
| KEYWORDS = "/Keywords" # text string, optional | |
| CREATOR = "/Creator" # text string, optional | |
| PRODUCER = "/Producer" # text string, optional | |
| CREATION_DATE = "/CreationDate" # date, optional | |
| MOD_DATE = "/ModDate" # date, optional | |
| TRAPPED = "/Trapped" # name, optional | |
| class PageLayouts: | |
| """Page 84, PDF 1.4 reference.""" | |
| SINGLE_PAGE = "/SinglePage" | |
| ONE_COLUMN = "/OneColumn" | |
| TWO_COLUMN_LEFT = "/TwoColumnLeft" | |
| TWO_COLUMN_RIGHT = "/TwoColumnRight" | |
| class GraphicsStateParameters: | |
| """Table 4.8 of the 1.7 reference.""" | |
| TYPE = "/Type" # name, optional | |
| LW = "/LW" # number, optional | |
| # TODO: Many more! | |
| FONT = "/Font" # array, optional | |
| S_MASK = "/SMask" # dictionary or name, optional | |
| class CatalogDictionary: | |
| """Table 3.25 in the 1.7 reference.""" | |
| TYPE = "/Type" # name, required; must be /Catalog | |
| VERSION = "/Version" # name | |
| PAGES = "/Pages" # dictionary, required | |
| PAGE_LABELS = "/PageLabels" # number tree, optional | |
| NAMES = "/Names" # dictionary, optional | |
| DESTS = "/Dests" # dictionary, optional | |
| VIEWER_PREFERENCES = "/ViewerPreferences" # dictionary, optional | |
| PAGE_LAYOUT = "/PageLayout" # name, optional | |
| PAGE_MODE = "/PageMode" # name, optional | |
| OUTLINES = "/Outlines" # dictionary, optional | |
| THREADS = "/Threads" # array, optional | |
| OPEN_ACTION = "/OpenAction" # array or dictionary or name, optional | |
| AA = "/AA" # dictionary, optional | |
| URI = "/URI" # dictionary, optional | |
| ACRO_FORM = "/AcroForm" # dictionary, optional | |
| METADATA = "/Metadata" # stream, optional | |
| STRUCT_TREE_ROOT = "/StructTreeRoot" # dictionary, optional | |
| MARK_INFO = "/MarkInfo" # dictionary, optional | |
| LANG = "/Lang" # text string, optional | |
| SPIDER_INFO = "/SpiderInfo" # dictionary, optional | |
| OUTPUT_INTENTS = "/OutputIntents" # array, optional | |
| PIECE_INFO = "/PieceInfo" # dictionary, optional | |
| OC_PROPERTIES = "/OCProperties" # dictionary, optional | |
| PERMS = "/Perms" # dictionary, optional | |
| LEGAL = "/Legal" # dictionary, optional | |
| REQUIREMENTS = "/Requirements" # array, optional | |
| COLLECTION = "/Collection" # dictionary, optional | |
| NEEDS_RENDERING = "/NeedsRendering" # boolean, optional | |
| class OutlineFontFlag(IntFlag): | |
| """ | |
| A class used as an enumerable flag for formatting an outline font | |
| """ | |
| italic = 1 | |
| bold = 2 | |
| PDF_KEYS = ( | |
| AnnotationDictionaryAttributes, | |
| CatalogAttributes, | |
| CatalogDictionary, | |
| CcittFaxDecodeParameters, | |
| CheckboxRadioButtonAttributes, | |
| ColorSpaces, | |
| Core, | |
| DocumentInformationAttributes, | |
| EncryptionDictAttributes, | |
| FieldDictionaryAttributes, | |
| FilterTypeAbbreviations, | |
| FilterTypes, | |
| GoToActionArguments, | |
| GraphicsStateParameters, | |
| ImageAttributes, | |
| FileSpecificationDictionaryEntries, | |
| LzwFilterParameters, | |
| PageAttributes, | |
| PageLayouts, | |
| PagesAttributes, | |
| Ressources, | |
| StreamAttributes, | |
| TrailerKeys, | |
| TypArguments, | |
| TypFitArguments, | |
| ) | |