Смена ориентации страницы

Автор TanaTiX, 18 августа 2022, 23:14

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

TanaTiX

Как программно реализовать смену ориентации страницы (partrait/landscape)?

eeigor

Printer PaperOrientation option
com.sun.star.view.PaperOrientation.PORTRAIT
См. A.Pytonyak, глава 13
Ubuntu 18.04 LTS • LibreOffice 7.3.5.2 Community

TanaTiX

Скопировал такой код:
Sub PrinterNext
Dim Props(0 To 1) As New com.sun.star.beans.PropertyValue
rem  Props(0).Name = "PageColumns" : Props(0).Value = 1
Props(1).Name = "IsLandscape" : Props(1).Value = True
If HasUnoInterfaces(ThisComponent, "com.sun.star.text.XPagePrintable") Then
ThisComponent.setPagePrintSettings(Props()) '
ThisComponent.printPages(Array()) 'Use default properties
Else
Print "Sorry, this document does not support the XPagePrintable interface"
End If
End Sub

В результате получаю
ЦитироватьSorry, this document does not support the XPagePrintable interface
Т.е. объект не является интерфейсом XPagePrintable, верно?
Но у меня обычная страница в Calc. Что не так?

mikekaganski

Цитата: TanaTiX от 19 августа 2022, 11:20Что не так?

Для начала - "не так" сформулирована задача. Нигде не звучал Calc, пока Вы не упомянули об этом в #2 ;)

https://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1text_1_1XPagePrintable.html показывает, что от XPagePrintable происходят разные типы текстовых документов, а не таблиц.

Да и определить нужно, что именно Вы меняете: форматирование (листов) документа или настройки печати.
С уважением,
Михаил Каганский

TanaTiX

Мне нужно на лету определять печать в альбомном или портретном режиме для Calc. Если принтер поддерживает - также на лету определять 1-страничная или 2-страничная печать. Та часть, что "на лету", надеюсь, разберусь сам. А вот собственно печать в нужном виде - это проблема.

P.S. в соседней теме похожая задача но для Writer, сейчас там отпишусь

TanaTiX

Кажись нащупал верный путь
Sub FinalPrint
Dim s$ 'Style name
Dim oStyle 'The current page style
s = ThisComponent.CurrentController.getActiveSheet().PageStyle
oStyle = ThisComponent.StyleFamilies.getByName("PageStyles").getByName(s)
oStyle.IsLandscape = false
msgbox oStyle.IsLandscape
ThisComponent.Print(Array())
End Sub

sokol92

Цитата: TanaTiX от 19 августа 2022, 11:30А вот собственно печать в нужном виде - это проблема.
Методу print в качестве параметра можно передать массив свойств печати.
Владимир.

TanaTiX

Задача решена и повешена на хоткей ))
Sub FastPrinter
GlobalScope.BasicLibraries.loadLibrary("ScriptForge")

Dim s$ 'Style name
Dim oStyle 'The current page style
Dim oDoc As Object
Dim sheetsForLandscapePrint() As String: sheetsForLandscapePrint = Array("Стр1", "Стр2")
Dim sheetsForPortraitPrint() As String: sheetsForPortraitPrint = Array("Sheet1", "Sheet2", "Sheet3") rem названия изменены )))
Dim IsContainLandscape As Variant
Dim IsContainPortrait As Variant
Dim currentSheetName as String

oDoc = ThisComponent
currentSheetName = oDoc.getCurrentController.ActiveSheet.Name
s = oDoc.CurrentController.getActiveSheet().PageStyle
oStyle = ThisComponent.StyleFamilies.getByName("PageStyles").getByName(s)

IsContainLandscape = CompareArr(currentSheetName, sheetsForLandscapePrint)
IsContainPortrait = CompareArr(currentSheetName, sheetsForPortraitPrint)
If IsContainLandscape = True Then
oStyle.IsLandscape = True
Else
If IsContainPortrait = True Then
oStyle.IsLandscape = False
EndIf
EndIf

If IsContainLandscape = True Or IsContainPortrait = True Then 'printing without dialog
oDoc.Print(Array())
Else 'printing with dialog
Dim Dispatcher As Object
Dispatcher = createUNOService("com.sun.star.frame.DispatchHelper")
Dispatcher.executeDispatch(ThisComponent.CurrentController.Frame,".uno:Print", "", 0, Array())
EndIf

End Sub


Спасибо.