Вход | Регистрация
 

склейка jpg, xls, xlsx, txt в единый pdf файл.

склейка jpg, xls, xlsx, txt в единый pdf файл.
Я
   Droning1C
 
30.09.20 - 16:28
Добрый день! Есть некая папка, в ней лежат файлы jpg, xls, xlsx, txt. Их нужно объединить в пдф, прифигачив к каждому файлу шапочку.

Для небольшого количества файлов меня выручал объект ПакетОтображаемыхДокументов. Я делал на каждый файл свой ТабДок и пихал в его состав для дальнейшего сохранения. И все было замечательно, файл на выходе весил всего 5мб и все верно отображалось. НО как только файлов к объединению стало 12, этот объект начал неадекватно себя вести. К примеру - первые 2-3 картинки в итоговом пдф отображаются верно, а последующие картинки повторяют первую выведенную, причем в Табдоках, сливаемых в ПакетОтображаемыхДокументов все отображается верно.

Вообщем, не пошло дело.... Стал действовать иначе.

Я в определенной последовательности каждый файл пихаю в табдок, дополняя шапкой. На выходе записываю ТабДок в pdf. Размер файла на выходе огромный - 150мб. Если схоранять в mxl, то 30мб, что тоже немало.
СжатиеДанных() и Картинка.Преобразовать пробовал, итоговый файл все равно весит 150 мб.

Как выйти из данной ситуации? В чем может быть прикол с ПакетОтображаемыхДокументов ? Как уменьшить размер файла на выходе, если идти путем через сохранение табдока в пдф напрямую?
   Droning1C
 
1 - 30.09.20 - 16:32
Способ с сохранением табдока напрямую



Процедура СформироватьПакетДокументов2(ПутьСохраненияПакета//все правильно выводится в табдок, сохраняется в пдф. огромный размер результирующего файла.

    
    МакетPDF = ПолучитьОбщийМакет("МакетPDF");
    Пакет = Новый ПакетОтображаемыхДокументов;
    ОбластьШапка = МакетPDF.ПолучитьОбласть("Шапка");
    
    Если ТабличноеПолеФайлы.ВыгрузитьКолонку("Пометка").Количество() > 0 Тогда
        
        ТабДок = Новый ТабличныйДокумент;
        
    КонецЕсли;
    
    
    Для Каждого Строка Из ТабличноеПолеФайлы Цикл
        
        Если Строка.Пометка Тогда
            
            Файл = Новый Файл(Строка.Путь);
            
            Если Файл.Расширение = ".jpg" Тогда
                
                ВывестиОбласть(ТабДок, ОбластьШапка, Файл.Имя);
                
                ОбластьИзображение = МакетPDF.ПолучитьОбласть("Изображение");
                
                Рисунок = ОбластьИзображение.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
                Индекс  = ОбластьИзображение.Рисунки.Индекс(Рисунок);
                Рисунок.Картинка = Новый Картинка(Строка.Путь);
                ОбластьИзображение.Рисунки[Индекс].Расположить(ТабДок.Область("R1C1:R66C58"));
                Рисунок.РазмерКартинки = РазмерКартинки.Растянуть;
                Рисунок.ГраницаСверху  = Ложь;
                Рисунок.ГраницаСнизу   = Ложь;
                Рисунок.ГраницаСлева   = Ложь;
                Рисунок.ГраницаСправа  = Ложь;
                
                ТабДок.Вывести(ОбластьИзображение);
                
            ИначеЕсли Файл.Расширение = ".xls" ИЛИ Файл.Расширение = ".xlsx" Тогда
                
                ВывестиОбласть(ТабДок, ОбластьШапка, Файл.Имя);
                
                ТабДокФайл = Новый ТабличныйДокумент;
                ТабДокФайл.Прочитать(Файл.ПолноеИмя);
                
                НачальнаяСтрока = ТабДокФайл.Области.Найти("Лист1").Верх;
                КонечнаяСтрока  = ТабДокФайл.ВысотаТаблицы;
                Для ТекущаяСтрока = НачальнаяСтрока По КонечнаяСтрока Цикл
                    ОбластьЯчейки = ТабДокФайл.Область(ТекущаяСтрока, 1);
                    ОбластьЯчейки.ВысотаСтроки = 0;
                    ОбластьЯчейки.АвтоВысотаСтроки = Истина;
                КонецЦикла;
                
                ТабДокФайл.АвтоМасштаб = Истина;
                ТабДок.Вывести(ТабДокФайл);
                
            ИначеЕсли Файл.Расширение = ".txt" Тогда
                
                ВывестиОбласть(ТабДок, ОбластьШапка, Файл.Имя);
                
                ОбластьИзображение = МакетPDF.ПолучитьОбласть("Изображение");
                
                Рисунок = ОбластьИзображение.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст);
                Индекс  = ОбластьИзображение.Рисунки.Индекс(Рисунок);
                ОбластьИзображение.Рисунки[Индекс].Расположить(ТабДок.Область("R1C1:R66C58"));
                
                ТекстовыйФайл = Новый ТекстовыйДокумент;
                ТекстовыйФайл.Прочитать(Файл.ПолноеИмя,КодировкаТекста.UTF8,);
                ОбластьИзображение.Рисунки[Индекс].Текст = ТекстовыйФайл.ПолучитьТекст();
                
                Рисунок.ГраницаСверху  = Ложь;
                Рисунок.ГраницаСнизу   = Ложь;
                Рисунок.ГраницаСлева   = Ложь;
                Рисунок.ГраницаСправа  = Ложь;
                
                ТабДок.Вывести(ОбластьИзображение);
            Иначе
                
            КонецЕсли;
        КонецЕсли;
        
    КонецЦикла;
    
    ТабДок.АвтоМасштаб = Истина;
    
    Если ТабДок.Области.Количество() > 0 Тогда
        
        УниверсальныеМеханизмы.НапечататьДокумент(ТабДок);
        
        ТабДок.Записать(ПутьСохраненияПакета + "Пакет_" + СервисыКП.НомерЗаказа2ИмяФайла(ЗаказПокупателя.Номер) + " (" + СервисыКП.НомерЗаказа2ИмяФайла(ЗаказПокупателя.НомерКД) + ")" + ".pdf",ТипФайлаТабличногоДокумента.PDF);
    КонецЕсли;
    
