| Коробка, Смарт-процессы в поле смарт-процесса лежит ссылка на файл pdf в битриксе (общий диск, диск юзера) Задача в другое поле положить количество страниц. сделать через БП |
функция, размещаем в init.php
function CalculatePdfPages($dinId,$authorId){
//$dinId[2] = "DYNAMIC_175_1" получено $root->GetDocumentId();
//$authorId = user_389
$propFileLink = "UF_CRM_3_1705390834620"; //поле со ссылкой на файл
$propPages = "UF_CRM_3_1705666582056"; // поле, куда положить количество страниц
$host = explode(":",$_SERVER['HTTP_HOST']);
$host = $host[0];
$bError = true;
$errorText = "";
$b = true;
while($b){//для простого выхода из проверок
$b = false;
$temp = explode("_", $dinId[2]);
if($temp[0] != "DYNAMIC"){
$errorText = "Это не смарт-процесс";
break;
}
$smTypeId = $temp[1];
$smId = $temp[2];
if(!CModule::IncludeModule("crm") || !CModule::IncludeModule("disk")){
$errorText = "Не смогли подключить модули";
break;
}
$factory = Bitrix\Crm\Service\Container::getInstance()->getFactory($smTypeId);
if(empty($factory)){
$errorText = "Не смогли получить тип смарт-процесса";
break;
}
$item = $factory->getItem($smId);
if(empty($item)){
$errorText = "Не смогли получить экземпляр смарт-процесса";
break;
}
$data = $item->getData();
$name = $data[$propFileLink]??"";
if(empty($name)){
$errorText = "поле с пдф пустое";
break;
}
//смотрим по типам
if(strpos($name,$host.'/company/personal/user/')!==false && strpos($name,'/disk/file/')!==false){
$name = urldecode($name);
if(mb_substr($name,-4)!=".pdf"){
//уведомление что файл не pdf
$errorText = "файл в поле не пдф";
break;
}
$uid = substr($name,strpos($name,'/company/personal/user/')+strlen('/company/personal/user/'));
$uid = substr($uid,0,strpos($uid,"/"));
$path = substr($name,strpos($name,'/disk/file/')+strlen('/disk/file/'));
if(empty($uid) || intval($uid)!=$uid || empty($path)){
$errorText = "не смогли обработать имя файла ".$name;
break;
}
$arPath = explode("/",$path);
$cnt = count($arPath);
$fileName = $arPath[($cnt-1)];
unset($arPath[($cnt-1)]);
$storage = \Bitrix\Disk\Driver::getInstance()->getStorageByUserId($uid);
if (!$storage){
$errorText = "не смогли получить диск пользователя ".$uid;
break;
}
$folder = $storage->getRootObject();
foreach($arPath as $folderName){
$folder = $folder->getChild([
'=NAME' => $folderName,
'TYPE' => \Bitrix\Disk\Internals\FolderTable::TYPE_FOLDER
]);
if(empty($folder)){
$errorText = "не смогли получить папку";
break(2);
}
}
$file = $folder->getChild(
array(
'=NAME' => $fileName,
'TYPE' => \Bitrix\Disk\Internals\FileTable::TYPE_FILE
)
);
}
elseif(strpos($name, $host.'/docs/')!==false){ //на общих дисках
$name = urldecode($name);
$code = substr($name,strpos($name,"/docs/")+1);
$code = explode("/", $code);
if(empty($code) || count($code)<2){
$errorText = "не смогли получить общую папку из".$name;
break;
}
$code = $code[0]."/".$code[1];
$disks = \Bitrix\Disk\Storage::getList([
"select"=>["ID","ENTITY_MISC_DATA"],
"filter"=> [
"ENTITY_TYPE"=>"Bitrix\Disk\ProxyType\Common",
"ENTITY_MISC_DATA" => "%".$code."%"
]
]);
if($disk = $disks->fetch()){
//$t = unserialize($disk["ENTITY_MISC_DATA"]);
//$t["BASE_URL"]
$storage = \Bitrix\Disk\Storage::loadById($disk["ID"]);
if (!$storage){
$errorText = "не смогли получить диск ".$disk["ID"];
break;
}
$path = substr($name,strpos($name,"/".$code."/file/")+strlen("/".$code."/file/"));
$arPath = explode("/",$path);
$cnt = count($arPath);
$fileName = $arPath[($cnt-1)];
unset($arPath[($cnt-1)]);
$folder = $storage->getRootObject();
foreach($arPath as $folderName){
$folder = $folder->getChild([
'=NAME' => $folderName,
'TYPE' => \Bitrix\Disk\Internals\FolderTable::TYPE_FOLDER
]);
if(empty($folder)){
$errorText = "не смогли получить папку ".$folderName." c общего диска";
break(2);
}
}
echo $fileName;
$file = $folder->getChild(
array(
'=NAME' => $fileName,
'TYPE' => \Bitrix\Disk\Internals\FileTable::TYPE_FILE
)
);
}
else{
$errorText = "не нашли общий диск по коду ".$code." из ".$name;
break;
}
}
elseif(strpos($name,$host.'/bitrix/tools/disk/focus.php')!==false){ //objectId=56695
$arUrl = parse_url($name);
if(empty($arUrl["query"])){
$errorText = "неправильная ссылка ".$name;
break;
}
parse_str($arUrl["query"],$params);
if(empty($params["objectId"]) || intval($params["objectId"])!=$params["objectId"]){
$errorText = "неправильный параметр objectId в ссылкe ".$name;
break;
}
$file = Bitrix\Disk\File::getById($params["objectId"]);
}
elseif(strpos($name,$host.'/disk/showFile/')!==false){ //вида /disk/showFile/56695/
$fileId = substr($name, (strpos($name,'/disk/showFile/') + strlen('/disk/showFile/')));
$fileId = substr($fileId,0,strpos($name,"/")-1);
if(empty($fileId) || intval($fileId)!=$fileId){
$errorText = "не смогли получить файл ID из ".$name;
break;
}
$file = Bitrix\Disk\File::getById($fileId);
}
else{
$errorText = "поле со ссылкой непонятного формата";
break;
}
if(empty($file)){
$errorText = "не смогли получить файл ".$fileName;
break;
}
$info = $file->getFile();
if(empty($info["CONTENT_TYPE"]) || ($info["CONTENT_TYPE"]!= "application/pdf")){
$type = $info["CONTENT_TYPE"]??"";
$errorText = "тип файла не pdf, a ".$type;
break;
}
/*$fp = fopen($_SERVER["DOCUMENT_ROOT"].$info["SRC"], 'r');
if (!$fp) {
$errorText = "не смогли открыть файл ".$_SERVER["DOCUMENT_ROOT"].$info["SRC"];
break;
}
$content = fread ($fp, filesize($_SERVER["DOCUMENT_ROOT"].$info["SRC"]));
if(!$content){
$errorText = "не смогли прочитать файл ".$_SERVER["DOCUMENT_ROOT"].$info["SRC"];
break;
}
$countPages = 0;
$regex = "/\/Count\s+(\d+)/";
$regex2 = "/\/Page\W*(\d+)/";
$regex3 = "/\/N\s+(\d+)/";
if(preg_match_all($regex, $content, $matches))
$countPages = max($matches);
fclose($fp); */
$im = new Imagick();
$im->pingImage( $_SERVER["DOCUMENT_ROOT"].$info["SRC"] );
$countPages = $im->getNumberImages();
$item->set($propPages,$countPages);
$item->save();
//апдейтим поле в смарт-процессе
//echo "количество страниц: ".$countPages;
$bError = false;
}
if($bError){
//уведомление в чат автору с ошибкой
//echo $errorText;
if(strpos($authorId,"user_")!==false){
$authorId = str_replace("user_", "",$authorId);
if(CModule::IncludeModule('im')){
$arFields = array(
"NOTIFY_TITLE" => "Ошибка при подсчете страниц", //заголовок
"MESSAGE" => $errorText,
"MESSAGE_TYPE" => IM_MESSAGE_SYSTEM, // IM_MESSAGE_PRIVATE, IM_MESSAGE_CHAT, IM_MESSAGE_OPEN, IM_MESSAGE_SYSTEM, IM_MESSAGE_OPEN_LINE
"TO_USER_ID" => $authorId,
"FROM_USER_ID" => $authorId,
//"AUTHOR_ID" => $userIdOther, //может отличаться от FROM_USER_ID
"NOTIFY_TYPE" => IM_NOTIFY_SYSTEM, // IM_NOTIFY_CONFIRM, IM_NOTIFY_SYSTEM, IM_NOTIFY_FROM
"NOTIFY_MODULE" => "main", // module id sender (ex: xmpp, main, etc)
"NOTIFY_EVENT" => "manage",
);
CIMMessenger::Add($arFields);
}
}
}
} |
$root = $this->GetRootActivity();
$id = $root->GetDocumentId();
CalculatePdfPages($id,"{{Кем создан}}"); |
вариант, по id попроще
function CalculatePdfPagesByFileId($fileId){
$result = 0;
if(!empty($fileId) && (intval($fileId)==$fileId) && CModule::IncldeModule('disk')){
$file = Bitrix\Disk\File::getById($fileId);
$info = $file->getFile();
$b = true;
if(!empty($info["CONTENT_TYPE"]) && ($info["CONTENT_TYPE"]== "application/pdf")){
$im = new Imagick();
$im->pingImage( $_SERVER["DOCUMENT_ROOT"].$info["SRC"] );
$result = $im->getNumberImages();
}
}
return $result;
} |
из БП php код
$root = $this->GetRootActivity();
$cntPages = CalculatePdfPagesByFileId($root->GetVariable('Variable10'));
$root->SetVariable('Variable11', $cntPages); |