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