КонецПроцедуры
   Droning1C
 
2 - 30.09.20 - 16:36
Код по варианту с пакетом

Процедура СформироватьПакетДокументов3(ПутьСохраненияПакета)  //Вывод в ПакетОтображаемыхДокументов. Работает хорошо на 3 файла, если файлов много, то начинается дурдом

    
    МакетPDF = ПолучитьОбщийМакет("МакетPDF");
    Пакет = Новый ПакетОтображаемыхДокументов;
    ОбластьШапка = МакетPDF.ПолучитьОбласть("Шапка");
    ЕстьФайлыКобъединению = Ложь;

    ТабДок = Новый ТабличныйДокумент;
    Пакет = Новый ПакетОтображаемыхДокументов;
        
    Для Каждого Строка Из ТабличноеПолеФайлы Цикл
        
        Если Строка.Пометка Тогда
            
            Файл = Новый Файл(Строка.Путь);
            
            Если Файл.Расширение = ".jpg" Тогда
                
                ТабДок = Новый ТабличныйДокумент;
                ВывестиОбласть(ТабДок, ОбластьШапка, Файл.Имя);
                
                ОбластьИзображение = МакетPDF.ПолучитьОбласть("Изображение");
                
                Рисунок = ОбластьИзображение.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
                Индекс  = ОбластьИзображение.Рисунки.Индекс(Рисунок);
                Рисунок.Картинка = Новый Картинка(Строка.Путь);
                ОбластьИзображение.Рисунки[Индекс].Расположить(ТабДок.Область("R1C1:R66C58"));
                Рисунок.РазмерКартинки = РазмерКартинки.Растянуть;
                Рисунок.ГраницаСверху  = Ложь;
                Рисунок.ГраницаСнизу   = Ложь;
                Рисунок.ГраницаСлева   = Ложь;
                Рисунок.ГраницаСправа  = Ложь;
                
                ТабДок.Вывести(ОбластьИзображение);
                
                ЭлементПакета = Пакет.Состав.Добавить();
                ЭлементПакета.Данные = ПоместитьВоВременноеХранилище(ТабДок,Новый УникальныйИдентификатор);
                ЭлементПакета.Наименование = Файл.Имя;
                
            ИначеЕсли Файл.Расширение = ".xls" ИЛИ Файл.Расширение = ".xlsx" Тогда
                
                ТабДок = Новый ТабличныйДокумент;
                
                ВывестиОбласть(ТабДок, ОбластьШапка, Файл.Имя);
                
                ТабДокФайл = Новый ТабличныйДокумент;
                ТабДокФайл.Прочитать(Файл.ПолноеИмя);
                
                НачальнаяСтрока = ТабДокФайл.Области.Найти("Лист1").Верх;
                КонечнаяСтрока  = ТабДокФайл.ВысотаТаблицы;
                Для ТекущаяСтрока = НачальнаяСтрока По КонечнаяСтрока Цикл
                    ОбластьЯчейки = ТабДокФайл.Область(ТекущаяСтрока, 1);
                    ОбластьЯчейки.ВысотаСтроки = 0;
                    ОбластьЯчейки.АвтоВысотаСтроки = Истина;
                КонецЦикла;
                
                ТабДокФайл.АвтоМасштаб = Истина;
                ТабДок.Вывести(ТабДокФайл);
                
                ЭлементПакета          = Пакет.Состав.Добавить();
                ЭлементПакета.Данные = ПоместитьВоВременноеХранилище(ТабДок,Новый УникальныйИдентификатор);
                                
            ИначеЕсли Файл.Расширение = ".txt" Тогда
                
                ТабДок = Новый ТабличныйДокумент;
                ВывестиОбласть(ТабДок, ОбластьШапка, Файл.Имя);
                
                ОбластьИзображение = МакетPDF.ПолучитьОбласть("Изображение");
                
                Рисунок = ОбластьИзображение.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст);
                Индекс  = ОбластьИзображение.Рисунки.Индекс(Рисунок);
                ОбластьИзображение.Рисунки[Индекс].Расположить(ТабДок.Область("R1C1:R66C58"));
                
                ТекстовыйФайл = Новый ТекстовыйДокумент;
                ТекстовыйФайл.Прочитать(Файл.ПолноеИмя,КодировкаТекста.UTF8,);
                ОбластьИзображение.Рисунки[Индекс].Текст = ТекстовыйФайл.ПолучитьТекст();
                
                Рисунок.ГраницаСверху  = Ложь;
                Рисунок.ГраницаСнизу   = Ложь;
                Рисунок.ГраницаСлева   = Ложь;
                Рисунок.ГраницаСправа  = Ложь;
                
                ТабДок.Вывести(ОбластьИзображение);

                Сч = Сч + 1;
                
                ЭлементПакета = Пакет.Состав.Добавить();
                ЭлементПакета.Данные = ПоместитьВоВременноеХранилище(ТабДок,Новый УникальныйИдентификатор);
                ЭлементПакета.Наименование = Файл.Имя;
                
            Иначе
                
            КонецЕсли;
                        
        КонецЕсли;
        
    КонецЦикла;
    
    Пакет.ЗаписатьФайлДляПечати(ПутьСохраненияПакета + "Пакет_" + СервисыКП.НомерЗаказа2ИмяФайла(ЗаказПокупателя.Номер) + " (" + СервисыКП.НомерЗаказа2ИмяФайла(ЗаказПокупателя.НомерКД) + ")" + ".pdf");
    
КонецПроцедуры
   Garykom
 
3 - 30.09.20 - 16:38
pdf принтер
   Droning1C
 
4 - 30.09.20 - 16:45
(3) а точнее? я знаю про метод ТабДок.Напечатать(), если вы это имеете ввиду. Но у него нет параметров. Как передать на нужный пдф принтер так, чтобы у пользователя хотя бы открылось окно, где он мог бы сохранить файл. Или я неверно понимаю саму схему?
   Базис
 
5 - 30.09.20 - 16:48
Может всё же в единый архив? Или это для каких-нибудь ГОЗ?

Если есть терпение - задокументируй ошибку и отправь в 1С.
   Droning1C
 
6 - 30.09.20 - 16:51
(5) может это из-за версии платформы. Старенькая стоит (8.3.13.1644). Дело еще в том, что ПакетОтображаемыхДокументов очень быстро формируется, в отличии от сохранения пдф из табдока. И хотелось бы использовать именно этот метод, но видимо, не судьба.
   Droning1C
 
7 - 30.09.20 - 16:54
А можно ли куда-то во внешнюю компоненту передать ТабДок или mxl и конвертнуть в pdf со сжатием?
   Droning1C
 
8 - 30.09.20 - 17:07
(5) единый архив не пойдет, только склейка в единый файл.
   Builder
 
9 - 30.09.20 - 17:29
(4) Автоматизировать печать на pdf принтер, например bullzip. Там есть опция добавить к существующему файлу.
Ну и
ТабДок.ИмяПринтера="Bullzip PDF Printer"
   Droning1C
 
