1 Using Skia's PDF Backend 2 ======================== 3 4 Here is an example of using Skia's PDF backend (SkPDF) via the 5 SkDocument and SkCanvas APIs. 6 7 <!--?prettify lang=cc?--> 8 9 #include "SkPDFDocument.h" 10 11 void WritePDF(SkWStream* outputStream, 12 const char* documentTitle, 13 void (*writePage)(SkCanvas*, int page), 14 int numberOfPages, 15 SkSize pageSize) { 16 SkPDF::Metadata metadata; 17 metadata.fTitle = documentTitle; 18 metadata.fCreator = "Example WritePDF() Function"; 19 SkTime::DateTime now; 20 SkTime::GetDateTime(&now); 21 metadata.fCreation = now; 22 metadata.fModified = now; 23 auto pdfDocument = SkPDF::MakeDocument(outputStream, metadata); 24 assert(pdfDocument); 25 26 for (int page = 0; page < numberOfPages; ++page) { 27 SkCanvas* pageCanvas = pdfDocument->beginPage(pageSize.width(), 28 pageSize.height()); 29 writePage(pageCanvas, page); 30 pdfDocument->endPage(); 31 } 32 pdfDocument->close(); 33 } 34 35 * * * 36 37 <span id="limits">SkPDF Limitations</span> 38 ------------------------------------------ 39 40 There are several corners of Skia's public API that SkPDF currently 41 does not handle because either no known client uses the feature or 42 there is no simple PDF-ish way to handle it. 43 44 In this document: 45 46 + **drop** means to draw nothing. 47 48 + **ignore** means to draw without the effect 49 50 + **expand** means to implement something in a non-PDF-ish way. 51 This may mean to rasterize vector graphics, to expand paths with 52 path effects into many individual paths, or to convert text to 53 paths. 54 55 <style scoped><!-- 56 #pdftable {border-collapse:collapse;} 57 #pdftable tr th, #pdftable tr td {border:#888888 2px solid;padding: 5px;} 58 --></style> 59 <table id="pdftable"> 60 <tr><th>Effect</th> <th>text</th> <th>images</th> <th>everything 61 else</th></tr> 62 <tr><th>SkMaskFilter</th> <td>drop</td> <td>ignore</td> <td>ignore</td></tr> 63 <tr><th>SkPathEffect</th> <td>ignore</td> <td>n/a</td> <td>expand</td></tr> 64 <tr><th>SkColorFilter</th> <td>ignore</td> <td>expand</td> <td>ignore</td></tr> 65 <tr><th>SkImageFilter</th> <td>expand</td> <td>expand</td> <td>expand</td></tr> 66 <tr><th>unsupported SkXferModes</th> <td>ignore</td> <td>ignore</td> <td>ignore</td></tr> 67 <tr><th>non-gradient SkShader</th> <td>expand</td> <td>n/a</td> <td>expand</td></tr> 68 </table> 69 70 Notes: 71 72 - *SkImageFilter*: When SkImageFilter is expanded, text-as-text is lost. 73 74 - *SkXferMode*: The following transfer modes are not natively 75 supported by PDF: DstOver, SrcIn, DstIn, SrcOut, DstOut, SrcATop, 76 DstATop, and Modulate. 77 78 Other limitations: 79 80 - *drawText with VerticalText* drop. No known clients seem to make use 81 of the VerticalText flag. 82 83 - *drawTextOnPath* expand. (Text-as-text is lost.) 84 85 - *drawVertices* drop. 86 87 - *drawPatch* drop. 88 89 * * * 90