• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2020 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 #include "tests/Test.h"
8 
9 #ifdef SK_SUPPORT_PDF
10 
11 #include "include/core/SkAnnotation.h"
12 #include "include/core/SkCanvas.h"
13 #include "include/core/SkFont.h"
14 #include "include/core/SkStream.h"
15 #include "include/docs/SkPDFDocument.h"
16 
17 using PDFTag = SkPDF::StructureElementNode;
18 
19 // Test building a tagged PDF with links.
20 // Add this to args.gn to output the PDF to a file:
21 //   extra_cflags = [ "-DSK_PDF_TEST_TAGS_OUTPUT_PATH=\"/tmp/links.pdf\"" ]
DEF_TEST(SkPDF_tagged_links,r)22 DEF_TEST(SkPDF_tagged_links, r) {
23     REQUIRE_PDF_DOCUMENT(SkPDF_tagged_links, r);
24 #ifdef SK_PDF_TEST_TAGS_OUTPUT_PATH
25     SkFILEWStream outputStream(SK_PDF_TEST_TAGS_OUTPUT_PATH);
26 #else
27     SkDynamicMemoryWStream outputStream;
28 #endif
29 
30     SkSize pageSize = SkSize::Make(612, 792);  // U.S. Letter
31 
32     SkPDF::Metadata metadata;
33     metadata.fTitle = "Example Tagged PDF With Links";
34     metadata.fCreator = "Skia";
35     SkTime::DateTime now;
36     SkTime::GetDateTime(&now);
37     metadata.fCreation = now;
38     metadata.fModified = now;
39 
40     // The document tag.
41     auto root = std::make_unique<PDFTag>();
42     root->fNodeId = 1;
43     root->fTypeString = "Document";
44     root->fLang = "en-US";
45 
46     // A link.
47     auto l1 = std::make_unique<PDFTag>();
48     l1->fNodeId = 2;
49     l1->fTypeString = "Link";
50     root->fChildVector.push_back(std::move(l1));
51 
52     metadata.fStructureElementTreeRoot = root.get();
53     sk_sp<SkDocument> document = SkPDF::MakeDocument(
54         &outputStream, metadata);
55 
56     SkPaint paint;
57     paint.setColor(SK_ColorBLUE);
58 
59     SkCanvas* canvas =
60             document->beginPage(pageSize.width(),
61                                 pageSize.height());
62     SkFont font(nullptr, 20);
63 
64     // The node ID should cover both the text and the annotation.
65     SkPDF::SetNodeId(canvas, 2);
66     canvas->drawString("Click to visit Google.com", 72, 72, font, paint);
67     SkRect linkRect = SkRect::MakeXYWH(
68         SkIntToScalar(72), SkIntToScalar(54),
69         SkIntToScalar(218), SkIntToScalar(24));
70     sk_sp<SkData> url(SkData::MakeWithCString("http://www.google.com"));
71     SkAnnotateRectWithURL(canvas, linkRect, url.get());
72 
73     document->endPage();
74     document->close();
75     outputStream.flush();
76 }
77 
78 #endif
79