[oodisc] Печать страниц в установленном порядке.

Владислав Орлов software на pro-za.com.ua
Ср Мар 23 19:54:46 MSK 2005


В сообщении от Вторник, 22-Мар-2005 16:05 Сергей Александрович Лядов написал:
> А в ООо печать брошюр строенная. Думаю если ее немного изменить для
> печати книг и довести до заинтересованных, то они выкинут World и без
> вопросов перейдут на ООо.
Давай, Сергей Александрович, поступим так: я подарю сообществу 60 строчек 
макроса, а ты через месяц отрапортуешь о массовом переводе толпы 
заинтересованных на ООо :-)

А строки простые:

rem Author: Vladislav Orlov aka JohnSUN, 23.05.2005
rem email:   software на pro-za.com.ua 
Sub PrintCurrentDocToBooklet
rem Процедура выводит на печать часть документа "от сих до сих", 
rem нарезая его постранично на заданное количество листов
rem Опишем переменные
Dim document As object, dispatcher As object
Dim iStartPage As Long, iFinishPage As Long, iCountPage As Long
Dim sTemp As String, i As Long, iRez As Integer

rem Получим доступ к текущему документу.
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

iRez = MsgBox("Убедитесь, что выставлены параметры принтера по умолчанию, 
соответствующие печати брошюры!"  +  Chr(13) +  Chr(13) _
	 + "(Двухстороння печать, ориентация бумаги и т.п.)", 1+64, "Проверьте 
настройки печати!")
If iRez <> 1 Then Exit Sub
rem Подразумевается, что пользователь знает о принтере по умолчанию и о его 
параметрах

rem Вместо следующих InputBox можно было бы и формочку с полями наваять, но 
некогда...
sTemp = InputBox ("Печать начать со страницы", "Ввод параметров печати 
брошюры", "1") 
If Trim(sTemp) = "" Then Exit Sub
iStartPage = Val(sTemp)
sTemp = Trim( Str (ThisComponent.CurrentController.getViewCursor().getPage()))
sTemp = InputBox ("Печать закончить на странице", "Ввод параметров печати 
брошюры", sTemp) 
If Trim(sTemp) = "" Then Exit Sub
iFinishPage = Val(sTemp)
rem Вообще-то речь шла о 7 листах в тетради, но я по умолчанию 
rem поставил 6 - чтобы совсем слабеньким степлером пробить можно было
sTemp = InputBox ("Из скольких листов формировать тетради", "Ввод параметров 
печати брошюры", "6") 
If Trim(sTemp) = "" Then Exit Sub
iCountPage = Val(sTemp)
iRez = MsgBox("Убедитесь, что во вкладке ""Текстовый документ -> Печать"" " + 
_
	 "выставлены все нужные для печати брошюры параметры!"  +  Chr(13) +  Chr(13) 
+  _
	 "(Окно параметров откроется после закрытия этого сообщения)", 1+64, 
"Проверьте настройки печати!")
If iRez <> 1 Then Exit Sub
rem Пообещали окно параметров? Нужно открыть...
dispatcher.executeDispatch(document, ".uno:OptionsTreeDialog", "", 0, Array())

rem Ну, и собссно печать
Dim args2(2) as new com.sun.star.beans.PropertyValue

sTemp = " "
For i = iStartPage To iFinishPage
rem  Муторно, конечно, через точку с запятой... 
rem  Но у меня так и не получилось печатать диапазон через тире - печать 
запускалась с нужного листа и до конца документа...
	sTemp = sTemp + Str(i) + "; " 
	If ((((i-iStartPage+1) mod (iCountPage*4) ) = 0) Or (i = iFinishPage)) Then
		args2(0).Name = "Copies"
		args2(0).Value = 1
		args2(1).Name = "Pages"
		args2(1).Value = sTemp
		args2(2).Name = "RangeText"
		args2(2).Value = sTemp
rem Следующие две строки можно закомментарить или выбросить, чтобы не давить 
ОК
rem Но лучше оставить - в случае печати БОЛЬШОГО документа на общем принтере,
rem можно притормозить и пропустить кого-нибудь без очереди		
		iRez = MsgBox("Печатаем страницы " + args2(1).Value, 1+48, "Идет печать")
		If iRez <> 1 Then Exit Sub
		ThisComponent.Print(args2())
	rem  Или более правильный вариант - dispatcher.executeDispatch(document, 
".uno:Print", "", 0, args2())
		sTemp = " "
	End If
Next i
rem  Ну и телемаркет...
End Sub

-- 
Всего доброго!
Владислав Орлов aka JohnSUN


Подробная информация о списке рассылки Oo-discuss