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

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

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

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

Как выйти из данной ситуации? В чем может быть прикол с ПакетОтображаемыхДокументов ? Как уменьшить размер файла на выходе, если идти путем через сохранение табдока в пдф напрямую?
1 Droning1C
 
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);
    КонецЕсли;
    
КонецПроцедуры
2 Droning1C
 
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");
    
КонецПроцедуры
3 Garykom
 
гуру
30.09.20
16:38
pdf принтер
4 Droning1C
 
30.09.20
16:45
(3) а точнее? я знаю про метод ТабДок.Напечатать(), если вы это имеете ввиду. Но у него нет параметров. Как передать на нужный пдф принтер так, чтобы у пользователя хотя бы открылось окно, где он мог бы сохранить файл. Или я неверно понимаю саму схему?
5 Базис
 
naïve
30.09.20
16:48
Может всё же в единый архив? Или это для каких-нибудь ГОЗ?

Если есть терпение - задокументируй ошибку и отправь в 1С.
6 Droning1C
 
30.09.20
16:51
(5) может это из-за версии платформы. Старенькая стоит (8.3.13.1644). Дело еще в том, что ПакетОтображаемыхДокументов очень быстро формируется, в отличии от сохранения пдф из табдока. И хотелось бы использовать именно этот метод, но видимо, не судьба.
7 Droning1C
 
30.09.20
16:54
А можно ли куда-то во внешнюю компоненту передать ТабДок или mxl и конвертнуть в pdf со сжатием?
8 Droning1C
 
30.09.20
17:07
(5) единый архив не пойдет, только склейка в единый файл.
9 Builder
 
30.09.20
17:29
(4) Автоматизировать печать на pdf принтер, например bullzip. Там есть опция добавить к существующему файлу.
Ну и
ТабДок.ИмяПринтера="Bullzip PDF Printer"
10 Droning1C
 
30.09.20
17:48
(9) спасибо, буду разбираться дальше.
11 Droning1C
 
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+ пользователей, потребуется закупка. Есть какие-то бесплатные аналоги?
12 Garykom
 
гуру
01.10.20
11:31
(11) >Есть какие-то бесплатные аналоги?

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