gifts2017

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

Опубликовал Трактор Трактор (Трактор) в раздел Программирование - Практика программирования

Возникла задача отправлять счета почтой. 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. Евгений Мартыненков (JohnyDeath) 26.06.09 12:18
SP 2 для Office 2007 теперь умеет сохранять в PDF, а также открывать/сохранять файлы OO.
Это я так, к слову ;)
2. Трактор Трактор (Трактор) 26.06.09 12:41
(1) А нас рать. Тех у кого нет МС офиса.
3. Konstantin _Konstantin (konfed) 26.06.09 13:37
>Жаль что этот фрагмент работает только на клиенте.
>На сервере вопрос не решается :-(

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

4. Алексей Плутенко (Noy) 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...
5. Трактор Трактор (Трактор) 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/
6. dushelov (Душелов) 26.06.09 14:39
7. Алексей Плутенко (Noy) 26.06.09 15:01
8. Игорь <...> (I_G_O_R) 13.11.09 01:08
а еще есть "Bullzip PDF Printer", виртуальный принтер, печатаешь как на обычный, только сохраняется все в файл, уже давно им пользуюсь, даже можно коечто распечатывать и сохранять с возможностью копирования текста, когда стоит запрет на копирование, но нет запрета на печать. Юзайте на здоровье http://www.bullzip.com/
Para_1987; DimaP; Трактор; +3 Ответить
9. Андрей Данилюк (DanilaDru) 24.10.10 01:46
Хороший код. Спасибо. Под тонким клиентом отрабатывает замечательно на стороне сервера. А вот под веб-клиентом вешает платформу. Хотя код вроде как должен на стороне сервера отрабатывать независимо от клиентской части.
10. Сергей (berserg) 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) 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. Трактор Трактор (Трактор) 27.06.12 10:43
(12) Публикация старше чем 8.2.15. И суть её не только в конвертации в PDF. А в том как работать с Опен офисом из 1С под Линуксом.
14. Александр Твердиков (ATverdikov) 27.06.12 10:52
15. Валентина Шереметьева (Sheremeteva) 27.06.12 11:22
(13) Трактор, да я в курсе возраста публикации. Просто есть люди, которые, как и я прочитают ее сегодня (завтра и далее). Сам же сказал,
Скорей всего найдутся люди для которых это тоже новое, нужное знание.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа