| /* | |
| * Copyright 2020 Google LLC | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "include/core/SkTypes.h" | |
| #if defined(SK_SUPPORT_PDF) | |
| #include "include/core/SkAnnotation.h" | |
| #include "include/core/SkCanvas.h" | |
| #include "include/core/SkColor.h" | |
| #include "include/core/SkData.h" | |
| #include "include/core/SkDocument.h" | |
| #include "include/core/SkFont.h" | |
| #include "include/core/SkPaint.h" | |
| #include "include/core/SkRect.h" | |
| #include "include/core/SkRefCnt.h" | |
| #include "include/core/SkScalar.h" | |
| #include "include/core/SkSize.h" | |
| #include "include/core/SkStream.h" | |
| #include "include/core/SkString.h" | |
| #include "include/core/SkTypeface.h" | |
| #include "include/docs/SkPDFDocument.h" | |
| #include "include/docs/SkPDFJpegHelpers.h" | |
| #include "src/pdf/SkPDFUtils.h" | |
| #include "tests/Test.h" | |
| #include "tools/fonts/FontToolUtils.h" | |
| #include <memory> | |
| #include <utility> | |
| #include <vector> | |
| using PDFTag = SkPDF::StructureElementNode; | |
| // Test building a tagged PDF with links. | |
| // Add this to args.gn to output the PDF to a file: | |
| // extra_cflags = [ "-DSK_PDF_TEST_TAGS_OUTPUT_PATH=\"/tmp/links.pdf\"" ] | |
| DEF_TEST(SkPDF_tagged_links, r) { | |
| REQUIRE_PDF_DOCUMENT(SkPDF_tagged_links, r); | |
| #ifdef SK_PDF_TEST_TAGS_OUTPUT_PATH | |
| SkFILEWStream outputStream(SK_PDF_TEST_TAGS_OUTPUT_PATH); | |
| #else | |
| SkDynamicMemoryWStream outputStream; | |
| #endif | |
| SkSize pageSize = SkSize::Make(612, 792); // U.S. Letter | |
| SkPDF::Metadata metadata; | |
| metadata.fTitle = "Example Tagged PDF With Links"; | |
| metadata.fCreator = "Skia"; | |
| SkPDF::DateTime now; | |
| SkPDFUtils::GetDateTime(&now); | |
| metadata.fCreation = now; | |
| metadata.fModified = now; | |
| metadata.jpegDecoder = SkPDF::JPEG::Decode; | |
| metadata.jpegEncoder = SkPDF::JPEG::Encode; | |
| // The document tag. | |
| auto root = std::make_unique<PDFTag>(); | |
| root->fNodeId = 1; | |
| root->fTypeString = "Document"; | |
| root->fLang = "en-US"; | |
| // A link. | |
| auto l1 = std::make_unique<PDFTag>(); | |
| l1->fNodeId = 2; | |
| l1->fTypeString = "Link"; | |
| root->fChildVector.push_back(std::move(l1)); | |
| metadata.fStructureElementTreeRoot = root.get(); | |
| sk_sp<SkDocument> document = SkPDF::MakeDocument( | |
| &outputStream, metadata); | |
| SkPaint paint; | |
| paint.setColor(SK_ColorBLUE); | |
| SkCanvas* canvas = | |
| document->beginPage(pageSize.width(), | |
| pageSize.height()); | |
| SkFont font(ToolUtils::DefaultTypeface(), 20); | |
| // The node ID should cover both the text and the annotation. | |
| SkPDF::SetNodeId(canvas, 2); | |
| canvas->drawString("Click to visit Google.com", 72, 72, font, paint); | |
| SkRect linkRect = SkRect::MakeXYWH( | |
| SkIntToScalar(72), SkIntToScalar(54), | |
| SkIntToScalar(218), SkIntToScalar(24)); | |
| sk_sp<SkData> url(SkData::MakeWithCString("http://www.google.com")); | |
| SkAnnotateRectWithURL(canvas, linkRect, url.get()); | |
| document->endPage(); | |
| document->close(); | |
| outputStream.flush(); | |
| } | |
| #endif |