CPDF_Font* CBA_FontMap::GetAnnotDefaultFont(CFX_ByteString& sAlias) { ASSERT(m_pAnnotDict != NULL); ASSERT(m_pDocument != NULL); CPDF_Dictionary* pAcroFormDict = NULL; FX_BOOL bWidget = (m_pAnnotDict->GetString("Subtype") == "Widget"); if (bWidget) { if (CPDF_Dictionary* pRootDict = m_pDocument->GetRoot()) pAcroFormDict = pRootDict->GetDict("AcroForm"); } CFX_ByteString sDA; CPDF_Object* pObj; if ((pObj = FPDF_GetFieldAttr(m_pAnnotDict, "DA"))) sDA = pObj->GetString(); if (bWidget) { if (sDA.IsEmpty()) { pObj = FPDF_GetFieldAttr(pAcroFormDict, "DA"); sDA = pObj ? pObj->GetString() : CFX_ByteString(); } } CPDF_Dictionary* pFontDict = NULL; if (!sDA.IsEmpty()) { CPDF_SimpleParser syntax(sDA); syntax.FindTagParam("Tf", 2); CFX_ByteString sFontName = syntax.GetWord(); sAlias = PDF_NameDecode(sFontName).Mid(1); if (CPDF_Dictionary* pDRDict = m_pAnnotDict->GetDict("DR")) if (CPDF_Dictionary* pDRFontDict = pDRDict->GetDict("Font")) pFontDict = pDRFontDict->GetDict(sAlias); if (!pFontDict) if (CPDF_Dictionary* pAPDict = m_pAnnotDict->GetDict("AP")) if (CPDF_Dictionary* pNormalDict = pAPDict->GetDict("N")) if (CPDF_Dictionary* pNormalResDict = pNormalDict->GetDict("Resources")) if (CPDF_Dictionary* pResFontDict = pNormalResDict->GetDict("Font")) pFontDict = pResFontDict->GetDict(sAlias); if (bWidget) { if (!pFontDict) { if (pAcroFormDict) { if (CPDF_Dictionary* pDRDict = pAcroFormDict->GetDict("DR")) if (CPDF_Dictionary* pDRFontDict = pDRDict->GetDict("Font")) pFontDict = pDRFontDict->GetDict(sAlias); } } } } return pFontDict ? m_pDocument->LoadFont(pFontDict) : nullptr; }
void CPDF_StreamContentParser::AddNameParam(const FX_CHAR* name, int len) { int index = GetNextParamPos(); if (len > 32) { m_ParamBuf1[index].m_Type = 0; m_ParamBuf1[index].m_pObject = new CPDF_Name(PDF_NameDecode(CFX_ByteStringC(name, len))); } else { m_ParamBuf1[index].m_Type = PDFOBJ_NAME; if (!FXSYS_memchr(name, '#', len)) { FXSYS_memcpy(m_ParamBuf1[index].m_Name.m_Buffer, name, len); m_ParamBuf1[index].m_Name.m_Len = len; } else { CFX_ByteString str = PDF_NameDecode(CFX_ByteStringC(name, len)); FXSYS_memcpy(m_ParamBuf1[index].m_Name.m_Buffer, str.c_str(), str.GetLength()); m_ParamBuf1[index].m_Name.m_Len = str.GetLength(); } } }
void CPDF_DefaultAppearance::GetFont(CFX_ByteString& csFontNameTag, FX_FLOAT& fFontSize) { csFontNameTag = ""; fFontSize = 0; if (m_csDA.IsEmpty()) { return; } CPDF_SimpleParser syntax(m_csDA); if (syntax.FindTagParam("Tf", 2)) { csFontNameTag = (CFX_ByteString)syntax.GetWord(); csFontNameTag.Delete(0, 1); fFontSize = FX_atof((CFX_ByteString)syntax.GetWord()); } csFontNameTag = PDF_NameDecode(csFontNameTag); }
CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csNameTag) { CFX_ByteString csAlias = PDF_NameDecode(csNameTag); if (pFormDict == NULL || csAlias.IsEmpty()) { return NULL; } CPDF_Dictionary* pDR = pFormDict->GetDict("DR"); if (pDR == NULL) { return NULL; } CPDF_Dictionary* pFonts = pDR->GetDict("Font"); if (pFonts == NULL) { return NULL; } CPDF_Dictionary* pElement = pFonts->GetDict(csAlias); if (pElement == NULL) { return NULL; } if (pElement->GetString("Type") == "Font") { return pDocument->LoadFont(pElement); } return NULL; }
CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csNameTag) { CFX_ByteString csAlias = PDF_NameDecode(csNameTag); if (!pFormDict || csAlias.IsEmpty()) { return nullptr; } CPDF_Dictionary* pDR = pFormDict->GetDictBy("DR"); if (!pDR) { return nullptr; } CPDF_Dictionary* pFonts = pDR->GetDictBy("Font"); if (!pFonts) { return nullptr; } CPDF_Dictionary* pElement = pFonts->GetDictBy(csAlias); if (!pElement) { return nullptr; } if (pElement->GetStringBy("Type") == "Font") { return pDocument->LoadFont(pElement); } return nullptr; }
CPDF_Object* CPDF_StreamParser::ReadNextObject(FX_BOOL bAllowNestedArray, FX_BOOL bInArray) { FX_BOOL bIsNumber; GetNextWord(bIsNumber); if (m_WordSize == 0) { return NULL; } if (bIsNumber) { m_WordBuffer[m_WordSize] = 0; return CPDF_Number::Create(CFX_ByteStringC(m_WordBuffer, m_WordSize)); } int first_char = m_WordBuffer[0]; if (first_char == '/') { return CPDF_Name::Create(PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1))); } if (first_char == '(') { return CPDF_String::Create(ReadString()); } if (first_char == '<') { if (m_WordSize == 1) { return CPDF_String::Create(ReadHexString(), TRUE); } CPDF_Dictionary* pDict = CPDF_Dictionary::Create(); while (1) { GetNextWord(bIsNumber); if (m_WordSize == 0) { pDict->Release(); return NULL; } if (m_WordSize == 2 && m_WordBuffer[0] == '>') { break; } if (m_WordBuffer[0] != '/') { pDict->Release(); return NULL; } CFX_ByteString key = PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)); CPDF_Object* pObj = ReadNextObject(TRUE); if (pObj == NULL) { if (pDict) { pDict->Release(); } return NULL; } if (!key.IsEmpty()) { pDict->SetAt(key, pObj); } else { pObj->Release(); } } return pDict; } if (first_char == '[') { if (!bAllowNestedArray && bInArray) { return NULL; } CPDF_Array* pArray = CPDF_Array::Create(); while (1) { CPDF_Object* pObj = ReadNextObject(bAllowNestedArray, TRUE); if (pObj == NULL) { if (m_WordSize == 0 || m_WordBuffer[0] == ']') { return pArray; } if (m_WordBuffer[0] == '[') { continue; } } else { pArray->Add(pObj); } } } if (m_WordSize == 4) { if (*(FX_DWORD*)m_WordBuffer == FXDWORD_TRUE) { return CPDF_Boolean::Create(TRUE); } if (*(FX_DWORD*)m_WordBuffer == FXDWORD_NULL) { return CPDF_Null::Create(); } } else if (m_WordSize == 5) { if (*(FX_DWORD*)m_WordBuffer == FXDWORD_FALS && m_WordBuffer[4] == 'e') { return CPDF_Boolean::Create(FALSE); } } return NULL; }
CFX_ByteString PDF_NameDecode(const CFX_ByteString& orig) { if (!FXSYS_memchr(orig.c_str(), '#', orig.GetLength())) { return orig; } return PDF_NameDecode(CFX_ByteStringC(orig)); }
std::unique_ptr<CPDF_Object> CPDF_StreamParser::ReadNextObject( bool bAllowNestedArray, bool bInArray, uint32_t dwRecursionLevel) { bool bIsNumber; // Must get the next word before returning to avoid infinite loops. GetNextWord(bIsNumber); if (!m_WordSize || dwRecursionLevel > kMaxNestedParsingLevel) return nullptr; if (bIsNumber) { m_WordBuffer[m_WordSize] = 0; return pdfium::MakeUnique<CPDF_Number>( ByteStringView(m_WordBuffer, m_WordSize)); } int first_char = m_WordBuffer[0]; if (first_char == '/') { ByteString name = PDF_NameDecode(ByteStringView(m_WordBuffer + 1, m_WordSize - 1)); return pdfium::MakeUnique<CPDF_Name>(m_pPool, name); } if (first_char == '(') { ByteString str = ReadString(); return pdfium::MakeUnique<CPDF_String>(m_pPool, str, false); } if (first_char == '<') { if (m_WordSize == 1) return pdfium::MakeUnique<CPDF_String>(m_pPool, ReadHexString(), true); auto pDict = pdfium::MakeUnique<CPDF_Dictionary>(m_pPool); while (1) { GetNextWord(bIsNumber); if (m_WordSize == 2 && m_WordBuffer[0] == '>') break; if (!m_WordSize || m_WordBuffer[0] != '/') return nullptr; ByteString key = PDF_NameDecode(ByteStringView(m_WordBuffer + 1, m_WordSize - 1)); std::unique_ptr<CPDF_Object> pObj = ReadNextObject(true, bInArray, dwRecursionLevel + 1); if (!pObj) return nullptr; if (!key.IsEmpty()) pDict->SetFor(key, std::move(pObj)); } return std::move(pDict); } if (first_char == '[') { if ((!bAllowNestedArray && bInArray)) return nullptr; auto pArray = pdfium::MakeUnique<CPDF_Array>(); while (1) { std::unique_ptr<CPDF_Object> pObj = ReadNextObject(bAllowNestedArray, true, dwRecursionLevel + 1); if (pObj) { pArray->Add(std::move(pObj)); continue; } if (!m_WordSize || m_WordBuffer[0] == ']') break; } return std::move(pArray); } if (m_WordSize == 5 && !memcmp(m_WordBuffer, "false", 5)) return pdfium::MakeUnique<CPDF_Boolean>(false); if (m_WordSize == 4) { if (memcmp(m_WordBuffer, "true", 4) == 0) return pdfium::MakeUnique<CPDF_Boolean>(true); if (memcmp(m_WordBuffer, "null", 4) == 0) return pdfium::MakeUnique<CPDF_Null>(); } return nullptr; }