blob: 6265014dec12872fd090c369a4e1d8c938a18fd5 [file] [log] [blame]
/*
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "tests/Test.h"
#ifdef SK_SUPPORT_PDF
#include "include/core/SkCanvas.h"
#include "include/core/SkFont.h"
#include "include/core/SkStream.h"
#include "include/docs/SkPDFDocument.h"
using PDFTag = SkPDF::StructureElementNode;
// Test building a tagged PDF where nodes are pruned.
// Add this to args.gn to output the PDF to a file:
// extra_cflags = [ "-DSK_PDF_TEST_TAGS_OUTPUT_PATH=\"/tmp/pruning.pdf\"" ]
DEF_TEST(SkPDF_tagged_pruning, r) {
REQUIRE_PDF_DOCUMENT(SkPDF_tagged, 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";
metadata.fCreator = "Skia";
SkTime::DateTime now;
SkTime::GetDateTime(&now);
metadata.fCreation = now;
metadata.fModified = now;
// The document tag.
auto root = std::make_unique<PDFTag>();
root->fNodeId = 1;
root->fTypeString = "Document";
root->fLang = "en-US";
// First paragraph.
auto p1 = std::make_unique<PDFTag>();
p1->fNodeId = 2;
p1->fAdditionalNodeIds = {3, 4};
p1->fTypeString = "P";
root->fChildVector.push_back(std::move(p1));
// Second paragraph.
auto p2 = std::make_unique<PDFTag>();
p2->fNodeId = 5;
p2->fAdditionalNodeIds = {6, 7};
p2->fTypeString = "P";
root->fChildVector.push_back(std::move(p2));
metadata.fStructureElementTreeRoot = root.get();
sk_sp<SkDocument> document = SkPDF::MakeDocument(
&outputStream, metadata);
SkPaint paint;
paint.setColor(SK_ColorBLACK);
SkCanvas* canvas =
document->beginPage(pageSize.width(),
pageSize.height());
SkFont font(nullptr, 20);
SkPDF::SetNodeId(canvas, 3);
canvas->drawString("First paragraph line 1", 72, 72, font, paint);
SkPDF::SetNodeId(canvas, 4);
canvas->drawString("First paragraph line 2", 72, 108, font, paint);
SkPDF::SetNodeId(canvas, 6);
canvas->drawString("Second paragraph line 1", 72, 180, font, paint);
SkPDF::SetNodeId(canvas, 7);
canvas->drawString("Second paragraph line 2", 72, 216, font, paint);
document->endPage();
document->close();
outputStream.flush();
}
// Similar to SkPDF_tagged_pruning but never actually writes out anything annotated.
// Ensures that nothing goes wring when there are no annotations on an annotated PDF.
DEF_TEST(SkPDF_tagged_pruning_empty, r) {
REQUIRE_PDF_DOCUMENT(SkPDF_tagged, 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";
metadata.fCreator = "Skia";
SkTime::DateTime now;
SkTime::GetDateTime(&now);
metadata.fCreation = now;
metadata.fModified = now;
// The document tag.
auto root = std::make_unique<PDFTag>();
root->fNodeId = 1;
root->fTypeString = "Document";
root->fLang = "en-US";
// First paragraph.
auto p1 = std::make_unique<PDFTag>();
p1->fNodeId = 2;
p1->fAdditionalNodeIds = {3, 4};
p1->fTypeString = "P";
root->fChildVector.push_back(std::move(p1));
// Second paragraph.
auto p2 = std::make_unique<PDFTag>();
p2->fNodeId = 5;
p2->fAdditionalNodeIds = {6, 7};
p2->fTypeString = "P";
root->fChildVector.push_back(std::move(p2));
metadata.fStructureElementTreeRoot = root.get();
sk_sp<SkDocument> document = SkPDF::MakeDocument(
&outputStream, metadata);
SkPaint paint;
paint.setColor(SK_ColorBLACK);
SkCanvas* canvas =
document->beginPage(pageSize.width(),
pageSize.height());
canvas->drawRect(SkRect::MakeXYWH(10, 10, 100, 100), paint);
document->endPage();
document->close();
outputStream.flush();
}
#endif