Package: pdfsyntax
PDFSyntaxA Python library to inspect and modify the internal structure of a PDF fileIntroductionThe project is focused on chapter 7 ("Syntax") of the Portable Document Format (PDF) Specification.PDFSyntax is lightweight (no dependencies) and written from scratch in pure Python.CLI: It started as a command-line interface to inspect the internal structure of a PDF file.API: Now the internal functions are being exposed as a toolkit for PDF read/write operations.Project statusWORK IN PROGRESS! This is ALPHA quality software. The API may change anytime.DesignPDFSyntax favors non-destructive edits allowed by the PDF Specification: by default incremental updates are added at the end of the original file.It is mostly made of simple functions working on built-in types and named tuples. Shallow copying of the Doc object structure performed by pure functions offers some kind of -experimental- immutability.InstallationYou can install from PyPI:pip install pdfsyntaxCLI overviewPlease refer to theCLI READMEfor details.The general form of the CLI usage is:python3 -m pdfsyntax COMMAND FILEYou can get quick insights on a PDF file with these commands:overviewoutputs text data about the structure and the metadata.inspectoutputs static html data that lets you browse the internal structure of the PDF file: the PDF source is pretty-printed and augmented with hyperlinks.API overviewPlease refer to theAPI READMEfor details.PDFSyntax is mostly made of simple functions. Example:>>>frompdfsyntaximportreadfile,metadata>>>doc=readfile("samples/simple_text_string.pdf")>>>metadata(doc)#returns a Python dict whose keys are 'Title', 'Author', 'Subject', etc...The Doc object is probably the only dedicated class you will need to handle. It is a black box that stores all the internal states of a document:content that is cached/memoized from an original file,modifications that add/modifiy/delete content and that are tracked as incremental updates.>>>doc<PDFDocwith1revisions(s),readytostartupdate/revision2,cacheloadedwith0/7objects>This object exposes as a method the same metadata function, therefore you can get the same result with:>>>doc.metadata()#returns a Python dict whose keys are 'Title', 'Author', 'Subject', etc...Low-level functions likeget_objectorupdate_objectallow you to directly access and manipulate the inner objects of the document structure.
You may also use higher-level functions likerotate:>>>frompdfsyntaximportrotate,writefile>>>doc180=rotate(doc,180)#rotate pages by 180°The orignal object is unchanged and a new object is created with an incremental update (revision 2) that encloses the ongoing orientation modification:>>>doc180<PDFDocwith2revisions(s),currentupdate/revisioncontaining1modifications,cacheloadedwith3/7objects>You then can write the modified PDF to disk. Note that the resulting file contains a new section appended to the original content. You may cut this section to revert the change.>>>writefile(doc180,"rotated_doc.pdf")Open-Source, not Open-Contribution yetPDFSyntax isMIT licensedbut is currently closed to contributions.Personal note: this is a pet projet of mine and my time is limited. First I need to focus on my roadmap (new features and refactoring) and then I will happily accept contributions when everything is a little more stabilised.