EStatusCode IndirectObjectsReferenceRegistry::WriteState(ObjectsContext* inStateWriter,ObjectIDType inObjectID) { ObjectIDTypeList objects; inStateWriter->StartNewIndirectObject(inObjectID); DictionaryContext* myDictionary = inStateWriter->StartDictionary(); myDictionary->WriteKey("Type"); myDictionary->WriteNameValue("IndirectObjectsReferenceRegistry"); myDictionary->WriteKey("mObjectsWritesRegistry"); ObjectWriteInformationVector::iterator it = mObjectsWritesRegistry.begin(); inStateWriter->StartArray(); for(; it != mObjectsWritesRegistry.end(); ++it) { ObjectIDType objectWriteEntry = inStateWriter->GetInDirectObjectsRegistry().AllocateNewObjectID(); inStateWriter->WriteIndirectObjectReference(objectWriteEntry); objects.push_back(objectWriteEntry); } inStateWriter->EndArray(eTokenSeparatorEndLine); inStateWriter->EndDictionary(myDictionary); inStateWriter->EndIndirectObject(); ObjectIDTypeList::iterator itIDs = objects.begin(); it = mObjectsWritesRegistry.begin(); for(; it != mObjectsWritesRegistry.end(); ++it,++itIDs) { inStateWriter->StartNewIndirectObject(*itIDs); DictionaryContext* registryDictionary = inStateWriter->StartDictionary(); registryDictionary->WriteKey("Type"); registryDictionary->WriteNameValue("ObjectWriteInformation"); registryDictionary->WriteKey("mObjectWritten"); registryDictionary->WriteBooleanValue(it->mObjectWritten); if(it->mObjectWritten) { registryDictionary->WriteKey("mWritePosition"); registryDictionary->WriteIntegerValue(it->mWritePosition); } registryDictionary->WriteKey("mObjectReferenceType"); registryDictionary->WriteIntegerValue(it->mObjectReferenceType); inStateWriter->EndDictionary(registryDictionary); inStateWriter->EndIndirectObject(); } return PDFHummus::eSuccess; }
EStatusCode ObjectsContext::WriteState(ObjectsContext* inStateWriter,ObjectIDType inObjectID) { EStatusCode status; do { inStateWriter->StartNewIndirectObject(inObjectID); ObjectIDType referencesRegistryObjectID = inStateWriter->GetInDirectObjectsRegistry().AllocateNewObjectID(); ObjectIDType subsetFontsNameSequanceID = inStateWriter->GetInDirectObjectsRegistry().AllocateNewObjectID(); DictionaryContext* objectsContextDict = inStateWriter->StartDictionary(); objectsContextDict->WriteKey("Type"); objectsContextDict->WriteNameValue("ObjectsContext"); objectsContextDict->WriteKey("mReferencesRegistry"); objectsContextDict->WriteNewObjectReferenceValue(referencesRegistryObjectID); objectsContextDict->WriteKey("mCompressStreams"); objectsContextDict->WriteBooleanValue(mCompressStreams); objectsContextDict->WriteKey("mSubsetFontsNamesSequance"); objectsContextDict->WriteNewObjectReferenceValue(subsetFontsNameSequanceID); inStateWriter->EndDictionary(objectsContextDict); inStateWriter->EndIndirectObject(); status = mReferencesRegistry.WriteState(inStateWriter,referencesRegistryObjectID); if(status != PDFHummus::eSuccess) break; // write subset fonts names sequance inStateWriter->StartNewIndirectObject(subsetFontsNameSequanceID); DictionaryContext* sequanceDict = inStateWriter->StartDictionary(); sequanceDict->WriteKey("Type"); sequanceDict->WriteNameValue("UppercaseSequance"); sequanceDict->WriteKey("mSequanceString"); sequanceDict->WriteLiteralStringValue(mSubsetFontsNamesSequance.ToString()); inStateWriter->EndDictionary(sequanceDict); inStateWriter->EndIndirectObject(); }while(false); return status; }
EStatusCode WrittenFontCFF::WriteState(ObjectsContext* inStateWriter,ObjectIDType inObjectID) { inStateWriter->StartNewIndirectObject(inObjectID); DictionaryContext* writtenFontDictionary = inStateWriter->StartDictionary(); writtenFontDictionary->WriteKey("Type"); writtenFontDictionary->WriteNameValue("WrittenFontCFF"); writtenFontDictionary->WriteKey("mAvailablePositionsCount"); writtenFontDictionary->WriteIntegerValue(mAvailablePositionsCount); writtenFontDictionary->WriteKey("mFreeList"); inStateWriter->StartArray(); UCharAndUCharList::iterator it = mFreeList.begin(); for(; it != mFreeList.end();++it) { inStateWriter->WriteInteger(it->first); inStateWriter->WriteInteger(it->second); } inStateWriter->EndArray(eTokenSeparatorEndLine); writtenFontDictionary->WriteKey("mAssignedPositions"); inStateWriter->StartArray(); for(int i=0;i<256;++i) inStateWriter->WriteInteger(mAssignedPositions[i]); inStateWriter->EndArray(eTokenSeparatorEndLine); writtenFontDictionary->WriteKey("mAssignedPositionsAvailable"); inStateWriter->StartArray(); for(int i=0;i<256;++i) inStateWriter->WriteBoolean(mAssignedPositionsAvailable[i]); inStateWriter->EndArray(eTokenSeparatorEndLine); writtenFontDictionary->WriteKey("mIsCID"); writtenFontDictionary->WriteBooleanValue(mIsCID); EStatusCode status = AbstractWrittenFont::WriteStateInDictionary(inStateWriter,writtenFontDictionary); if(PDFHummus::eSuccess == status) { inStateWriter->EndDictionary(writtenFontDictionary); inStateWriter->EndIndirectObject(); status = AbstractWrittenFont::WriteStateAfterDictionary(inStateWriter); } return status; }
EStatusCode PDFWriter::Shutdown(const std::string& inStateFilePath) { EStatusCode status; do { StateWriter writer; status = writer.Start(inStateFilePath); if(status != eSuccess) { TRACE_LOG("PDFWriter::Shutdown, cant start state writing"); break; } ObjectIDType rootObjectID = writer.GetObjectsWriter()->StartNewIndirectObject(); DictionaryContext* pdfWriterDictionary = writer.GetObjectsWriter()->StartDictionary(); pdfWriterDictionary->WriteKey("Type"); pdfWriterDictionary->WriteNameValue("PDFWriter"); ObjectIDType objectsContextID = writer.GetObjectsWriter()->GetInDirectObjectsRegistry().AllocateNewObjectID(); ObjectIDType DocumentContextID = writer.GetObjectsWriter()->GetInDirectObjectsRegistry().AllocateNewObjectID(); pdfWriterDictionary->WriteKey("mObjectsContext"); pdfWriterDictionary->WriteNewObjectReferenceValue(objectsContextID); pdfWriterDictionary->WriteKey("mDocumentContext"); pdfWriterDictionary->WriteNewObjectReferenceValue(DocumentContextID); pdfWriterDictionary->WriteKey("mIsModified"); pdfWriterDictionary->WriteBooleanValue(mIsModified); if(mIsModified) { pdfWriterDictionary->WriteKey("mModifiedFileVersion"); pdfWriterDictionary->WriteIntegerValue(mModifiedFileVersion); } writer.GetObjectsWriter()->EndDictionary(pdfWriterDictionary); writer.GetObjectsWriter()->EndIndirectObject(); writer.SetRootObject(rootObjectID); status = mObjectsContext.WriteState(writer.GetObjectsWriter(),objectsContextID); if(status != eSuccess) break; status = mDocumentContext.WriteState(writer.GetObjectsWriter(),DocumentContextID); if(status != eSuccess) break; status = writer.Finish(); if(status != eSuccess) { TRACE_LOG("PDFWriter::Shutdown, cant finish state writing"); } }while(false); if(status != eSuccess) { mOutputFile.CloseFile(); TRACE_LOG("PDFWriter::Shutdown, Could not end PDF"); } else status = mOutputFile.CloseFile(); //ReleaseLog(); return status; }
EStatusCodeAndObjectIDType PDFCommentWriter::WriteCommentsTree(PDFComment* inComment) { EStatusCodeAndObjectIDType result; ObjectIDType repliedTo = 0; // if already written, return PDFCommentToObjectIDTypeMap::iterator it = mCommentsForNextPage.find(inComment); if(it != mCommentsForNextPage.end()) { result.first = eSuccess; result.second = it->second; return result; } // if has a referred comment, write it first if(inComment->ReplyTo != NULL) { EStatusCodeAndObjectIDType repliedtoResult = WriteCommentsTree(inComment->ReplyTo); if(repliedtoResult.first != eSuccess) { result.first = eFailure; result.second = 0; return result; } else repliedTo = repliedtoResult.second; } do { ObjectsContext& objectsContext = mPDFWriter->GetObjectsContext(); // Start new InDirect object for annotation dictionary result.second = objectsContext.StartNewIndirectObject(); DictionaryContext* dictionaryContext = objectsContext.StartDictionary(); // Type dictionaryContext->WriteKey("Type"); dictionaryContext->WriteNameValue("Annot"); // SubType dictionaryContext->WriteKey("Subtype"); dictionaryContext->WriteNameValue("Text"); // Rect dictionaryContext->WriteKey("Rect"); dictionaryContext->WriteRectangleValue( PDFRectangle(inComment->FrameBoundings[0], inComment->FrameBoundings[1], inComment->FrameBoundings[2], inComment->FrameBoundings[3])); // Contents dictionaryContext->WriteKey("Contents"); dictionaryContext->WriteLiteralStringValue(PDFTextString(inComment->Text).ToString()); // C (color) dictionaryContext->WriteKey("C"); objectsContext.StartArray(); if(inComment->Color.UseCMYK) { objectsContext.WriteDouble((double)inComment->Color.CMYKComponents[0]/255); objectsContext.WriteDouble((double)inComment->Color.CMYKComponents[1]/255); objectsContext.WriteDouble((double)inComment->Color.CMYKComponents[2]/255); objectsContext.WriteDouble((double)inComment->Color.CMYKComponents[3]/255); } else { objectsContext.WriteDouble((double)inComment->Color.RGBComponents[0]/255); objectsContext.WriteDouble((double)inComment->Color.RGBComponents[1]/255); objectsContext.WriteDouble((double)inComment->Color.RGBComponents[2]/255); } objectsContext.EndArray(eTokenSeparatorEndLine); // T dictionaryContext->WriteKey("T"); dictionaryContext->WriteLiteralStringValue(PDFTextString(inComment->CommentatorName).ToString()); // M dictionaryContext->WriteKey("M"); dictionaryContext->WriteLiteralStringValue(inComment->Time.ToString()); if(inComment->ReplyTo != NULL) { // IRT dictionaryContext->WriteKey("IRT"); dictionaryContext->WriteObjectReferenceValue(repliedTo); // RT (we're doing always "reply" at this point, being a reply to comment dictionaryContext->WriteKey("RT"); dictionaryContext->WriteNameValue("R"); } // Open (we'll have them all closed to begin with) dictionaryContext->WriteKey("Open"); dictionaryContext->WriteBooleanValue(false); // Name dictionaryContext->WriteKey("Name"); dictionaryContext->WriteNameValue("Comment"); if(objectsContext.EndDictionary(dictionaryContext) != eSuccess) { result.first = eFailure; TRACE_LOG("PDFCommentWriter::WriteCommentsTree, Exception in ending comment dictionary"); break; } objectsContext.EndIndirectObject(); mCommentsForNextPage.insert(PDFCommentToObjectIDTypeMap::value_type(inComment,result.second)); result.first = eSuccess; }while(false); return result; }