CDocument::CDocument() { #ifdef ACRO_SDK_PLUGIN_SAMPLE //#ifdef PLUGIN CTOR; /* Macro for creating a RaiseAwareConstructor */ avDoc = AVAppGetActiveDoc(); if(avDoc) { pdDoc = AVDocGetPDDoc(avDoc); //also get the current page AVPageView pageView = AVDocGetPageView(avDoc); PDPageNumber pageNum = AVPageViewGetPageNum (pageView); pdPage = PDDocAcquirePage (pdDoc, pageNum); } #else //these are automatically initialized to null since they are 'static' //we can't set initialize them because of some cases of overlapping CDocument creations //asPathName = NULL; //pdPage = NULL; #endif }
void CDataShield::CalcPlaceholdersMBox() { STAT_PAIR m_SizeStat; PDPage m_P; ASFixedRect m_CBox; FORMAT m_PF; // Статистическая таблица vector<STAT_PAIR> m_StatTbl; // Активный документ PDDoc m_ActPDDoc = AVDocGetPDDoc(AVAppGetActiveDoc()); //------------------------------------------------------------ // БЛОК СТАТИСТИЧЕСКОГО АНАЛИЗА //------------------------------------------------------------ for (int i = 0; i < m_PagesInDocument; i++) { // Получаем страницу m_P = PDDocAcquirePage(m_ActPDDoc, i); // Получаем размер кроп-бокса страницы PDPageGetCropBox(m_P, &m_CBox); m_PF.H = ASFixedToFloat(m_CBox.top - m_CBox.bottom); m_PF.W = ASFixedToFloat(m_CBox.right - m_CBox.left); // Ищем, нет ли такого формата в статистическом массиве BOOL m_FormatPresent = FALSE; for (int j = 0; j < m_StatTbl.size(); j++) { if (m_StatTbl[j].second.H == m_PF.H && m_StatTbl[j].second.W == m_PF.W) { // Есть такой формат! Инкрементируем счетчик вхождений m_StatTbl[j].first++; m_FormatPresent = TRUE; } } // Формат в массиве отсутствует. Добавляем вхождение if (!m_FormatPresent) { m_SizeStat = make_pair(1, m_PF); m_StatTbl.push_back(m_SizeStat); } // Освобождаем страницу PDPageRelease(m_P); } // Сбор статистической информации завершен, приступаем к пределению размера плейсхолдера int m_KeyValueMax = 1; int m_IndexMax = -1; for (int i = 0; i < m_StatTbl.size(); i++) { if (m_StatTbl[i].first > m_KeyValueMax) { m_KeyValueMax = m_StatTbl[i].first; m_IndexMax = i; } } // Теперь обрабатываем ситуацию, когда ВСЕ страницы в документе РАЗНОГО размера // В этом случае за основу принимаем наибольший из размеров // Из рассмотрения стараемся исключить форматы с нестандартными пропорциями(сильно вытянутые по ширине или высоте) // В основу сравнения ложим соотношение сторон 0.7 (или 1.4), как характерное для // стандартных форматов А4, А3 и т.п. Максимальное отклонение принимаем 20% // Т.е. предельные пропорции находятся в диапазоне 0.56..0.84 (1.12..1.68) if (m_IndexMax == -1) { double m_Prop; double m_Square = 0.0; for (int i = 0; i < m_StatTbl.size(); i++) { m_Prop = m_StatTbl[i].second.H / m_StatTbl[i].second.W; if ((m_Prop >= 0.56 && m_Prop <= 0.84 ) || (m_Prop >= 1.12 && m_Prop <= 1.68)) { if (m_StatTbl[i].second.H * m_StatTbl[i].second.W > m_Square) { m_Square = m_StatTbl[i].second.H * m_StatTbl[i].second.W; m_IndexMax = i; } } } } // Анализ окончен. Проверяем не случилось ли так,что и поиск по формату не дал результатов. // Если так произошло (все страницы не удовлетворяют условиям соблюдения пропорций), // в качестве основного размера выбираем первый попавшийся формат if (m_IndexMax == -1) m_IndexMax = 0; // Теперь все. Приступаем к формированию размера плейсхолдера m_PlaceholderSize.bottom = fixedZero; m_PlaceholderSize.left = fixedZero; m_PlaceholderSize.right = ASFloatToFixed(m_StatTbl[m_IndexMax].second.W); m_PlaceholderSize.top = ASFloatToFixed(m_StatTbl[m_IndexMax].second.H); }