Имя: Пароль:
1C
Веб-мастеринг
Скачать файл с http сервиса на 1С, вызов из Битрикса с авторизацией
0 Oblako486
 
13.04.22
13:46
Подойдет ли код ниже для этой задачи? или нужно делать через SOAPClient. В браузере если перейти по ссылке то pdf скачивается, предварительно браузер выдает окно с авторизацией.
$curl = curl_init();
$username = 'Администратор';
$password = 'ХХХХХ';
$url = 'http://domen.online/UT1/hs/CreatePDF/';
$fp = fopen("bill.pdf", "w");
curl_setopt($curl, CURLOPT_URL, '$url');
curl_setopt($curl, CURLOPT_USERPWD, $username . ":" . $password);  
curl_setopt($curl, CURLOPT_FILE, $fp);
curl_setopt($curl, CURLOPT_USERAGENT, "Opera/10.00 (Windows NT 5.1; U; ru) Presto/2.2.0");
$result = curl_exec($curl);
curl_close($curl);



этот код пока выдает ошибку:
[Error]
Call to undefined function pre() (0)
/home/bitrix/ext_www/xxxx.ru/www/local/php_interface/include/cURL-polyfill.php:111
#0: Curl->execute()
    /home/bitrix/ext_www/xxxx.ru/www/local/php_interface/include/cURL-polyfill.php:22
1 vde69
 
13.04.22
13:56
переменная $curl будет передаваться в curl_setopt как значение или как ссылка?
2 Oblako486
 
13.04.22
13:59
(1) а как правильно?
3 vde69
 
13.04.22
14:07
(2) если параметр передается как значение, то фактически внутри процедуры ты получаешь копию и меняя ее ты меняешь только копию, по выходу из процедуры значение переменной переданное как параметр не изменится.

короче читай https://yandex.ru/search/?lr=213&text=php+передача+по+ссылке&fyandex=1
4 Oblako486
 
13.04.22
14:09
(3) чем отличается передача по ссылке или по значению мне понятна.
Но как это связано с текущим кодом?
5 vde69
 
13.04.22
14:15
(4) покажи как у тебя описана процедура curl_setopt
6 ololoraise
 
13.04.22
14:21
(0) авторизация Basic?
У меня вот так работает:

    $user = "1";
    $password = "1";    
    $base64=base64_encode("$user:$password");  
    $headers=Array();
    array_push($headers,'Content-Type: application/x-www-form-urlencoded');
    array_push($headers,'Authorization: Basic '.$base64);
    $curl=curl_init();
    $uri="";
    curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
    curl_setopt($curl,CURLOPT_URL,$uri);
    curl_setopt($curl,CURLOPT_CUSTOMREQUEST,'GET');
    curl_setopt($curl,CURLOPT_HTTPHEADER,$headers);
    curl_setopt($curl,CURLOPT_HEADER,false);
    $response=curl_exec($curl);
7 Oblako486
 
13.04.22
14:33
(5) ну по идеи вот так. Я её не модифицировал, это вроде стандартная https://www.php.net/manual/ru/function.curl-setopt.php
8 Oblako486
 
13.04.22
14:35
(6) Класс этот код прокатил, PDF попадает $response. Авторизация Basic.
Теперь остается вопрос. А как его правильно передать в браузер, чтобы пользователь увидел его на всю страницу?
9 ololoraise
 
13.04.22
15:03
(8) что то наподобе:


