| Using Skia's PDF Backend |
| ======================== |
| |
| Here is an example of using Skia's PDF backend (SkPDF) via the |
| SkDocument and SkCanvas APIs. |
| |
| <!--?prettify lang=cc?--> |
| |
| #include "SkDocument.h" |
| |
| void WritePDF(SkWStream* outputStream, |
| const char* documentTitle, |
| void (*writePage)(SkCanvas*, int page), |
| int numberOfPages, |
| SkSize pageSize) { |
| SkDocument::PDFMetadata metadata; |
| metadata.fTitle = documentTitle; |
| metadata.fCreator = "Example WritePDF() Function"; |
| SkTime::DateTime now; |
| SkTime::GetDateTime(&now); |
| metadata.fCreation.fEnabled = true; |
| metadata.fCreation.fDateTime = now; |
| metadata.fModified.fEnabled = true; |
| metadata.fModified.fDateTime = now; |
| sk_sp<SkDocument> pdfDocument = SkDocument::MakePDF( |
| outputStream, SK_ScalarDefaultRasterDPI, metadata, |
| nullptr, true); |
| assert(pdfDocument); |
| |
| for (int page = 0; page < numberOfPages; ++page) { |
| SkCanvas* pageCanvas = |
| pdfDocument->beginPage(pageSize.width(), |
| pageSize.height()); |
| writePage(pageCanvas, page); |
| pdfDocument->endPage(); |
| } |
| pdfDocument->close(); |
| } |
| |
| * * * |
| |
| <span id="limits">SkPDF Limitations</span> |
| ------------------------------------------ |
| |
| There are several corners of Skia's public API that SkPDF currently |
| does not handle because either no known client uses the feature or |
| there is no simple PDF-ish way to handle it. |
| |
| In this document: |
| |
| + **drop** means to draw nothing. |
| |
| + **ignore** means to draw without the effect |
| |
| + **expand** means to implement something in a non-PDF-ish way. |
| This may mean to rasterize vector graphics, to expand paths with |
| path effects into many individual paths, or to convert text to |
| paths. |
| |
| <style scoped><!-- |
| #pdftable {border-collapse:collapse;} |
| #pdftable tr th, #pdftable tr td {border:#888888 2px solid;padding: 5px;} |
| --></style> |
| <table id="pdftable"> |
| <tr><th>Effect</th> <th>text</th> <th>images</th> <th>everything |
| else</th></tr> |
| <tr><th>SkMaskFilter</th> <td>drop</td> <td>ignore</td> <td>ignore</td></tr> |
| <tr><th>SkPathEffect</th> <td>ignore</td> <td>n/a</td> <td>expand</td></tr> |
| <tr><th>SkColorFilter</th> <td>ignore</td> <td>expand</td> <td>ignore</td></tr> |
| <tr><th>SkImageFilter</th> <td>expand</td> <td>expand</td> <td>expand</td></tr> |
| <tr><th>unsupported SkXferModes</th> <td>ignore</td> <td>ignore</td> <td>ignore</td></tr> |
| <tr><th>non-gradient SkShader</th> <td>expand</td> <td>n/a</td> <td>expand</td></tr> |
| </table> |
| |
| Notes: |
| |
| - *SkImageFilter*: When SkImageFilter is expanded, text-as-text is lost. |
| |
| - *SkXferMode*: The following transfer modes are not natively |
| supported by PDF: DstOver, SrcIn, DstIn, SrcOut, DstOut, SrcATop, |
| DstATop, and Modulate. |
| |
| Other limitations: |
| |
| - *drawText with VerticalText* — drop. No known clients seem to make use |
| of the VerticalText flag. |
| |
| - *drawTextOnPath* — expand. (Text-as-text is lost.) |
| |
| - *drawVertices* — drop. |
| |
| - *drawPatch* — drop. |
| |
| * * * |