10 - 30.09.20 - 17:48
(9) спасибо, буду разбираться дальше.
   Droning1C
 
11 - 01.10.20 - 11:27
(9) "This program is FREEWARE with limitations, which means that there is a FREE version for personal and commercial use up to 10 users. It does not contain any advertising or popups. For commercial applications with more than 10 users there are commercial versions available with advanced features

Буллзип не смогу использовать. 300+ пользователей, потребуется закупка. Есть какие-то бесплатные аналоги?
   Garykom
 
12 - 01.10.20 - 11:31
(11) >Есть какие-то бесплатные аналоги?

Есть.
   Droning1C
 
13 - 01.10.20 - 11:38
(12) какие?
   Droning1C
 
14 - 01.10.20 - 11:46
doPDF подойдет? Есть опыт использования на терминальном сервере?
   МихаилМ
 
15 - 01.10.20 - 12:46
(11) 9 долларов на пользователя. цена приемлемая.
   Builder
 
16 - 01.10.20 - 12:53
(11) Ищи предыдущие версии, они были полностью бесплатные.
   Droning1C
 
17 - 02.10.20 - 11:07
(16) а не подскажете любую бесплатную версию, которую сами используете?
   Garykom
 
18 - 02.10.20 - 11:12
   Mikeware
 
19 - 02.10.20 - 11:16
imagemagic ?
   Builder
 
20 - 02.10.20 - 11:35
(17) У меня на серваках автоматизировано еще через bullzip 6.0, прекрасно под Win7/Win2008 работает.
Плюс в том что bullzip в терминалке работает, что не многие умеют.
   sitex
 
21 - 02.10.20 - 11:54
Кто нить пробовал через pdf.js ?
   Garykom
 
22 - 02.10.20 - 12:32
(21) pdf.js служит для парсинга и рендеринга pdf файлов
ТС нужен "принтер" или он залюбится "файлы jpg, xls, xlsx, txt" в pdf засовывать со своей шапкой
   sitex
 
23 - 02.10.20 - 12:47
(22) Да ладно , можно с помощью pdf.js , pdf.worker.js объединять правда только pdf файлы.  Я не про ТС уже.
   Garykom
 
24 - 02.10.20 - 13:48
(23) А вот это хороший вариант для ТС, делать разные pdf а потом их склеить чем то внешним относительно 1С
   Droning1C
 
25 - 02.10.20 - 21:28
Помог Bullzip_PDF_Printer_v10.12.0.2363. Пока на локальном компе тестил, полет отличный. Формировал единый табдок, без склеек. Сформированный файл весит 12,5 мб вместо 150ти адынэсовских мб.


Принтер=Новый ComObject("Bullzip.PDFPrinterSettings");
        Принтер.SetValue("Output", "E:\Пакет_.pdf"); 
        Принтер.SetValue("ShowSettings", "never"); 
        Принтер.SetValue("ShowSaveAS", "never"); 
        Принтер.SetValue("ShowProgress", "no"); 
        Принтер.SetValue("ShowProgressFinished", "no"); 
        Принтер.SetValue("ShowPDF", "no"); 
        Принтер.SetValue("ConfirmOverwrite", "no"); 
        
        Принтер.WriteSettings(1);  
        
        ТабДок.ИмяПринтера = "Bullzip PDF Printer";
        ТабДок.Напечатать();


Если в настройках вручную поставить флажок "Сжатие картинок", то 11 мб на выходе. 

Итого) 1-Где нарыть полный список значений, которые можно установить буллзипу программно? Хочу сжимать картинки.(В справке по API COM буллзипа нет этой инфы)

2- При выполнении метода Напечатать() на экран пользователю вылезает окошко в котором красуется надпись "Печатается документ Табличный документ на принтер буллзип" и прогресс. Можно ли скрыть от глаз пользователя данное окошко?
   Ёпрст
 
26 - 03.10.20 - 00:35
(0) если платформа>16 то пробуй сохранять в PDF/A-3
   Ёпрст
 
27 - 03.10.20 - 00:36
и..другие пдф форматы.

Короче, какой то из них с сжатием
   Ёпрст
 
28 - 03.10.20 - 00:37
а так, твой 150метровый можно в акробате пересохранить со сжатием, будет пару метров
   Droning1C
 
29 - 04.10.20 - 10:41
(28) не катит. эти 150 мб очень долго формируются платформой, чтобы еще их пересохранять


Список тем форума
Рекламное место пустует  Рекламное место пустует
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.