11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 20b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2010 The Android Open Source Project 40b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 70b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger */ 80b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#ifndef SkPDFDocument_DEFINED 110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#define SkPDFDocument_DEFINED 120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkPDFTypes.h" 140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkRefCnt.h" 150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkTDArray.h" 161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkTScopedPtr.h" 170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkPDFCatalog; 190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass SkPDFDevice; 200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass SkPDFPage; 210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass SkWSteam; 220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/** \class SkPDFDocument 240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger A SkPDFDocument assembles pages together and generates the final PDF file. 260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger*/ 270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass SkPDFDocument { 280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic: 291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger enum Flags { 301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger kNoCompression_Flag = 0x01, //!< mask disable stream compression. 311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger kNoEmbedding_Flag = 0x02, //!< mask do not embed fonts. 321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger kDraftMode_Flags = 0x03, 341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger }; 350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger /** Create a PDF document. 360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger */ 371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger explicit SK_API SkPDFDocument(Flags flags = (Flags)0); 380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SK_API ~SkPDFDocument(); 390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /** Output the PDF to the passed stream. It is an error to call this (it 411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * will return false and not modify stream) if no pages have been added 421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * or there are pages missing (i.e. page 1 and 3 have been added, but not 431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * page 2). 441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * @param stream The writable output stream to send the PDF to. 460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger */ 470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SK_API bool emitPDF(SkWStream* stream); 480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /** Sets the specific page to the passed PDF device. If the specified 501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * page is already set, this overrides it. Returns true if successful. 511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Will fail if the document has already been emitted. 521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * @param pageNumber The position to add the passed device (1 based). 541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * @param pdfDevice The page to add to this document. 551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SK_API bool setPage(int pageNumber, SkPDFDevice* pdfDevice); 571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger /** Append the passed pdf device to the document as a new page. Returns 590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * true if successful. Will fail if the document has already been emitted. 600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * 610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * @param pdfDevice The page to add to this document. 620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger */ 631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SK_API bool appendPage(SkPDFDevice* pdfDevice); 640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger /** Get the list of pages in this document. 660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger */ 670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SK_API const SkTDArray<SkPDFPage*>& getPages(); 680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate: 701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkTScopedPtr<SkPDFCatalog> fCatalog; 710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger int64_t fXRefFileOffset; 720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkTDArray<SkPDFPage*> fPages; 740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkTDArray<SkPDFDict*> fPageTree; 750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkRefPtr<SkPDFDict> fDocCatalog; 760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkTDArray<SkPDFObject*> fPageResources; 771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkTDArray<SkPDFObject*> fSubstitutes; 780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger int fSecondPageFirstResourceIndex; 790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkRefPtr<SkPDFDict> fTrailerDict; 810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger /** Output the PDF header to the passed stream. 830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * @param stream The writable output stream to send the header to. 840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger */ 850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger void emitHeader(SkWStream* stream); 860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger /** Get the size of the header. 880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger */ 890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger size_t headerSize(); 900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger /** Output the PDF footer to the passed stream. 920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * @param stream The writable output stream to send the footer to. 930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * @param objCount The number of objects in the PDF. 940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger */ 950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger void emitFooter(SkWStream* stream, int64_t objCount); 960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}; 970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#endif 99