In the original design for iText, it was possible to create a high-level
Document object, and then have different
DocListener objects listening to that
Document object. This was achieved by using different writers: a
HTMLWriter, and an
RtfWriter. When using a
PdfDocument was created internally. This low-level class took care of all PDF-related structures. More or less the same was true for the other formats.
Over the years, iText specialized and it became a pure PDF library. The creation of HTML and RTF was abandoned, hence it was no longer necessary to create a
Document before creating a
PdfWriter, but we had to stick to the original architecture because we weren't ready to break the API.
Over the years, we added more and more PDF functionality to iText, and the fact that
PdfDocument was a class for internal use only became problematic. We used workarounds so that we could introduce new PDF features that belonged in the
PdfDocument class up until the point that we reached the ceiling of what we considered acceptable as workarounds.
That's when we decided to rewrite iText from scratch and to create a completely new architecture for iText. Now we have a clear distinction between the
PdfDocument (for low-level operations) and the
Document (for high-level functionality). We no longer have to open the document, and if we use the try-with-resources approach, we don't even have to close it ourselves.
Want to know more? Get the free ebook!