static ACCB1 ASBool ACCB2 IsEnabled (void *permRequired) { AVDoc avDoc = AVAppGetActiveDoc(); if (!avDoc) return false; else { PDPerms docPerms = PDDocGetPermissions(AVDocGetPDDoc(avDoc)); PDPerms reqPerms = (PDPerms)permRequired; return ((reqPerms & docPerms) == reqPerms); } }
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 }
ACCB1 void ACCB2 MyPluginCommand(void *clientData) { // try to get front PDF document AVDoc avDoc = AVAppGetActiveDoc(); PDDoc pdDoc = NULL; int numPages = 0; if(avDoc==NULL) { // if no doc is loaded, make a message. //strcat(str,"There is no PDF document loaded in Acrobat."); return; } else { // if a PDF is open, get its number of pages pdDoc = AVDocGetPDDoc (avDoc); numPages = PDDocGetNumPages (pdDoc); } if(pdDoc == NULL) return; // get a PDF open in front. /*CDocument document; PDDoc pdDoc = (PDDoc)document; if(pdDoc == NULL){ return; }*/ // enumerate from PDF conversion handlers to find the "rtf" handler. AVConversionEnumFromPDFConverters(myAVConversionFromPDFEnumProc, NULL); SnippetRunnerUtils::ShowDebugWindow(); string szPath = "C:\\"; CDocument::SetBaseDirectory(szPath); // save the rtf file to the snippetRunner's output files folder. ASPathName OutPath = SnippetRunnerUtils::getOutputPath(RTF_FILE); if(OutPath==NULL) OutPath = ASFileSysCreatePathName (NULL, ASAtomFromString("Cstring"), RTF_FILE, 0); if(OutPath==NULL) { AVAlertNote("Cannot open an output file."); return; } // do conversion AVConversionStatus status=AVConversionConvertFromPDFWithHandler(RightHandler, NULL,kAVConversionNoFlags, pdDoc, OutPath, ASGetDefaultFileSys(),NULL); ////////////////////////////////////////////////////////////////////// // save the rtf file to the snippetRunner's output files folder. // enumerate from PDF conversion handlers to find the "rtf" handler. AVConversionEnumFromPDFConverters(myAVConversionFromPDFEnumProc2, NULL); SnippetRunnerUtils::ShowDebugWindow(); OutPath = SnippetRunnerUtils::getOutputPath(TXT_FILE); if(OutPath==NULL) OutPath = ASFileSysCreatePathName (NULL, ASAtomFromString("Cstring"), TXT_FILE, 0); if(OutPath==NULL) { AVAlertNote("Cannot open an output file."); return; } // do conversion status=AVConversionConvertFromPDFWithHandler(RightHandler, NULL,kAVConversionNoFlags, pdDoc, OutPath, ASGetDefaultFileSys(),NULL); ///////////////////////////////////////////////////////////////////////// // check the returned status and show message /* if(status == kAVConversionSuccess) AVAlertNote("The Rtf file was saved in SnippetRunner output folder."); else if(status == kAVConversionFailed) AVAlertNote("The Rtf file conversion failed."); else if(status == kAVConversionSuccessAsync) AVAlertNote("The conversion will continue asynchronously."); else if(status == kAVConversionCancelled) AVAlertNote("The conversion was cancelled."); /* ASInt32 nStartPage, nEndPage, nToUnicode; ASBool bToUnicode; nStartPage = 1; nEndPage = numPages; nToUnicode = 0; bToUnicode = false; //bToUnicode = (nToUnicode==0)?(false):(true); // Set up WordFinder creation options record PDWordFinderConfigRec wfConfig; memset(&wfConfig, 0, sizeof(PDWordFinderConfigRec)); wfConfig.recSize = sizeof(PDWordFinderConfigRec); wfConfig.ignoreCharGaps = true; wfConfig.ignoreLineGaps = false; wfConfig.noAnnots = true; wfConfig.noEncodingGuess = true; // leave non-Roman single-byte font alone // Std Roman treatment for custom encoding; overrides the noEncodingGuess option wfConfig.unknownToStdEnc = false; wfConfig.disableTaggedPDF = false; // legacy mode WordFinder creation wfConfig.noXYSort = false; wfConfig.preserveSpaces = false; wfConfig.noLigatureExp = false; wfConfig.noHyphenDetection = false; wfConfig.trustNBSpace = false; wfConfig.noExtCharOffset = false; // text extraction efficiency wfConfig.noStyleInfo = false; // text extraction efficiency wfConfig.decomposeTbl = NULL; // Unicode character replacement wfConfig.decomposeTblSize = 0; wfConfig.charTypeTbl = NULL; // Custom char type table wfConfig.charTypeTblSize = 0; ASPathName pathName; pathName = SnippetRunnerUtils::getOutputPath("output.txt"); #ifndef MAC_PLATFORM //on the Mac ASFileSysDisplayStringFromPath returns an Mac OS 9 style path. pOutput = fopen(ASFileSysDisplayStringFromPath (NULL, pathName), "w+b"); #else ASPlatformPath platformPath; ASFileSysAcquirePlatformPath (NULL, pathName, ASAtomFromString("POSIXPath"), &platformPath); POSIXPath_Ptr path = ASPlatformPathGetPOSIXPathPtr (platformPath); pOutput = fopen(path, "w+b"); ASFileSysReleasePlatformPath(NULL, platformPath); #endif if (pOutput) { if(ExtractText(pdDoc, nStartPage - 1, nEndPage - 1, bToUnicode, &wfConfig, pOutput)) Console::displayString("Text extraction completed."); return; } else AVAlertNote("Text extraction aborted."); if (pathName) ASFileSysReleasePath(NULL, pathName); if (pOutput) fclose(pOutput); return; */ }
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); }
CDataShield::CDataShield(void) { // Определяем количество страниц в активном докменте m_PagesInDocument = PDDocGetNumPages(AVDocGetPDDoc(AVAppGetActiveDoc())); //------------------------------------------------------------- // Создаем набор непротиворечивых данных, используемых по умолчанию //------------------------------------------------------------- // Единицы измерения - дюймы m_UnitType = INCH; m_UnitK = 1.0; // Режим работы - по умолчанию фиксированный размер страницы, фиксированная схема, подбор размера пластины m_OPMode = C; // По умолчанию используем печать STANDARD, SADDLE STITCHED, GERMAN FOLD, 8-UP Imposition scheme m_PRNType = STANDARD; m_BNDType = SADDLE_STITCHED; m_FLDType = GERMAN; m_NRows = 2; m_NCols = 4; m_Places = m_NCols * m_NRows; // Сборка тетрадями по 16 листов (одна двустороняя пластина для заданого типа печати) m_NPagesPerSection = 16; m_PlatesPerSection = 1; // Количество тетрадей на документ и количество чистых страниц m_WhitePages = m_NPagesPerSection - (m_PagesInDocument % m_NPagesPerSection); m_Sections = (m_PagesInDocument + m_WhitePages) / m_NPagesPerSection; // Полное число пластин в задании m_PlatesTotal = m_Sections * m_PlatesPerSection; //============================================================= // Технологические параметры //============================================================= // Устанавливаем принимаемые по умолчанию технологические параметры генератора m_TechAllowence_Y_width = m_TechAllowence_X_width = m_TechAllowence_M_width = ASFloatToFixed(72 * 10 / 25.4); // Отступ между страницами. По умолчанию 2мм = 0.079 дюйма m_PlaceholdersGap = ASFloatToFixed(72 * 0.079); // Размер страницы документа ASFixedRect m_PageCropBox; PDPageGetCropBox(PDDocAquirePage(AVDocGetPDDoc(AVAppGetActiveDoc()), 0), &m_PageCropBox); // Вычисляем размер области печати m_PrintingArea.left = m_TechAllowence_Y_width; m_PrintingArea.right = m_PrintingArea.left + ASFixedMul((m_PageCropBox.right - m_PageCropBox.left), ASInt16ToFixed(m_NCols)) + ASFixedMul(m_PlaceholdersGap, ASInt16ToFixed(m_NCols - 1)); m_PrintingArea.bottom = m_TechAllowence_X_width; m_PrintingArea.top = m_PrintingArea.bottom + ASFixedMul((m_PageCropBox.top - m_PageCropBox.bottom), ASInt16ToFixed(m_NRows)) + ASFixedMul(m_TechAllowence_M_width, ASInt16ToFixed(m_NRows - 1)); // Размер листа m_OutputMediaBox.bottom = fixedZero; m_OutputMediaBox.top = m_OutputMediaBox.bottom + ASFixedMul(m_TechAllowence_X_width, fixedTwo) + (m_PrintingArea.top - m_PrintingArea.bottom); m_OutputMediaBox.left = fixedZero; m_OutputMediaBox.right = m_OutputMediaBox.left + ASFixedMul(m_TechAllowence_Y_width, fixedTwo) + (m_PrintingArea.right - m_PrintingArea.left); // Формат печати - вычисляемый, ориентация - ЛАНДШАФТ m_OutputMediaSize.H = ASFloatToFixed(m_OutputMediaBox.top - m_OutputMediaBox.bottom) / 72.0; m_OutputMediaSize.W = ASFloatToFixed(m_OutputMediaBox.right - m_OutputMediaBox.left) / 72.0; m_MediaOrient = LANDSCAPE; // Отмена зеркальной печати m_InversePrinting = false; // Устанавливаем общие к-ты масштабирования-перемещения-поворота для страницы m_X_Scale_Total = fixedOne; m_Y_Scale_Total = fixedOne; m_X_Translation_Total = fixedZero; m_Y_Translation_Total = fixedZero; m_Rotation_Angle_Total = 0.0; m_ALFA_Skew_Total = 0.0; m_BETA_Skew_Total = 0.0; // По умолчанию печатаем все технологические метки m_PrintRegMarks = true; m_PrintCMYKColorBar = true; m_PrintPANTONEcolorBar = true; m_PrintProgressiveGray = true; m_PrintCFMarks = true; // Создаем массив технологических меток PrepareTMArray(); // Текущий номер страницы предварительного просмотра m_CurrentPreviewPN = 0; m_CurrentPreviewPDPage = NULL; // Толщина бумаги m_PaperThickness = 0.002; // Режим предварительного просмотра - включен m_PreviewMode = TRUE; }