макрос сохранения в PDF

Автор makhrov, 17 августа 2016, 12:34

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

makhrov

Добрый день! Помогите, пожалуйста, написать макрос для OppenOffice.

Есть таблица OppenOffice. В ней заполняются ячейки вручную, и есть "кнопка" запускающая макрос.
Хочу чтобы после нажатия на "кнопку" макрос сохранял бы эту таблицу в формате PDF, в ту же папку на компьютере/носителе, где и лежит сама таблица. А имя файла брал из ячейки B2 (к примеру).

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

JohnSUN

Привет, добро пожаловать и всё такое...
Мы тут с товарищами посоветовались и решили не дублировать старые темы. А твои вопросы как раз под определение "старая тема" подпадают.
Глянь вверху слева, на синей панельке ("НАЧАЛО, ПОМОЩЬ, ПОИСК, ПРОФИЛЬ, ЛИЧНЫЕ СООБЩЕНИЯ...") третья кнопка - ПОИСК
Вот буквально только что я с её помощью ввёл почти точное название твоей темы "макрос сохранения PDF" (без буквы "в", чтобы поменьше результатов было) и получил ссылки сюда и сюда
В принципе, этого должно хватить. Если не хватит - переспрашивай (или ищи по форуму)
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

makhrov

#2
Спасибо за ссылки! Вот что вышло:

Sub Main
       ExpOptions = Array(_
                      MkPropVal( "FilterName", "calc_pdf_Export" ),_
                      MkPropVal( "FilterData",  ExpFilterOptions )_
                      )
    Doc = ThisComponent
       URL = Doc.getLocation()
      URL = Doc.getLocation() + ".pdf"
       Doc.storeToURL( URL, ExpOptions )
End Sub

Function MkPropVal( Optional Name As String, Optional Value ) As com.sun.star.beans.PropertyValue
      Dim PropertyValue As New com.sun.star.beans.PropertyValue
      If Not IsMissing( Name ) Then
             PropertyValue.Name = Name
      EndIf
      If Not IsMissing( Value ) Then
             PropertyValue.Value = Value
      EndIf
      MkPropVal() = PropertyValue
End Function


Все бы хорошо, но не понимаю, как сделать:
1) чтобы сохранял не 4 страницы (3 из которых пустые), а одну (первую).
2) сейчас имя PDF повторяет имя файла и выглядит "пример.ods.pdf". как сделать чтобы было  "пример.pdf"?
3) по хорошему, то мне нужно, чтобы имя файла было вида "текст ячейки B2.pdf", а как это сделать вообще не представляю.

(Изменено форматирование кода)


JohnSUN

Цитата: makhrov от 17 августа 2016, 15:27
не понимаю, как сделать:
1) чтобы сохранял не 4 страницы (3 из которых пустые), а одну (первую).
Достаточно задать нужную область печати (Формат - Диапазоны печати) или в свойствах офиса поставить одну "галочку" (см. картинку)
Цитата: makhrov от 17 августа 2016, 15:27
2) сейчас имя PDF повторяет имя файла и выглядит "пример.ods.pdf". как сделать чтобы было  "пример.pdf"?
Ты имеешь в виду "На что заменить две строчки с URL ="?
Можно, например, так (вторая из них):
URL = Left(URL,Length(URL)-3)+"pdf"
Но эта конструкция может взглюкнуть, если старое расширение было, например, .xlsx (четыре буквы вместо трёх ожидавшихся)
Поэтому лучше что-то вроде
aURL = Split(URL,".")
aURL(UBound(aURL)) = "pdf"
URL = Join(aURL,".")
То есть, развалить строку на массив строк по разделителю "точка", заменить самый последний элемент этого массива на "pdf" и опять склеить в одну строку. В этом случае нас не волнует, какое было расширение раньше и сколько точек попалось в пути-имени файла.
Цитата: makhrov от 17 августа 2016, 15:27
3) по хорошему, то мне нужно, чтобы имя файла было вида "текст ячейки B2.pdf", а как это сделать вообще не представляю.
А путь к папке в B2 тоже прописан?
Получить значение из B2 достаточно просто. Но еще проще спросить путь-имя сохраняемого файла в стандартном диалоге прямо перед экспортом.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

makhrov

JohnSUN Спасибо вам большое. Но не могли бы вы чуть подробнее писать? Я в программировании полный ноль (.

1) Если я пишу макрос "записью", а не руками, то там при выборе экспорта PDF действительно есть выбор страниц сохраняемых. А как это прописать не пойму.
2) С именем файла вообще ничего не вышло, выдает ошибки. (см. картинки).
3) Нет в ячейке B2 есть текст (например "имя"). Вот мне нужно чтобы имя для файла PDF бралось оттуда (эту ячейку перед сохранением будут менять). И выглядел бы фал в итог "имя.pfd".
4) Так как файл будет только ods. То никакие другие расширения не возможны. Планировалась, что я открываю эту таблицу. Меняю на 1 листе значения в ячейках, в то числе и в ячейке B2. Нажимаю кнопку (которая запускает макрос). И все, в папке где лежит файл таблицы появляется файл PDF с измененными данными таблицы и с именем из B2. Так как этот файл буду менять не только я, то не хотелось бы решать сохранение одной страницы через настройки и свойства офиса.

JohnSUN

Ну, в первом случае пропустил слово Left (это функция такая, должна была взять из URL левые, первые символы)
А во втором случае зря закомментировал первую строку, где получаешь URL текущего документа
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

makhrov

