Имя: Пароль:
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, приводила как такому же эффекту, как два лишних пробела.