Как печатать А4 на формате А5

Автор ForMan, 20 сентября 2019, 14:35

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

ForMan

Доброго времени суток Всем.

Лет 10 назад для печати из 1с в ворд писал такой скрипт:

Option Explicit

dim nCopy
nCopy = WScript.Arguments(0)

call Print_A5(nCopy)

Sub Print_A5(ByVal cCopy) 'Процедура печати открытого документа в формате А5

On Error Resume Next

dim WordObj 'объявление переменных
dim Background
dim Append
dim Range
dim OutputFileName
dim From
dim wTo
dim Item
dim Copies
dim Pages
dim PageType
dim PrintToFile
dim Collate
dim FileName
dim ActivePrinterMacGX
dim ManualDuplexPrint
dim PrintZoomColumn
dim PrintZoomRow
dim PrintZoomPaperWidth
dim PrintZoomPaperHeight


Background=1 'установка значений
Append=0
Range=0
OutputFileName=""
From=""
wTo=""
Item=0
Copies=cCopy
Pages=""
PageType=0
PrintToFile=0
Collate=1
FileName=""
ActivePrinterMacGX="0"
ManualDuplexPrint=0
PrintZoomColumn=0
PrintZoomRow=0
PrintZoomPaperWidth=8390
PrintZoomPaperHeight=11905
WScript.Sleep 2000
'Передача управления приложением MS Word
Set WordObj = GetObject(,"Word.Application")

If Err.Number <> 0 Then 'Если возникла ошибка выдаем сообщение и выходим
WScript.Echo "Error!!!"&Chr(13)&"Application Micrisoft Word is not found."&Chr(13)&Err.Number&Chr(13)&Err.Description
Err.Clear
exit sub
end if

'Печатаем документ
WordObj.PrintOut _
Background, Append, Range, OutputFileName, _
From, wTo, Item, Copies, _
Pages, PageType, PrintToFile, Collate, FileName, _
ActivePrinterMacGX, ManualDuplexPrint, _
PrintZoomColumn, PrintZoomRow, PrintZoomPaperWidth, PrintZoomPaperHeight
If Err.Number <> 0 Then 'Если возникла ошибка выдаем сообщение и выходим

WScript.Echo "Error!!!"&Chr(13)&Err.Number&Chr(13)&Err.Description
Err.Clear
exit sub
end if
WScript.Sleep 2000
WScript.Echo "Print OK"
if WordObj.Documents.Count>1 then
        WordObj.ActiveDocument.Close 0
else
        WordObj.Quit 0
    end if
WScript.Quit 0
End sub



Данный скрипт выводил на печать документ ворд в формате а5
за счет указания параметров печати:
    PrintZoomPaperWidth=8390
    PrintZoomPaperHeight=11905

У меня вопрос:
Как подобное реализовать для Writer?

Заранее СПС.

ForMan

Добрый день снова.

Прошла неделя и никто не ответил.
Обидно.
Хотя просматривало около 100 человек.

Как я понимаю вся сложность в определении этих параметров или свойств в каком-то из классов.
Кто знает в каком классе аналогичные параметры:
(из vbs для Word)
    PrintZoomPaperWidth=8390
    PrintZoomPaperHeight=11905

Как выводить на печать я разобрался.
А вот как печатать по размеру указанной страницы пока нет.


Set OApplication = CreateObject("com.sun.star.ServiceManager")
Set ODesktop = OApplication.createInstance("com.sun.star.frame.Desktop")
set Doc = ODesktop.CurrentComponent

Set PaperSize = OApplication.Bridge_GetStruct("com.sun.star.awt.Size")
PaperSize.Width = 14800
PaperSize.Height = 21000

set prop(0) = MakePropertyValue("CopyCount", 2)
set prop(1) = MakePropertyValue("PaperSize", PaperSize)
Doc.print(prop)



Даже при указанных параметрах
PaperSize.Width = 14800
PaperSize.Height = 21000

Все равно печатает на А4

СПС.

mikekaganski

Метод print() понимает только следующие параметры:

FileName
CopyCount
Collate (или Sort)
Pages
MonitorVisible
Wait
DuplexMode

(см. SfxPrintHelper::print).
Нет здесь ничего, чтобы контролировать масштаб.
С уважением,
Михаил Каганский

rami

Цитата: ForMan от 27 сентября 2019, 16:58Прошла неделя и никто не ответил.
Обидно.
Хотя просматривало около 100 человек.
Здесь форум пользователей, а не служба поддержки. Каждый помогает чем может. Наверно никто из прочитавших с подобным не сталкивался.



Размеры листа устанавливаются в стиле страницы.

bigor

#4
А цель вывода на А5, экономия бумаги? Документы на сколько листов? Может проще с настройками принтера поиграть?

Типа этого
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

mikekaganski

#5
Тривиально можно дополнительно реализовать поддержку параметров

PrinterName
PrintSelectionOnly
PrintRange
PrintContent
PageRange
PrintReverse
PapersizeFromSetup
NUpRows
NUpColumns
NUpPageMarginLeft
NUpPageMarginRight
NUpPageMarginTop
NUpPageMarginBottom
NUpHorizontalSpacing
NUpVerticalSpacing
NUpDrawBorder
NUpSubPageOrder
NUpPaperSize

которые понимет нижележащий код. Но при этом всё, что касается размеров страницы, работает только если NUpRows > 1 или NUpColumns > 1, т.е. при распечатке нескольких страниц на листе (см. Printer::PreparePrintJob).

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

P.S. Используя вызов setPaperSizeFromUser, можно также реализовать дополнительный параметр, чтобы задавать размер бумаги для обычного (не несколько страниц на листе) режима.
С уважением,
Михаил Каганский

ForMan

Добрый день.

Спасибо за Ваши ответы.
Я понимаю что это не служба техподдержки.
И не рассчитывал на быстрые ответы.
Но и не готов мириться с полным игнорированием вопроса.

К вопросу почему А5:
Сам документ выполнен на формате А4 и по ряду причин не может быть переведен на А5.
А печатать его надо на А5.
У документа только 1 страница.

Поскольку Мелкомягкие стали больше внимания уделять вопросам лицензий возникла техническая необходимость перейти на ЛайбрОфис.
А процедура печати запускалась скриптом в фоновом режиме.
Теперь стоит задача переписать скрипт для печати листа А4 по размеру А5.

Ну вот такая краткая предистория.

Теперь к вопросу использования метода setPaperSizeFromUser
А это как и через кудой?? ;))

1) com.sun.star.beans.PropertyValue
2) com.sun.star.awt.Size
3) Doc.Printer = PrinterProperties()

Можно пример?

Спасибо.





mikekaganski

Цитата: ForMan от 30 сентября 2019, 12:04
Но и не готов мириться с полным игнорированием вопроса.

Вы на форуме, где люди, по какой-то странной причине испытывающие удовольствие, помогая другим в своё свободное время, отвечают, когда и если могут. И "не готов мириться" выглядит невежливо в таком случае. Если никто не ответил - значит, не смогли. И "обижаться" и "не мириться" с этим ... нехорошо.

Цитата: ForMan от 30 сентября 2019, 12:04Теперь к вопросу использования метода setPaperSizeFromUser
А это как и через кудой?? )

А это если кто-то решит править код ЛО. В данный момент это не реализовано, и я это написал в качестве подсказки тому, кто решит это реализовать. Но не всё там просто: имеющийся код setPaperSizeFromUser просто центрирует страницу в новом формате, без масштабирования. Так что работы там немало: нужно ещё добавить параметр масштабирования и соответствующую обработку его ...
С уважением,
Михаил Каганский

bigor

Цитата: ForMan от 30 сентября 2019, 12:04Теперь к вопросу использования метода setPaperSizeFromUser

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

ForMan

Цитировать
А это если кто-то решит править код ЛО. В данный момент это не реализовано

Т.е. единственным вариантом на текущий момент остается использование параметров принтера с
параметрами NUpRows > 1 или NUpColumns > 1 и указанием NUpPaperSize
или печати брошюрой

Спасибо.
Буду пробовать.

Относительно принтера - принтер Canon i-sensys mf4140
Вроде поддерживает.
Из Ворда скриптом печатает.
при печати брошюрой из ЛО тоже печатает.

Отдельное спасибо mikekaganski.
mikekaganski - без обид, ничего личного - онли бизнес.
:beer:


bigor

Вы мой вариант рассматривали с настройкой принтера, и в принципе печати без макросов. Ну или  с макросом для выбора нужного принтера
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

economist

Драйверы большинства лазерных принтеров поддерживают быстрое преобразование A4->A5 для формата PS/PCL (из PDF). Стоит попробовать экспортровать в PDF и потом распечатать из-чего то более продвинутого чем Adobe Reader. Например PDFXViewer
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...