Awesome, I'm looking forward a "formal" proposal of all this! :)
Best, - Amr On Sat, Apr 5, 2008 at 4:53 AM, Willie Alberty <[EMAIL PROTECTED]> wrote: > For the last few months I have been working with Kevin McArthur on a > comprehensive PDF generation project for a client [Streamflow] who has some > pretty advanced layout needs. The project is nearing completion and we have > been discussing the possibility of contributing large portions of the code > back to the Zend Framework as improvements to Zend_Pdf. > > In light of several recent postings to fw-general and fw-formats, as well > as a few encouraging proposals recently submitted to the Wiki, we would like > to formally announce our plans and describe the new functionality at a high > level here. > > We will be submitting proposals in the coming weeks that describe these > new components in more detail along with fully-functional reference > implementations. Our hope is to join forces with other interested developers > to help fast-track these proposals through the feedback and approval > process, write tests, user documentation, and examples, and exercise the > code as much as possible. > > We're really proud of this work and are excited to share it with the > community. We believe that these enhancements will further establish > Zend_Pdf's role as the gold standard for PDF generation using PHP. > > > Text Layout Engine > ------------------ > > "How do I wrap long lines of text?" This is probably the most > commonly-asked question regarding Zend_Pdf. I'm pleased to report that not > only have we solved the problem of text-wrapping, but a whole host of others > as well. The new engine provides fully-automatic text layout, and has > customization hooks in a variety of places. > > Line breaks are calculated using the Unicode Line Breaking Algorithm (UAX > #14), providing linguistically-appropriate line breaks, not just at > whitespace characters. > > Paragraph styles allow you to specify left-, center-, and right-alignment, > as well as full justification, line leading, line height, line multiple > (double-space, triple-space, etc.), pre- and post- paragraph spacing, left- > and right-side margins, and first-line indentation. Paragraph styles also > support left-, center-, right-, and decimal-aligned tab stops, with or > without leaders, for intra-line alignment needs. > > In addition to the left-to-right line sweep used by most Latin-based > scripts, right-to-left line sweep is also supported, and is automatically > detected by the layout engine; you never need to supply strings in reverse > character order for right-to-left text layout. > > The layout engine is based around the concept of an attributed string. > These are Unicode strings of unlimited length, and fully support the entire > Unicode character set, including characters outside the Basic Multilingual > Plane (BMP). > > Attributed strings allow you to assign stylistic attributes to arbitrary > ranges of characters within the string. These attributes are used by > typesetters to determine the specific look and location for every character. > This means that you can make unlimited style changes within a block of text, > even changing styles character-by-character if desired. > > The layout engine automatically manages all of these style changes, > applying them as necessary when drawing the text on the page. The following > style attributes are supported: > > - Font > - Font size > - Fill color > - Stroke width and color > - Underline and strikethrough > - Super- and sub-script > - Background color > > You can add your own custom attributes as well, which you can use in your > own subclasses to completely customize the layout engine's behavior. > > These attributed strings will eventually be shared with Zend_Rtf (recently > proposed by Andries Seutens), as each attributed string is essentially a > self-contained RTF document. This opens up the possibility for generating > fully-styled PDF or RTF output from the same source with only a couple of > lines of code. It will also eventually be possible to use existing styled > RTF documents as the basis for PDF text drawing, eliminating the need to > manually apply style attributes in your PHP code. > > A layout manager class is responsible for drawing these attributed > strings. It lays out the text in a series of arbitrarily-shaped text > containers, automatically moving from one to the next as each is filled. > Rectangular and circular containers will be provided, but you can easily > create your own custom containers for other shapes or to flow text around > images. > > Multi-column output is as easy as creating two adjacent text containers on > the same page. Text containers don't even need to be on the same PDF page: > you can start your text in a small container on page 1, then continue it on > page 17. > > Callback functions are provided to allow you to create text additional > containers as needed, which can be located on new pages. This is useful if > you do not know the length of the text you are drawing ahead of time, or if > you want to adapt your layout on-the-fly. > > You can also use multiple layout managers on a single page, allowing you > to create complex multi-page flows for a series of text runs. These can be > useful for creating page headers and footers, or for running stories > side-by-side in a newsletter. > > > Drawing Model > ------------- > > Three new primitive geometry classes allow you to precisely define drawing > locations, sizes, and regions. They also provide a host of convenience > functions allowing for calculation, conversion, intersection testing, etc.: > > - Point: x and y coordinate > - Size: height and width > - Rectangle: combination of a point and size > > PDF pages are drawn using a series of content streams, which contain all > of the low-level drawing commands. Zend_Pdf_Page currently manages its own > private content stream. > > We've separated content streams from Zend_Pdf_Page, promoting them to > first-class objects. This allows us to use these content streams as > templates that can be reused again and again, either on a single page or > multiple pages. Templates can greatly reduce PDF file sizes and improve > memory use and performance in PDF viewer applications. > > It is also possible to create a template from any page in an existing PDF > document. You can then reuse the template in the same PDF, or even copy it > to a new PDF document, where you can use it as a page background, draw it as > a thumbnail, perform imposition, etc. > > > Performance and Memory > ---------------------- > > We've also made numerous performance and memory-usage improvements > throughout the code. Most data is now lazily-loaded, allowing you to > manipulate very large documents, containing thousands or millions of > individual objects or hundreds of megabytes or gigabytes in size, with a > very low memory footprint. > > > Future Enhancements > ------------------- > > All of this new functionality lays the groundwork for even more powerful > enhancements down the road: > > - Top-to-bottom line sweep for Asian scripts > - Bi-directional text (for Hebrew, Arabic, and others) > - Bulleted and numbered text lists > - HTML-inspired inline text tables > - Inline attachments (for example, images that flow with text) > - Advanced typographic features such as tracking, pairwise kerning, > ligatures, etc. > - Hyphenation support > - Glyph substitution using fallback fonts > - and more... > > > Again, we're really excited to be sharing this code with the community. > We'll be creating the proposals for the various components in the coming > weeks and announcing them on the fw-formats list when they're ready for > review. In the meantime, if you have any high-level questions, please don't > hesitate to ask. > > -- > > Willie Alberty, Owner > Spenlen Media > [EMAIL PROTECTED] > > http://www.spenlen.com/ > > -- Amr Mostafa, Head of Software Development, IT Synergy [EMAIL PROTECTED] http://itsyn.com +(2012)1700502 +(202)35371020
