Links *Page::GetLinks(Catalog *pCatalog) { Object oTemp; Links *pLinks = new Links(GetAnnots(&oTemp), pCatalog->GetBaseURI()); oTemp.Free(); return pLinks; }
PageAttrs::PageAttrs(PageAttrs *pAttrs, Dict *pDict) { Object obj1; if (pAttrs) // Предыдущие настройки { m_oMediaBox = pAttrs->m_oMediaBox; m_pCropBox = pAttrs->m_pCropBox; m_bHaveCropBox = pAttrs->m_bHaveCropBox; m_nRotate = pAttrs->m_nRotate; pAttrs->m_oResources.Copy(&m_oResources); } else // Настройки по умолчанию { m_oMediaBox.m_dLeft = 0; m_oMediaBox.m_dBottom = 0; m_oMediaBox.m_dRight = 612; m_oMediaBox.m_dTop = 792; m_pCropBox.m_dLeft = m_pCropBox.m_dBottom = m_pCropBox.m_dRight = m_pCropBox.m_dTop = 0; m_bHaveCropBox = false; m_nRotate = 0; m_oResources.InitNull(); } // MediaBox ReadBox(pDict, "MediaBox", &m_oMediaBox); // CropBox if (ReadBox(pDict, "CropBox", &m_pCropBox)) { m_bHaveCropBox = true; } if (!m_bHaveCropBox) { m_pCropBox = m_oMediaBox; } // Остальные m_oBleedBox = m_pCropBox; ReadBox(pDict, "BleedBox", &m_oBleedBox); m_oTrimBox = m_pCropBox; ReadBox(pDict, "TrimBox", &m_oTrimBox); m_oArtBox = m_pCropBox; ReadBox(pDict, "ArtBox", &m_oArtBox); // Подгоняем размеры под m_oMediaBox m_pCropBox.ClipTo(&m_oMediaBox); m_oBleedBox.ClipTo(&m_oMediaBox); m_oTrimBox.ClipTo(&m_oMediaBox); m_oArtBox.ClipTo(&m_oMediaBox); // Поворот Object oTemp; pDict->Search("Rotate", &oTemp); if (oTemp.IsInt()) { m_nRotate = oTemp.GetInt(); } oTemp.Free(); while (m_nRotate < 0) { m_nRotate += 360; } while (m_nRotate >= 360) { m_nRotate -= 360; } pDict->Search("LastModified", &m_oLastModified); pDict->Search("BoxColorInfo", &m_oBoxColorInfo); pDict->Search("Group", &m_oGroup); pDict->Search("Metadata", &m_oMetadata); pDict->Search("PieceInfo", &m_oPieceInfo); pDict->Search("SeparationInfo", &m_oSeparationInfo); // Resources pDict->Search("Resources", &oTemp); if (oTemp.IsDict()) { m_oResources.Free(); oTemp.Copy(&m_oResources); } oTemp.Free(); }
void Page::DisplaySlice(OutputDev *pOut, double dHorizDPI, double dVertDPI, int nRotate, bool bUseMediaBox, bool bCrop, int nSliceX, int nSliceY, int nSliceW, int nSliceH, bool bPrinting, Catalog *pCatalog, bool(*abortCheckCbk)(void *pData), void *abortCheckCbkData) { if (!pOut->CheckPageSlice(this, dHorizDPI, dVertDPI, nRotate, bUseMediaBox, bCrop, nSliceX, nSliceY, nSliceW, nSliceH, bPrinting, pCatalog, abortCheckCbk, abortCheckCbkData)) { return; } nRotate += GetRotate(); if (nRotate >= 360) { nRotate -= 360; } else if (nRotate < 0) { nRotate += 360; } PDFRectangle oBox; MakeBox(dHorizDPI, dVertDPI, nRotate, bUseMediaBox, pOut->UpSideDown(), nSliceX, nSliceY, nSliceW, nSliceH, &oBox, &bCrop); PDFRectangle *pCropBox = GetCropBox(); Graphics *pGraphics = new Graphics(m_pGlobalParams, m_pXref, pOut, m_nNumber, m_pAttrs->GetResourceDict(), dHorizDPI, dVertDPI, &oBox, bCrop ? pCropBox : (PDFRectangle *)NULL, nRotate, abortCheckCbk, abortCheckCbkData); if (pGraphics) { Object oTemp; m_oContents.Fetch(m_pXref, &oTemp); if (!oTemp.IsNull()) { pGraphics->SaveGState(); pGraphics->Display(&oTemp); pGraphics->RestoreGState(); } oTemp.Free(); Annots *pAnnotList = new Annots(m_pGlobalParams, m_pXref, pCatalog, GetAnnots(&oTemp)); oTemp.Free(); if (pAnnotList) { Dict *pAcroForm = pCatalog->GetAcroForm()->IsDict() ? pCatalog->GetAcroForm()->GetDict() : NULL; if (pAcroForm) { if (pAcroForm->Search("NeedAppearances", &oTemp)) { if (oTemp.IsBool() && oTemp.GetBool()) { pAnnotList->GenerateAppearances(pAcroForm); } } oTemp.Free(); } if (pAnnotList->GetAnnotsCount() > 0) { for (int nIndex = 0; nIndex < pAnnotList->GetAnnotsCount(); ++nIndex) { pAnnotList->GetAnnot(nIndex)->Draw(pGraphics, bPrinting); } pOut->Dump(); } delete pAnnotList; } delete pGraphics; } }
bool PageAttrs::ReadBox(Dict *pDict, char *sKey, PDFRectangle *pBox) { PDFRectangle oTempBox; bool bSuccess = false; Object oBox; pDict->Search(sKey, &oBox); if (oBox.IsArray() && oBox.ArrayGetLength() == 4) { bSuccess = true; Object oTemp; oBox.ArrayGet(0, &oTemp); if (oTemp.IsNum()) { oTempBox.m_dLeft = oTemp.GetNum(); } else { bSuccess = false; } oTemp.Free(); oBox.ArrayGet(1, &oTemp); if (oTemp.IsNum()) { oTempBox.m_dBottom = oTemp.GetNum(); } else { bSuccess = false; } oTemp.Free(); oBox.ArrayGet(2, &oTemp); if (oTemp.IsNum()) { oTempBox.m_dRight = oTemp.GetNum(); } else { bSuccess = false; } oTemp.Free(); oBox.ArrayGet(3, &oTemp); if (oTemp.IsNum()) { oTempBox.m_dTop = oTemp.GetNum(); } else { bSuccess = false; } oTemp.Free(); if (bSuccess) { if (oTempBox.m_dLeft > oTempBox.m_dRight) { double dTempValue = oTempBox.m_dLeft; oTempBox.m_dLeft = oTempBox.m_dRight; oTempBox.m_dRight = dTempValue; } if (oTempBox.m_dBottom > oTempBox.m_dTop) { double dTempValue = oTempBox.m_dBottom; oTempBox.m_dBottom = oTempBox.m_dTop; oTempBox.m_dTop = dTempValue; } *pBox = oTempBox; } } else { bSuccess = false; } oBox.Free(); return bSuccess; }