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