С первым вариантом пропущенная функция не виновата. (см. рисунок)
Со вторым вариантом , да, согласен. Получается! Уже глаза не видят. Это позволяет сохранить файл в папке таблицы, но и с именем таблицы, а не из ячейки.
И как в макросе прописать чтобы в PDF конвертировалось только первая страница? Может кто-нибудь знает?

rami

Цитата: makhrov от 17 августа 2016, 15:33С первым вариантом пропущенная функция не виновата. (см. рисунок)
Замените Length на Len

makhrov

Спасибо rami! А вы не знаете, как имя файла сделать из текста в ячейке, и чтобы не записывались в файл пустые страницы?

rami

Цитата: makhrov от 17 августа 2016, 16:06как имя файла сделать из текста в ячейке
Попробуйте так:
Sub main
sNameFile=ThisComponent.Sheets(0).getCellRangeByName("B2").String
URL=ThisComponent.Location
aURL=Split(URL,GetPathSeparator())
aURL(UBound(aURL))=sNameFile & ".pdf"
NewURL=Join(aURL,GetPathSeparator()) 'новое имя файла в той же папке
End Sub

rami

Цитата: makhrov от 17 августа 2016, 16:06и чтобы не записывались в файл пустые страницы?
А такой макрос вас не испугает :o
Sub ImportToPDF Dim doc As Object, disp As Object, NewURL$, URL$, aURL()
doc=ThisComponent.CurrentController.Frame
disp=createUnoService("com.sun.star.frame.DispatchHelper")
sNameFile=ThisComponent.Sheets(0).getCellRangeByName("B2").String
URL=ThisComponent.Location
aURL=Split(URL,GetPathSeparator())
aURL(UBound(aURL))=sNameFile & ".pdf"
NewURL=Join(aURL,GetPathSeparator()) 'новое имя файла в той же папке
Dim args1(2) As new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(0).Value=NewURL
args1(1).Name = "FilterName"
args1(1).Value = "calc_pdf_Export"
args1(2).Name = "FilterData"
args1(2).Value = Array(Array("UseLosslessCompression",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("Quality",0,90,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("ReduceImageResolution",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("MaxImageResolution",0,300,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("UseTaggedPDF",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("SelectPdfVersion",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("ExportNotes",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("ViewPDFAfterExport",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("ExportBookmarks",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("OpenBookmarkLevels",0,-1,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("UseTransitionEffects",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("IsSkipEmptyPages",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("IsAddStream",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("FormsType",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("ExportFormFields",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("AllowDuplicateFieldNames",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("HideViewerToolbar",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("HideViewerMenubar",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("HideViewerWindowControls",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("ResizeWindowToInitialPage",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("CenterWindow",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("OpenInFullScreenMode",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("DisplayPDFDocumentTitle",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("InitialView",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("Magnification",0,3,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("Zoom",0,100,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("PageLayout",0,2,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("FirstPageOnLeft",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("InitialPage",0,1,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("Printing",0,2,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("Changes",0,4,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("EnableCopyingOfContent",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("EnableTextAccessForAccessibilityTools",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("ExportLinksRelativeFsys",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("PDFViewSelection",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("ConvertOOoTargetToPDFTarget",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("ExportBookmarksToPDFDestination",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("SignPDF",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("_OkButtonString",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("Watermark",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("EncryptFile",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("PreparedPasswords",0,,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("RestrictPermissions",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("PreparedPermissionPassword",0,Array(),com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("SignatureLocation",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("SignatureReason",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("SignatureContactInfo",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("SignaturePassword",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("SignatureCertificate",0,,com.sun.star.beans.PropertyState.DIRECT_VALUE),_
Array("",0,,com.sun.star.beans.PropertyState.DIRECT_VALUE))
disp.executeDispatch(doc,".uno:ExportToPDF", "", 0, args1())
End Sub

JohnSUN

Раз уж ты поправил мой Len() - глубокое мерси! - то и я чуток с правками влезу. Этот кусочек
Цитата: rami от 17 августа 2016, 17:05URL=ThisComponent.Location
aURL=Split(URL,GetPathSeparator())
aURL(UBound(aURL))=sNameFile & ".pdf"
NewURL=Join(aURL,GetPathSeparator())
может не сработать. Ты то на Маке этого и не заметишь, а под Windows может сразу вылезти. Location идет сразу в URL-нотации и сепаратор обычный слэш - под Linux и у тебя GetPathSeparator() его и возвращает. А для Windows GetPathSeparator() вернет бэк-слэш, которого в строке URL и близко нет...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

rami

Цитата: JohnSUN от 17 августа 2016, 18:15А для Windows GetPathSeparator() вернет бэк-слэш, которого в строке URL и близко нет...
Тогда второй GetPathSeparator() заменить на слэш?

JohnSUN

Нет, проще оба заменить. И пишется "/" короче, и надежно будет. Кроссплатформенно.
Если первый оставить, то Split() вернет всю строку в единственной ячейке массива - её-то мы на sNameFile & ".pdf" и заменим.
Файл нормально сохранится в PDF, но вот по какому пути - заранее не угадаешь...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

makhrov

#14
Спасибо вам огромное JohnSUN и rami!
GetPathSeparator() действительно пришлось заменить на "/", иначе выдает ошибку.
Все работает как и хотелось. Но сохраняет по прежнему 4 страницы. Видимо, потому что у меня правее первой страницы (с F по S) есть не пустые ячейки с текстом и формулами. Я не хотел чтобы эта тех. информация выводилась в PDF. Поэтому эти столбцы (с F по S) скрыл. Если я пишу макрос экспорта действиями и указываю в диалоговом окне, что выводить только первую страницу, все хорошо. Но только при этом первом разе. Потом когда исполняю записанный макрос, опять выводит все 4 страницы.