Exemple #1
0
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);
}