Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
15 дек 2024, 15:35

Ошибка при отображении файла PDF

Автор Алексей_1985_06, 06 мар 2024, 12:40

0 Пользователей и 2 гостей просматривают эту тему.

Алексей_1985_06

Добрый день, ребят прошу помощи в следующем вопросе:
1. При помещении файла pdf во ВХ, необходимо отобразить его на форме, для этого создан реквизит формы ДокументPDF - тип ДокументPDF, но после получения двоичных данных из ВХ и их чтении возникает ошибка:

Ошибка при вызове метода контекста (Прочитать)
{РегистрСведений.ДокументыНаИзделия.Форма.ФормаЗаписи.Форма(50)}:ЭтотОбъект.ДокументPDF.Прочитать(Поток);

[ОшибкаВоВремяВыполненияВстроенногоЯзыка]
по причине:
Использование синхронных методов на клиенте запрещено!
[ОшибкаИспользованияВстроенногоЯзыка]

Помогите пжл исправить, кто знает как!

Код процедуры:

#Область Помещение_файла_во_Временное_Хранилище


&НаКлиенте
Процедура ЗагрузитьФайл(Команда)

ПоместитьФайлВоВХ(); // Процедура которая помещает файл во Временное Хранилище
   
КонецПроцедуры


&НаКлиенте
Асинх Процедура ПоместитьФайлВоВХ()

// Создадим параметры диалога для выбора файла (фильтр для выбора файлов)
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов();   
ПараметрыДиалога.Заголовок = "Выберите файл для загрузки";
ПараметрыДиалога.МножественныйВыбор = Ложь;
ПараметрыДиалога.Фильтр = "Файлы PDF (*.pdf)|*.pdf|";


ОписаниеФайла = Ждать ПоместитьФайлНаСерверАсинх(,,,ПараметрыДиалога,УникальныйИдентификатор);


   Если ОписаниеФайла <> Неопределено Тогда
   
АдресФайла = ОписаниеФайла.Адрес;   


////////////////////////////////////////////////////////////////////////
ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(АдресФайла); // Получим двоичные данные из Временного хранилища
Поток = ДвоичныеДанныеФайла.ОткрытьПотокДляЧтения();
ЭтотОбъект.ДокументPDF.Прочитать(Поток);         // ВОЗНИКАЕТ ОШИБКА
/////////////////////////////////////////////

Модифицированность = Истина;  

КонецЕсли; 
КонецПроцедуры



#КонецОбласти


LexaK

Алексей_1985_06, попробуйте читать ПДФ сразу из файла, зачем эта свистопляска с этими двоичными данными и потоком?
если помогло нажмите: Спасибо!

Максим75

Алексей_1985_06, а разве не на сервере надо выводить саму картинку (или документ PDF)?
передайте полученные двоичные данные на сервер и там ДокументPDF.Прочитать(Поток).

Алексей_1985_06

LexaK, Здравствуйте, можете показать как это сделать? Что-то не получается у меня никак........

Максим75

смотрите, Вы открываете файл.
потом что хочется? на форму вывести картинку?

Алексей_1985_06

Максим75, Да, помещаю файл во ВХ, и хочу чтобы в реквизите формы "ДокументPDF" - отобразился помещенный файл в формета pdf, чтобы пользователь смог посмотреть что он загружает, и в случае необходимости отказаться от записи

Максим75

вот нашел, может поможет

Отобразить PDF в HTML через WebKit из 1С 8.3:
Процедура Отобразить_PDF_в_HTML(HTMLДок, Данные) Экспорт

   // Параметры:
   // HTMLДок - Поле HTML документа - поле, в которое надо вывести pdf.
   // Данные - Двоичные данные - pdf документ.

  // Внимание! При копировании в 1С могут некорректно вставиться данные(метатеги)
   PDFФайлСтрока = ПолучитьBase64СтрокуИзДвоичныхДанных(Данные);
   HTMLДок = "<!DOCTYPE html>
                   |<html>
                   |    <head>
                   |       <meta http-equiv=""Content-Type"" content=""text/html; charset=UTF-8"" />
                   |       <meta name=""viewport"" content=""width=device-width, initial-scale = 1.0, maximum-scale = 1.0, user-scalable=no"">
                   |       <script src=""https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.4.456/pdf.min.js""></script>
                   |       <script src=""https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.4.456/pdf.worker.min.js""></script>
                   |       <canvas id=""the-canvas""></canvas>
                   |       <script>
                   |             var currPage = 1; //Pages are 1-based not 0-based
                   |             var numPages = 0;
                   |             var thePDF = null;
                   |
                   |             var loadingTask = pdfjsLib.getDocument({data: atob(`"+PDFФайлСтрока+"`)});
                   |             loadingTask.promise.then(function(pdf) {
                   |       
                   |             thePDF = pdf;
                   |             numPages = pdf.numPages;
                   |
                   |             pdf.getPage(1).then(handlePages);
                   |
                   |             function handlePages(page) {
                   |             var scale = 1.5;
                   |
                   |             var viewport = page.getViewport({scale: scale});
                   |
                   |             var canvas = document.createElement( ""canvas"" );
                   |             canvas.style.display = ""block"";
                   |             var context = canvas.getContext('2d');
                   |             canvas.height = viewport.height;
                   |             canvas.width = viewport.width;
                   |
                   |             var renderContext = {
                   |             canvasContext: context,
                   |             viewport: viewport
                   |             };
                   |             var renderTask = page.render(renderContext);
                   |
                   |             document.body.appendChild( canvas );
                   |
                   |             currPage++;
                   |             if ( thePDF !== null && currPage <= numPages )
                   |             {
                   |             thePDF.getPage( currPage ).then( handlePages );
                   |             }
                   |             };
                   |
                   |             });
                   |       </script>
                   |   </body>
                   |</html>";

КонецПроцедуры

создаете реквизит на форме, вид элементу даете Поле HTML документа, передаете в процедуру двоичные данные файла и сам реквизит.

посмотрите в сети, гулчет много вариантов вывода на форму pdf-документа.

LexaK

Алексей_1985_06, у меня такой код сработал (УТ)
    лкСвойстваФайла = РаботаСФайламиВТомахСлужебный.СвойстваФайлаВТоме(прДанные.ПрисоединенныйФайл);
лкСертификат = РаботаСФайламиВТомахСлужебный.ПолноеИмяФайлаВТоме(лкСвойстваФайла);
ДокПДФ = Новый ДокументPDF;
ДокПДФ .Прочитать(лкСертификат);

после возврата на Клиент, выполнял команду
ДокПДФ.Показать()

если у вас это реквизит формы, тогда наверно не надо .Показать()
если помогло нажмите: Спасибо!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск