Экспорт в PDF. Получить документ черно-белый или оттенки серого. [Решено]

Автор bigor, 24 октября 2022, 14:30

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

bigor

Всем привет.
Нужно из writer или draw экспортировать документ в pdf формат, но pdf должен быть или черно-белым, или в оттенках серого. Первоначальный документ содержит раскрашенный текст, ссылки, цветные картинки. В параметрах экспорта ничего похожего не нашел, но вдруг пропустил :) Пока решил через печать на pdf принтере, но хочется это повесить на макросы, а управлять именами файлов через pdf принтер не получается :(
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

sokol92

Для картинок можно временно изменить свойство GraphicColorMode у графических объектов документа.
' Меняет значение свойства GraphicColorMode у всех графических объектов drawPage
Sub ChangeGraphicColorMode(ByVal drawPage, ByVal newColorMode As Long)
  Dim oGraphic
 
  For Each oGraphic In drawPage
    If oGraphic.supportsService("com.sun.star.text.TextGraphicObject") Or _
       oGraphic.supportsService("com.sun.star.drawing.GraphicObjectShape") Then
      oGraphic.GraphicColorMode=newColorMode
    End If 
  Next oGraphic
End Sub

' Меняем значение свойства GraphicColorMode на GrayScale
Sub ChangeToGrayScale
  ChangeGraphicColorMode ThisComponent.DrawPage, com.sun.star.drawing.ColorMode.GREYS      ' текстовый документ
  'ChangeGraphicColorMode ThisComponent.DrawPages(0), com.sun.star.drawing.ColorMode.GREYS ' первый слайд презентации
End Sub

Пробовал на книге А.Питоньяка - меняет мгновенно.
Владимир.

bigor

Спасибо, с картинками вопрос решен. С ссылками думал изменить стиль, но что-то пошло не так :( Прикладываю пример, после изменения стиля, нужно на ссылке щелкнуть Ctrl+M, иначе изменение не применяется.
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

mikekaganski

Для ссылок по умолчанию (т.е. если Вы не применяли стили символа) применяются цвета из настроек. Их можно настроить для профиля, который Вы используете для конвертации, либо изменить прямо из макроса ("Links" и "LinksVisited" внутри org.openoffice.Office.UI:ColorScheme['ИмяАктивнойСхемы']).
С уважением,
Михаил Каганский

sokol92

Возможная альтернатива (?) - пробежаться по гиперссылкам документа и прямым форматированием убрать подчеркивание и выставить автоматический цвет шрифта.
Владимир.

sokol92

Вот еще вариант, довольно эффективный (на примере текстового документа):

Sub RemoveHyperLinkStyle
  Dim oDoc, oTextRange
  oDoc=ThisComponent
  oDoc.CurrentController.Select oDoc.Text
  oTextRange=oDoc.getCurrentSelection.getByIndex(0)
  With oTextRange
    ' Mri oTextRange
    .UnvisitedCharStyleName=""
    .VisitedCharStyleName=""
  End With
End Sub

Идея - "забываем", какими стилями надо показывать гиперссылки.
Владимир.

bigor

Цитата: sokol92 от 24 октября 2022, 20:20Вот еще вариант
не сработало на приложенном в #2 файле и изменения в параметрах, согласно #3, тоже не срабатывют
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

kompilainenn

У нас где то была настройка "Печатать черно белым, даже если есть цвет в документе", интересно, она на экспорт в ПДФ не влияет?
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

bigor

Цитата: kompilainenn от 24 октября 2022, 21:24"Печатать черно белым, даже если есть цвет в документе"
во Writer нашел "Печатать текст черным", но на экспорт не влияет. Пока решил способом из #4 прямое форматирование в черный
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

kompilainenn

#9
Сервис-Параметры-LibreOffice-Печать -> Конвертировать цвет в оттенки серого

Не влияет на экспорт в ПДФ, а жаль.
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

mikekaganski

Цитата: kompilainenn от 25 октября 2022, 11:06Сервис-Параметры-LibreOffice-Печать -> Конвертировать цвет в оттенки серого

Действительно не влияет...

Однако:
1. Обратите внимание, что вверху этой страницы диалога настроек есть радиокнопки "Printer" / "Print to file", и эти радиокнопки переключаются между двумя наборами настроек (то есть это как если бы вместо радиокнопок были две отдельные страницы - отдельно для принтера, отдельно для печати в файл). Баг 135410.
2. Если Вы настроите печать в файл на оттенки серого, то Вы сможете использовать эту опцию (и я не уверен, есть ли возможность в скрипте настроить имя файла - это не PDF-принтер, так что всё может быть)...
3. И тогда Вы можете преобразовать результат в PDF, например с помощью GhostScript:

gswin64c.exe -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=D:\Documents\text_formula_chart_grey.pdf D:\Documents\text_formula_chart_grey.prn
Кстати, обратите внимание, что на Windows генерируется не файл PS, а файл PRN, содержащий PostScript, и корректно обрабатываемый GhostScript.
С уважением,
Михаил Каганский

kompilainenn

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

sokol92

Владимир.

bigor

Цитата: sokol92 от 25 октября 2022, 15:02Опция FileName метода Print.
я пробовал этот вариант, но у меня не взлетел. Вот кусок кода, как я это пытался сделать
sPrinter = "Печатать в файл..." ' виртуальный принтер

oPrinter = oDoc.getPrinter()
For i = LBound(oPrinter) to UBound(oPrinter)
  If oPrinter(i).Name = "Name" Then
    oPrinter(i).Value = sPrinter
  End If
Next i

oDoc.setPrinter(oPrinter)


oOpts(1).Name = "Pages"
oOpts(1).Value = 1
oOpts(2).Name = "Wait"
oOpts(2).Value = True
oOpts(3).Name = "FileName"
oOpts(3).Value = "D:\PU\555\Test1.prn"
oDoc.Print(oOpts())
возвращает пустой файл Test1.prn Вернул prn, но они не нравятся gswin32c.exe, gswin32c.exe -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=D:\PU\555\Itog.pdf D:\PU\555\Test1.prn ругается СнимокErr.PNG
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

sokol92

Можно так:
Sub Test
  Dim oDoc
  Dim oOpts(2) As New com.sun.star.beans.PropertyValue
  oDoc=ThisComponent
  oOpts(0).Name = "FileName"
  oOpts(0).Value = ConvertToUrl("C:\Temp\Test1.prn")
  oOpts(1).Name = "Wait"
  oOpts(1).Value = True
  oOpts(2).Name = "Pages"
  oOpts(2).Value = "1"
  oDoc.Print oOpts
End Sub
Владимир.