Home | History | Annotate | Download | only in pdf
      1 
      2 /*
      3  * Copyright 2010 The Android Open Source Project
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 
      9 
     10 #ifndef SkPDFDocument_DEFINED
     11 #define SkPDFDocument_DEFINED
     12 
     13 #include "SkAdvancedTypefaceMetrics.h"
     14 #include "SkRefCnt.h"
     15 #include "SkTDArray.h"
     16 #include "SkTemplates.h"
     17 
     18 class SkPDFCatalog;
     19 class SkPDFDevice;
     20 class SkPDFDict;
     21 class SkPDFPage;
     22 class SkPDFObject;
     23 class SkWStream;
     24 template <typename T> class SkTSet;
     25 
     26 /** \class SkPDFDocument
     27 
     28     A SkPDFDocument assembles pages together and generates the final PDF file.
     29 */
     30 class SkPDFDocument {
     31 public:
     32     enum Flags {
     33         kNoCompression_Flags = 0x01,  //!< DEPRECATED.
     34         kFavorSpeedOverSize_Flags = 0x01,  //!< Don't compress the stream, but
     35                                            // if it is already compressed return
     36                                            // the compressed stream.
     37         kNoLinks_Flags       = 0x02,  //!< do not honor link annotations.
     38 
     39         kDraftMode_Flags     = 0x01,
     40     };
     41     /** Create a PDF document.
     42      */
     43     explicit SK_API SkPDFDocument(Flags flags = (Flags)0);
     44     SK_API ~SkPDFDocument();
     45 
     46     /** Output the PDF to the passed stream.  It is an error to call this (it
     47      *  will return false and not modify stream) if no pages have been added
     48      *  or there are pages missing (i.e. page 1 and 3 have been added, but not
     49      *  page 2).
     50      *
     51      *  @param stream    The writable output stream to send the PDF to.
     52      */
     53     SK_API bool emitPDF(SkWStream* stream);
     54 
     55     /** Sets the specific page to the passed PDF device. If the specified
     56      *  page is already set, this overrides it. Returns true if successful.
     57      *  Will fail if the document has already been emitted.
     58      *
     59      *  @param pageNumber The position to add the passed device (1 based).
     60      *  @param pdfDevice  The page to add to this document.
     61      */
     62     SK_API bool setPage(int pageNumber, SkPDFDevice* pdfDevice);
     63 
     64     /** Append the passed pdf device to the document as a new page.  Returns
     65      *  true if successful.  Will fail if the document has already been emitted.
     66      *
     67      *  @param pdfDevice The page to add to this document.
     68      */
     69     SK_API bool appendPage(SkPDFDevice* pdfDevice);
     70 
     71     /** Get the count of unique font types used in the document.
     72      * DEPRECATED.
     73      */
     74     SK_API void getCountOfFontTypes(
     75         int counts[SkAdvancedTypefaceMetrics::kOther_Font + 2]) const;
     76 
     77     /** Get the count of unique font types used in the document.
     78      */
     79     SK_API void getCountOfFontTypes(
     80         int counts[SkAdvancedTypefaceMetrics::kOther_Font + 1],
     81         int* notSubsettableCount,
     82         int* notEmbedddableCount) const;
     83 
     84 private:
     85     SkAutoTDelete<SkPDFCatalog> fCatalog;
     86     int64_t fXRefFileOffset;
     87 
     88     SkTDArray<SkPDFPage*> fPages;
     89     SkTDArray<SkPDFDict*> fPageTree;
     90     SkPDFDict* fDocCatalog;
     91     SkTSet<SkPDFObject*>* fFirstPageResources;
     92     SkTSet<SkPDFObject*>* fOtherPageResources;
     93     SkTDArray<SkPDFObject*> fSubstitutes;
     94 
     95     SkPDFDict* fTrailerDict;
     96 
     97     /** Output the PDF header to the passed stream.
     98      *  @param stream    The writable output stream to send the header to.
     99      */
    100     void emitHeader(SkWStream* stream);
    101 
    102     /** Get the size of the header.
    103      */
    104     size_t headerSize();
    105 
    106     /** Output the PDF footer to the passed stream.
    107      *  @param stream    The writable output stream to send the footer to.
    108      *  @param objCount  The number of objects in the PDF.
    109      */
    110     void emitFooter(SkWStream* stream, int64_t objCount);
    111 };
    112 
    113 #endif
    114