// Copyright 2019 Google LLC. // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. #include "tools/fiddle/examples.h" REG_FIDDLE(PDF, 256, 256, true, 0) { // Here is an example of using Skia’s PDF backend (SkPDF) via the SkDocument // and SkCanvas APIs. void WritePDF(SkWStream* outputStream, const char* documentTitle, void (*writePage)(SkCanvas*, int page), int numberOfPages, SkSize pageSize) { SkPDF::Metadata metadata; metadata.fTitle = documentTitle; metadata.fCreator = "Example WritePDF() Function"; metadata.fCreation = {0, 2019, 1, 4, 31, 12, 34, 56}; metadata.fModified = {0, 2019, 1, 4, 31, 12, 34, 56}; auto pdfDocument = SkPDF::MakeDocument(outputStream, metadata); SkASSERT(pdfDocument); for (int page = 0; page < numberOfPages; ++page) { SkCanvas* pageCanvas = pdfDocument->beginPage(pageSize.width(), pageSize.height()); writePage(pageCanvas, page); pdfDocument->endPage(); } pdfDocument->close(); } // Print binary data to stdout as hex. void print_data(const SkData* data, const char* name) { if (data) { SkDebugf("\nxxd -r -p > %s << EOF", name); size_t s = data->size(); const uint8_t* d = data->bytes(); for (size_t i = 0; i < s; ++i) { if (i % 40 == 0) { SkDebugf("\n"); } SkDebugf("%02x", d[i]); } SkDebugf("\nEOF\n\n"); } } // example function that draws on a SkCanvas. void write_page(SkCanvas* canvas, int) { const SkScalar R = 115.2f, C = 128.0f; SkPath path; path.moveTo(C + R, C); for (int i = 1; i < 8; ++i) { SkScalar a = 2.6927937f * i; path.lineTo(C + R * cos(a), C + R * sin(a)); } SkPaint paint; paint.setStyle(SkPaint::kStroke_Style); canvas->drawPath(path, paint); } void draw(SkCanvas*) { constexpr SkSize ansiLetterSize{8.5f * 72, 11.0f * 72}; SkDynamicMemoryWStream buffer; WritePDF(&buffer, "SkPDF Example", &write_page, 1, ansiLetterSize); sk_sp pdfData = buffer.detachAsData(); print_data(pdfData.get(), "skpdf_example.pdf"); } } // END FIDDLE