$response=curl_exec($curl);
$filename = "bill.pdf";
header('Content-type: application/pdf');
header('Content-Disposition: inline; filename="' . $filename . '"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . strlen($response));
header('Accept-Ranges: bytes');
echo $response;
10 Oblako486
 
13.04.22
16:36
(9) Вместо нормального pdf выводится текст, который ниже(середину вырезал).

%PDF-1.7 %‚„œ” 1 0 obj << /Filter /FlateDecode /Length 2 0 R /Length1 30148 /Length2 0 /Length3 0 >> stream xúÌΩ

Ш' й&%Ѓe?rЭЂѕВ¬¦Ц іdмз?ecЏ‚-?qы&яѕ±яTЉэYќїўШясУяshџ? endstream endobj 32 0 obj 4733 endobj xref 0 33 0000000000 65535 f 0000000015 00000 n 0000019467 00000 n 0000019488 00000 n 0000019577 00000 n 0000019595 00000 n 0000019803 00000 n 0000020333 00000 n 0000020352 00000 n 0000020782 00000 n 0000020921 00000 n 0000040644 00000 n 0000040666 00000 n 0000040755 00000 n 0000040774 00000 n 0000040995 00000 n 0000041555 00000 n 0000041575 00000 n 0000042053 00000 n 0000042204 00000 n 0000063251 00000 n 0000063273 00000 n 0000063364 00000 n 0000063383 00000 n 0000063594 00000 n 0000064148 00000 n 0000064168 00000 n 0000064621 00000 n 0000064763 00000 n 0000064863 00000 n 0000064924 00000 n 0000065210 00000 n 0000070019 00000 n trailer << /Size 33 /Root 28 0 R /ID [ <1fe1a3f105174fd29809da28fb870969> <1fe1a3f105174fd29809da28fb870969> ] >> startxref 70040 %%EOF

При этом сохранение pdf в файл на хостинге удается сделать. И сохраненный pdf, если его вручную открыть выглядит нормально.  
я бы предположил что нужно добавить такой header, но он добавлен.
header('Content-Transfer-Encoding: binary');
11 Oblako486
 
13.04.22
19:15
(10) если посмотреть панель разработчика, там такой заголовк, странно что подменяется. content-type: text/html
12 Юрий Лазаренко
 
13.04.22
21:03
(10) А как ты хочешь на странице вывести PDF? Если хочется отобразить его на странице, то его сначала надо конвертировать в HTML, а ты получаешь двоичные данные, то есть, содержимое PDF-файла. Попробуй открыть обычный PDF текстовым редактором - ты в нем как раз увидишь текст из (10). Если хочешь отобразить в нормальном виде на странице, то на стороне 1С сначала конвертируй его в HTML и отдавай уже HTML.
13 Oblako486
 
13.04.22
21:37
(12) Не пойму, впринципе отказаться от pdf? Вместо pdf передавать html?
14 Oblako486
 
13.04.22
21:38
Мне удается сохранить из двоичных данных на сервере в нормальный Pdf. И этот файл вполне открывается вручную.
15 Oblako486
 
13.04.22
21:39
(14) но вот для браузера 10 пример из инета попробовал(даже начинать с того что файл pdf на сервере уже есть) и не работает.
16 Oblako486
 
13.04.22
21:43
(12) хочу открыть pdf в новой вклакде на весь экран
17 Юрий Лазаренко
 
13.04.22
22:25
(16) Если хочешь скачать как файл - тогда передаешь в виде двоичных данных с соответствующим заголовком, в 1С это делается так:
Ответ.Заголовки.Вставить("Content-Type","application/x-octet-stream");
Тогда при скачивании файла браузер сразу предлагает его сохранить.
Если же PDF нужно открыть в новой вкладке браузера, то его необходимо конвертировать из формата PDF в формат HTML. Это можно сделать либо на стороне клиента (передать из 1С двоичные данные, в браузере эти данные принять, сконвертировать в HTML и показать на странице, но не уверен, что такие конвертеры для браузеров бывают), либо уже на стороне 1С сразу конвертировать и передавать браузеру готовый HTML. Браузер - это программа, которая берет размеченный текст и отбражает его. Но браузер понимает только язык разметки "HTML". PDF - это тоже по сути размеченный файл, но он размечен в формате PDF, а не HTML, поэтому браузер отображает просто его исходный код: кракозябры и всякие служебные символы.
18 Oblako486
 
13.04.22
23:00
(17) c 1C файл успешно передается и сохраняется на сервере в нормальном виде. Здесь нет проблемы. (6) отлично работает.
Проблема на след. этапе. В этом же php нужно отдать файл в браузер. И нужен именно pdf. Браузеры вроде нормально их открывают без всякого html. В интернете примеры наподобие (9) но почему ни один не работает, даже те, которые берут pdf из файла на хостинге.
19 Oblako486
 
13.04.22
23:02
например не работает такой пример, возвращается текст как в (10)
$filename = "bill.pdf";
header("Content-type: application/pdf");
header('Content-Disposition: inline; filename="' . $filename . '"');
readfile($filename);
20 Oblako486
 
13.04.22
23:03
(19) идеально конечно сделать как в (9) вообще без сохранения файла.
21 Oblako486
 
13.04.22
23:06
(17) сам php файл нужен, чтобы скрыть адрес базы и авторизацию.
22 Юрий Лазаренко
 
13.04.22
23:17
(18) Я не буду утверждать, что уверен на 100%, но насколько помню, для того, чтобы браузер отображал PDF, в настройках необходимо установить соответствующий флажок. А если это так, то вариант передачи чистого pdf с заголовками
header("Content-type: application/pdf");
header('Content-Disposition: inline; filename="' . $filename . '"');
будет ненадежным. Я бы рассмотрел вариант конвертации pdf в html на стороне 1С.
Хотя могу ошибаться. Но быстрое гугление не выдало рабочего варианта отображения PDF в браузере, которым можно рулить из PHP.
23 dreizehn
 
13.04.22
23:40
(22) >  рабочего варианта отображения PDF в браузере
https://stackoverflow.com/questions/12092633/pdf-js-rendering-a-pdf-file-using-a-base64-file-source-instead-of-url
24 ololoraise
 
14.04.22
09:37
(10) Плагин для просмотра pdf в браузере есть?
25 ololoraise
 
14.04.22
09:52
+ (24) если плагина нет, тогда необходимо свой просмоторщик устанавливать на сайт, либо отдавать сразу для загрузки.
26 Oblako486
 
14.04.22
17:41
Разобрался. В итоге (6) и (9) отлично работает, как и хотелось без сохранения файла.
Проблема была в двух пробелах перед первым тегом php, при тестировании на стороннем сервере.
А на сайте с битриксом подключал не тот пролог. Шапка выведенная перед самим выводом pdf, приводила как такому же эффекту, как два лишних пробела.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший