Создание PDF из OpenOffice.

26.06.09

Разработка - Универсальные функции

Возникла задача отправлять счета почтой. PDFcreator не подошёл поскольку не удалось вместить счёт на одну страницу по ширине. Решил попробовать OpenOffice. Как сохранять в PDF нашёл быстро, а вот как уместить счёт на одну страницу вширь искал долго.

2010.07.04 В версии 1С 8.2.232 появилась возможность сохранять табличный документ в xls файл на сервера под линуксом. А вот работать с Опеном офисом из-под линукса пока не получается.

Собственно комментари ненужны. Вот весь код. Самое интересное это бодание со стилями страниц в Опене Офисе. Жаль что этот фрагмент работает только на клиенте. На сервере вопрос не решается :-(

Процедура КнопкаВыполнитьНажатие(Кнопка)
    Если
Письмо.Основание.Пустая() Тогда
        Возврат
    КонецЕсли;

   
// Открыть OpenOffice
   
Попытка
       
ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
    Исключение
        Возврат
// опен офис не установлен :-(
   
КонецПопытки;

   
// получим печатную форму и запишем её во временный XLS файл
   
Заказ = Письмо.Основание.ПолучитьОбъект();

   
//Получим печатную форму
   
Расшифровка=Новый Структура;
   
Расшифровка.Вставить("СсылкаНаВнешнююОбработку",Константы.ПФСчетаДляКлиента.Получить());
   
Расшифровка.Вставить("ВидПечатнойФормы",Перечисления.ВидыДополнительныхВнешнихОбработок.ПечатнаяФорма);
   
Расшифровка.Вставить("НомерСтроки",1);
   
тд = УниверсальныеМеханизмы.НапечататьВнешнююФорму(Заказ, Расшифровка);

   
ВременныйФайл =ПолучитьИмяВременногоФайла();
   
ВременныйФайлXLS =ВременныйФайл + ".xls";
   
ВременныйФайлPDF =ВременныйФайл + ".pdf";
   
тд.Записать(ВременныйФайлXLS, ТипФайлаТабличногоДокумента.XLS97);

   
// Преобразовываем временный xls файл В PDF
   
Desktop        = ServiceManager.createInstance("com.sun.star.frame.Desktop");

   
НастройкиОткрытия = Новый COMSafeArray("VT_VARIANT", 1);
   
PropertyValue = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
   
PropertyValue.Name = "Hidden";
   
PropertyValue.Value = Истина;
   
НастройкиОткрытия.SetValue(0, PropertyValue);
   
ВременныйФайлXLS_какУРЛ = "file:///" + СтрЗаменить(ВременныйФайлXLS, "\", "/"); // приводим путь к файлу из виндового формата в опен офисный

    // Откроем файл в опене офисе
   
ОпенОфис = Desktop.LoadComponentFromURL(ВременныйФайлXLS_какУРЛ, "_blank", 0, НастройкиОткрытия);

   
//ПараметрыСтраницы = ОпенОфис.createInstance("com.sun.star.style.PageStyle");
    //ПараметрыСтраницы.ScaleToPagesX = 1;
    //
    // Установим масштаб, чтобы счёт помещался на одной странице вширь
    // страниц почему-то много, поэтому устанавливаем масштаб для всех
   
Стили = ОпенОфис.StyleFamilies.getByName("PageStyles");
    Для
поз = 0 по Стили.count - 1 Цикл
       
МойСтиль = Стили.getByIndex(поз);
       
МойСтиль.ScaleToPagesX = 1; // уместить на одной странице вширь
        //МойСтиль.PageScale = 50; // масштаб 50%
   
КонецЦикла;

   
НастройкиСохранения = Новый COMSafeArray("VT_VARIANT", 1);
   
PropertyValue = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
   
PropertyValue.Name = "FilterName";
   
PropertyValue.Value = "calc_pdf_Export";
   
НастройкиСохранения.SetValue(0, PropertyValue);

   
ВременныйФайлPDF_какУРЛ = "file:///" + СтрЗаменить(ВременныйФайлPDF, "\", "/"); // приводим путь к файлу из виндового формата в опен офисный
   
ОпенОфис.storeToURL(ВременныйФайлPDF_какУРЛ, НастройкиСохранения); // сохранили PDF файл
   
ОпенОфис.close(-1);
   
ОпенОфис = Неопределено;

   
// С опеном офисом разобрались. Прикрепляем вложение к письму и удаляем временные файлы.
    //Файл = Новый Файл(ВременныйФайлPDF);
   
объектПисьмо = Письмо.ПолучитьОбъект();
   
стрВложение = объектПисьмо.Вложения.Добавить();
   
стрВложение.ИмяФайла = "Счёт " + Строка(Заказ.Номер) + ".pdf";
   
стрВложение.Файл = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ВременныйФайлPDF));
   
объектПисьмо.Записать();
    Попытка
       
УдалитьФайлы(ВременныйФайлXLS);
       
УдалитьФайлы(ВременныйФайлPDF);
    Исключение
    КонецПопытки;

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

См. также

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    20259    dimanich70    81    

145

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    4101    3    John_d    11    

57

Универсальные функции Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    18225    atdonya    24    

57

Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    5511    ke.92@mail.ru    16    

65

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    14784    YA_418728146    7    

166

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    3596    57    progmaster    8    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    18502    171    sapervodichka    112    

135
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. JohnyDeath 302 26.06.09 12:18 Сейчас в теме
SP 2 для Office 2007 теперь умеет сохранять в PDF, а также открывать/сохранять файлы OO.
Это я так, к слову ;)
2. Трактор 1254 26.06.09 12:41 Сейчас в теме
(1) А нас рать. Тех у кого нет МС офиса.
4. Noy 1079 26.06.09 13:39 Сейчас в теме
(1)+ http://download.microsoft.com/download/9/a/e/9ae639e6-770c-4700-9d96-a057a0875976/SaveAsPDFandXPS.exe
заплатка к МС Офису для сохранения в PDF (меньше мегабайта:)

(0) А вообще "+". Полезная информация - пригодится
Если бы еще и для 7.7...
6. Душелов 4018 26.06.09 14:39 Сейчас в теме
7. Noy 1079 26.06.09 15:01 Сейчас в теме
3. konfed 26.06.09 13:37 Сейчас в теме
>Жаль что этот фрагмент работает только на клиенте.
>На сервере вопрос не решается :-(

т.е не работает какая комбинация :
1) 1С на терминальном сервере - ОО локальный
2) 1С стоит локально база сетевая - ОО локальный
3) 1С стоит локально база сетевая - ОО на терминальном сервере
4) 1С и ОО на терминальном сервере
?

5. Трактор 1254 26.06.09 14:21 Сейчас в теме
(3) Приведённый мной код не будет работать на сервере 1С:Предприятия поскольку:
1. на сервере нельзя сохранить таблицу как XLS файл. И на виндовом и на линуксовом.
2. на linux сервере нет доступа к API других программ.
Вариант базы или терминальность клиента значения не имеет. Важно чтобы PDF создавался на клиенте 1С и на этом же компе стоял Опен офис.

(4) Вот примеры для 7.7 Там решаются другие задачи, но после обработки напильником можно добиться чего пожелаешь.
http://www.forum.mista.ru/topic.php?id=372275
http://infostart.ru/projects/866/
8. I_G_O_R 69 13.11.09 01:08 Сейчас в теме
а еще есть "Bullzip PDF Printer", виртуальный принтер, печатаешь как на обычный, только сохраняется все в файл, уже давно им пользуюсь, даже можно коечто распечатывать и сохранять с возможностью копирования текста, когда стоит запрет на копирование, но нет запрета на печать. Юзайте на здоровье http://www.bullzip.com/
Para_1987; DimaP; Трактор; +3 Ответить
9. DanilaDru 262 24.10.10 01:46 Сейчас в теме
Хороший код. Спасибо. Под тонким клиентом отрабатывает замечательно на стороне сервера. А вот под веб-клиентом вешает платформу. Хотя код вроде как должен на стороне сервера отрабатывать независимо от клиентской части.
10. berserg 11 10.06.11 10:24 Сейчас в теме
А как быть если нужно установить запрем на копирование.
Пытаюсь добавить так:

НастройкиСохранения = Новый COMSafeArray("VT_VARIANT", 2);
PropertyValue = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
PropertyValue.Name = "FilterName";
PropertyValue.Value = "calc_pdf_Export";
НастройкиСохранения.SetValue(0, PropertyValue);

PropertyValue = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
PropertyValue.Name = "FilterData";

МассивПараметра = Новый COMSafeArray("VT_VARIANT", 41);

ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 0, "UseLosslessCompression", 0, false);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 1, "Quality", 0, 90);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 2, "ReduceImageResolution", 0, false);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 3, "MaxImageResolution", 0, 300);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 4, "UseTaggedPDF", 0, false);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 5, "SelectPdfVersion", 0, 0);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 6, "ExportNotes", 0, false);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 7, "ExportBookmarks", 0, true);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 8, "OpenBookmarkLevels", 0, -1);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 9, "UseTransitionEffects", 0, true);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 10, "IsSkipEmptyPages", 0, true);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 11, "IsAddStream", 0, false);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 12, "FormsType", 0, 0);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 13, "ExportFormFields", 0, true);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 14, "HideViewerToolbar", 0, false);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 15, "HideViewerMenubar", 0, false);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 16, "HideViewerWindowControls", 0, false);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 17, "ResizeWindowToInitialPage", 0, false);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 18, "CenterWindow", 0, false);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 19, "OpenInFullScreenMode", 0, false);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 20, "DisplayPDFDocumentTitle", 0, true);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 21, "InitialView", 0, 0);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 22, "Magnification", 0, 0);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 23, "Zoom", 0, 100);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 24, "PageLayout", 0, 0);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 25, "FirstPageOnLeft", 0, false);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 26, "InitialPage", 0, 1);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 27, "Printing", 0, 2);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 28, "Changes", 0, 0);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 29, "EnableCopyingOfContent", 0, false);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 30, "EnableTextAccessForAccessibilityTools", 0, false);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 31, "ExportLinksRelativeFsys", 0, false);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 32, "PDFViewSelection", 0, 0);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 33, "ConvertOOoTargetToPDFTarget", 0, false);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 34, "ExportBookmarksToPDFDestination", 0, false);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 35, "_OkButtonString", 0, "");
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 36, "EncryptFile", 0, false);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 37, "DocumentOpenPassword", 0, "123456789");
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 38, "RestrictPermissions", 0, true);
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 39, "PermissionPassword", 0, "123456789");
ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, 40, "", 0);

PropertyValue.Value = МассивПараметра;
НастройкиСохранения.SetValue(1, PropertyValue);



Процедура ДобавитьВCOMSafeArrayCOMSafeArray(МассивПараметра, Индекс, Первый, Второй, Третий = Неопределено);

Параметр = Новый COMSafeArray("VT_VARIANT", 4);
Параметр.SetValue(0, Первый);
Параметр.SetValue(1, Второй);
Если Третий <> Неопределено Тогда
Параметр.SetValue(2, Третий);
КонецЕсли;
Параметр.SetValue(3, 0);
МассивПараметра.SetValue(Индекс, Параметр);

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



Ошибок нет, но параметры не ставит :(. Подскажите как быть
11. cool.vlad4 2 25.07.11 12:37 Сейчас в теме
Для тех кому нужны ПФ с картинками, с прозрачностью, можно попробовать выставлять в 1С размер картинки - растянуть, затем делать фон либо прозрачным, либо rgb(255,255,255,0) , при сохранении штатными средствами 1С в xls прозрачность, вроде как сохраняется. Затем описанным здесь способом конвертировать в pdf. Параметры печати - надо пробовать настроить макросом. Также под Linux есть такая штука unoconv. Гуглите и пробуйте(поскольку всерьез unoconv еще не использовал, но в двух словах это специальная обертка для OO для различного конвертирования. Только под Linux)
12. Sheremeteva 27.06.12 10:39 Сейчас в теме
Начиная с платформы 8.2.15 PDF сохраняется штатными средствами 1с
13. Трактор 1254 27.06.12 10:43 Сейчас в теме
(12) Публикация старше чем 8.2.15. И суть её не только в конвертации в PDF. А в том как работать с Опен офисом из 1С под Линуксом.
15. Sheremeteva 27.06.12 11:22 Сейчас в теме
(13) да я в курсе возраста публикации. Просто есть люди, которые, как и я прочитают ее сегодня (завтра и далее). Сам же сказал,
Скорей всего найдутся люди для которых это тоже новое, нужное знание.
14. ATverdikov 27.06.12 10:52 Сейчас в теме
Оставьте свое сообщение