SkPDFDocument.h revision 0b15698a8c76bb8abc1b555c1d91892669b4118f
10b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/*
20b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * Copyright (C) 2010 The Android Open Source Project
30b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger *
40b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * Licensed under the Apache License, Version 2.0 (the "License");
50b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * you may not use this file except in compliance with the License.
60b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * You may obtain a copy of the License at
70b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger *
80b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger *      http://www.apache.org/licenses/LICENSE-2.0
90b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger *
100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * Unless required by applicable law or agreed to in writing, software
110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * distributed under the License is distributed on an "AS IS" BASIS,
120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * See the License for the specific language governing permissions and
140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * limitations under the License.
150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger */
160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#ifndef SkPDFDocument_DEFINED
180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#define SkPDFDocument_DEFINED
190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkPDFCatalog.h"
210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkPDFTypes.h"
220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkRefCnt.h"
230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkTDArray.h"
240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass SkPDFDevice;
260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass SkPDFPage;
270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass SkWSteam;
280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/** \class SkPDFDocument
300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    A SkPDFDocument assembles pages together and generates the final PDF file.
320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger*/
330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass SkPDFDocument {
340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic:
350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Create a PDF document.
360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     */
370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SK_API SkPDFDocument();
380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SK_API ~SkPDFDocument();
390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Output the PDF to the passed stream.
410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *  @param stream    The writable output stream to send the PDF to.
420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     */
430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SK_API bool emitPDF(SkWStream* stream);
440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Append the passed pdf device to the document as a new page.  Returns
460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *  true if successful.  Will fail if the document has already been emitted.
470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *
480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *  @param pdfDevice The page to add to this document.
490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     */
500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SK_API bool appendPage(const SkRefPtr<SkPDFDevice>& pdfDevice);
510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Get the list of pages in this document.
530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     */
540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SK_API const SkTDArray<SkPDFPage*>& getPages();
550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate:
570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkPDFCatalog fCatalog;
580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    int64_t fXRefFileOffset;
590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkTDArray<SkPDFPage*> fPages;
610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkTDArray<SkPDFDict*> fPageTree;
620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkRefPtr<SkPDFDict> fDocCatalog;
630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkTDArray<SkPDFObject*> fPageResources;
640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    int fSecondPageFirstResourceIndex;
650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkRefPtr<SkPDFDict> fTrailerDict;
670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Output the PDF header to the passed stream.
690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *  @param stream    The writable output stream to send the header to.
700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     */
710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    void emitHeader(SkWStream* stream);
720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Get the size of the header.
740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     */
750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    size_t headerSize();
760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Output the PDF footer to the passed stream.
780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *  @param stream    The writable output stream to send the footer to.
790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *  @param objCount  The number of objects in the PDF.
800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     */
810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    void emitFooter(SkWStream* stream, int64_t objCount);
820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#endif
85