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