CDocument::~CDocument() { //!!NOTE: - PDFL has a concept of a global open document, and the only way //to open/close that doc is to use the opendoc and closedoc commands //all other actions shouldn't release or destroy anything //#ifdef PLUGIN #ifdef ACRO_SDK_PLUGIN_SAMPLE DTOR; /* Macro for creating a RaiseAwareDestructor */ #endif if(pdPage) { PDPageRelease(pdPage); pdPage = NULL; } }
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); }