int PdfPage::GetRotation() const { int rot = 0; PdfObject* pObj = GetInheritedKeyFromObject( "Rotate", m_pObject ); if ( pObj && pObj->IsNumber() ) rot = static_cast<int>(pObj->GetNumber()); return rot; }
//**********************************************************// // PdfeFontType3 // //**********************************************************// PdfeFontType3::PdfeFontType3( PoDoFo::PdfObject* pFont, FT_Library ftLibrary ) : PdfeFont( pFont, ftLibrary ) { this->init(); // Subtype of the font. const PdfName& subtype = pFont->GetIndirectKey( PdfName::KeySubtype )->GetName(); if( subtype == PdfName( "Type3" ) ) { this->setType( PdfeFontType::Type3 ); this->setSubtype( PdfeFontSubType::Type3 ); } else { PODOFO_RAISE_ERROR_INFO( ePdfError_InvalidDataType, "The PdfObject is not a Type 3 font." ); } // Need the following entries in the font dictionary. PdfObject* pBBox = pFont->GetIndirectKey( "FontBBox" ); PdfObject* pMatrix = pFont->GetIndirectKey( "FontMatrix" ); PdfObject* pFChar = pFont->GetIndirectKey( "FirstChar" ); PdfObject* pLChar = pFont->GetIndirectKey( "LastChar" ); PdfObject* pWidths = pFont->GetIndirectKey( "Widths" ); PdfObject* pEncoding = pFont->GetIndirectKey( "Encoding" ); // If does not exist: raise exception. if( !( pBBox && pMatrix && pFChar && pLChar && pWidths && pEncoding ) ) { PODOFO_RAISE_ERROR_INFO( ePdfError_InvalidDataType, "Entries missing in the Type 3 font dictionary." ); } // Initialize font BBox from array. m_fontBBox = PdfRect( pBBox->GetArray() ); // Font matrix. const PdfArray& matrixA = pMatrix->GetArray(); m_fontMatrix(0,0) = matrixA[0].GetReal(); m_fontMatrix(0,1) = matrixA[1].GetReal(); m_fontMatrix(1,0) = matrixA[2].GetReal(); m_fontMatrix(1,1) = matrixA[3].GetReal(); m_fontMatrix(2,0) = matrixA[4].GetReal(); m_fontMatrix(2,1) = matrixA[5].GetReal(); // Read char widths. m_firstCID = static_cast<pdfe_cid>( pFChar->GetNumber() ); m_lastCID = static_cast<pdfe_cid>( pLChar->GetNumber() ); const PdfArray& widthsA = pWidths->GetArray(); m_advanceCID.resize( widthsA.size(), PdfeVector() ); for( size_t i = 0 ; i < widthsA.size() ; ++i ) { m_advanceCID[i](0) = widthsA[i].GetReal(); } // Check the size for coherence. if( m_advanceCID.size() != static_cast<size_t>( m_lastCID - m_firstCID + 1 ) ) { m_advanceCID.resize( m_lastCID - m_firstCID + 1, PdfeVector( 1000., 0. ) ); } // Font descriptor (required in Tagged documents). PdfObject* pDescriptor = pFont->GetIndirectKey( "FontDescriptor" ); if( pDescriptor ) { m_fontDescriptor.init( pDescriptor ); } // Font encoding. this->initEncoding( pEncoding ); // Unicode CMap. PdfObject* pUnicodeCMap = pFont->GetIndirectKey( "ToUnicode" ); this->initUnicodeCMap( pUnicodeCMap ); // Space characters vector. this->initSpaceCharacters( m_firstCID, m_lastCID, true ); // Glyph vectors. this->initGlyphs( pFont ); // Default space bounding box. this->initSpaceBBox(); // Log font information. this->initLogInformation(); }
void PDFAnalyzer::inspectExtGStateObj(PdfObject* extGStateObj, QList<PDFColorSpace> & usedColorSpaces, bool & hasTransparency, QList<PDFFont> & usedFonts, PDFGraphicState & currGS) { PdfObject* bmObj = extGStateObj->GetIndirectKey("BM"); if (bmObj && bmObj->IsName()) { currGS.blendModes.clear(); currGS.blendModes.append(bmObj->GetName().GetEscapedName().c_str()); if (!(bmObj->GetName() == "Normal" || bmObj->GetName() == "Compatible")) hasTransparency = true; } else if (bmObj && bmObj->IsArray()) { PdfArray arr = bmObj->GetArray(); currGS.blendModes.clear(); for(int i=0; i<arr.GetSize(); ++i) currGS.blendModes.append(arr[i].GetName().GetEscapedName().c_str()); if (arr[0].IsName() && !(arr[0].GetName() == "Normal" || arr[0].GetName() == "Compatible")) hasTransparency = true; } PdfObject* caObj = extGStateObj->GetIndirectKey("ca"); if (caObj && (caObj->IsReal() || caObj->IsNumber())) { currGS.fillAlphaConstant = caObj->GetReal(); if (caObj->GetReal() < 1) hasTransparency = true; } PdfObject* cAObj = extGStateObj->GetIndirectKey("CA"); if (cAObj && (cAObj->IsReal() || cAObj->IsNumber())) { if (cAObj->GetReal() < 1) hasTransparency = true; } PdfObject* sMaskObj = extGStateObj->GetIndirectKey("SMask"); if (sMaskObj && !(sMaskObj->IsName() && sMaskObj->GetName() == "None")) hasTransparency = true; PdfObject* fontObj = extGStateObj->GetIndirectKey("Font"); if (fontObj && fontObj->IsArray()) { PdfArray arr = fontObj->GetArray(); if (arr[0].IsReference()) { PdfReference ref = arr[0].GetReference(); PdfObject* fontObject = m_doc->GetObjects().GetObject(ref); if (fontObject) { PDFFont font = getFontInfo(fontObject); usedFonts.append(font); currGS.font.first = font; currGS.font.second = arr[1].GetReal(); } } } PdfObject* lwObj = extGStateObj->GetIndirectKey("LW"); if (lwObj) currGS.lineWidth = lwObj->GetReal(); PdfObject* lcObj = extGStateObj->GetIndirectKey("LC"); if (lcObj) currGS.lineCap = lcObj->GetNumber(); PdfObject* ljObj = extGStateObj->GetIndirectKey("LJ"); if (ljObj) currGS.lineJoin = ljObj->GetNumber(); PdfObject* mlObj = extGStateObj->GetIndirectKey("ML"); if (mlObj) currGS.miterLimit = mlObj->GetReal(); PdfObject* dObj = extGStateObj->GetIndirectKey("D"); if (dObj) { PdfArray dashArr = dObj->GetArray()[0]; currGS.dashPattern.first.clear(); for (int i=0; i<dashArr.GetSize(); ++i) currGS.dashPattern.first.append(dashArr[i].GetNumber()); currGS.dashPattern.second = dObj->GetArray()[1].GetNumber(); } }