Помогите дописать макрос экспорта всех страниц LibreOffice в PNG

Автор PyGreen, 11 апреля 2019, 11:46

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

PyGreen

Доброго времени суток, Уважаемые форумчане!

Прошу помочь закончить скрипт. Сделал такой набросок скрипта.

Макрос делает экспорт текущей страницы (листа) в png-файл с разрешением 1800х2544 px.

Какие необходимо сделать правки, чтобы данный макрос мог сделать постранично экспорт
всех страниц документа в png-картинки?




sub Main
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(3) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(0).Value = "file:///D:/output/libre2png/name2.png"
args1(1).Name = "FilterName"
args1(1).Value = "writer_png_Export"
args1(2).Name = "FilterData"
args1(2).Value = Array(Array("PixelWidth",0,1800,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("PixelHeight",0,2544,com.sun.star.beans.PropertyState.DIRECT_VALUE))
args1(3).Name = "SelectionOnly"
args1(3).Value = false

dispatcher.executeDispatch(document, ".uno:ExportTo", "", 0, args1())

end sub

bigor

#1
В названии темы
Цитироватьмакрос экспорта всех страниц LibreOffice в PDF
, а далее
Цитироватьчтобы данный макрос мог сделать постранично экспорт всех страниц документа в png-картинки?

а что нужно?

туплю :) Если в png, то поработайте с поиском -  здесь была похожая тема, там расширение писали по выгрузке картинок из draw кажется.

А из чего конкретно Calc, Writer?
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

PyGreen

для Draw нужен, и для Writer тоже понадбится скоро.. с поиском работаю, чёт ничего не даёт (да и нужен макрос, а не расширение)

PyGreen

#3
вот вроде нашёл инструкции Array("PageRange",0,"2",com.sun.star.beans.PropertyState.DIRECT_VALUE)
теперь надо разобраться как правильно приспособить. Число «2» указывает на номер экспортируемой страницы. Как теперь посчитать все и сделать цикл?

bigor

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

kompilainenn

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

bigor

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

PyGreen

#7
Цитата: Bigor от 11 апреля 2019, 12:47Вариант выгрузить все в pdf, а потом разобрать его на картинки не рассматривается?
мне нужно из PDF файла сделать PNG страницы

Цитата: Bigor от 11 апреля 2019, 16:02Вот тема, про которую я выше писал Посмотрите, там частично потерта, но я думаю, у старожилов где-то все сохранено Улыбка
хорошая статья.. только пока не могу понять почему код не работает..
запускаю «ExportAsImage» > Выбираю каталог (в именах только латиница) > появляется сообщение «Images exported» - но в каталоге пусто

я вообще верно скопировал
dim doc
dim exportPath
dim exportName
dim slideNum
dim docDir
dim docName
dim ocontrol
dim oFolderPickerDlg
dim cPickedFolder
dim lastPageNumber
dim formatString
dim decimalRep
dim oPropertyValue

Sub ExportAsImage
   dim i
   dim slide
      doc=thiscomponent
      ocontrol=doc.getcurrentcontroller()
      exportPath = InputBox("Path to export to?")  ' #VAR OR THIS
   
   DocumentFileNames 'returns current path and the current file name
   
   '  exportPath = PickFolderSpecific ( docDir )    ' #VAR OR THIS
      if exportPath="" then Exit Sub
   
      exportName = InputBox("Пожалуйста, подтвердите или измените основу имени экспортируемых изображений. Числа будут добавлены автоматически:", "Base Name For Exported Images", docName)
      If exportName="" then Exit Sub
     
      lastPageNumber = doc.getdrawpages().count - 1
      formatString = Zeroes(numDigitsIn(lastPageNumber+1)) 'Format string for zero-padding
      for i = 0 to lastPageNumber
         slideNum = Format(i+1, formatString) 'Zero pad slide number
         slide=doc.drawpages(i)
         ExportShape(slide)
      next i
   Msgbox "Images exported!", 64 ,"Info"
end sub

Sub ExportShape(oShape as Any)
Dim Dl As Double
Dl = oShape.Height/oShape.Width
oShape
'http://www.oooforum.org/forum/viewtopic.phtml?t=51021
'inspired by http://codesnippets.services.openoffice.org/Office/Office.GraphicExport.snip

'creating filter data
Dim aFilterData (7) as new com.sun.star.beans.PropertyValue
'properties valid for all filters
aFilterData(0).Name  = "PixelWidth"        '
aFilterData(0).Value = 2000
aFilterData(1).Name  = "PixelHeight"
aFilterData(1).Value = 2000*Dl

'filter data for the image/jpeg MediaType
'aFilterData(2).Name  ="Quality"
'aFilterData(2).Value = 85 'Quality: 1-100, 100 is best quality / lowest compression
'aFilterData(3).Name  ="ColorMode"
'aFilterData(3).Value = 0' Color; 1 - Grayscale

'filter data for the image/png MediaType
aFilterData(2).Name  ="Compression"
aFilterData(2).Value = 9
aFilterData(3).Name  ="Interlaced"
aFilterData(3).Value = 0

'filter data for the image/gif MediaType
'aFilterData(2).Name  ="Translucent"
'aFilterData(2).Value = true
'aFilterData(3).Name  ="Interlaced"
'aFilterData(3).Value = 0

'filter data for the image/bmp MediaType
'aFilterData(2).Name  ="Color"
'aFilterData(2).Value = 7
'aFilterData(3).Name  ="ExportMode"
'aFilterData(3).Value = 0
'aFilterData(4).Name  ="Resolution"
'aFilterData(4).Value = 300
'aFilterData(5).Name  ="RLE_Coding"
'aFilterData(5).Value = true
'aFilterData(6).Name  ="LogicalWidth"
'aFilterData(6).Value = 2000
'aFilterData(7).Name  ="LogicalHeight"
'aFilterData(7).Value = 2000*Dl

Dim sFileUrl As String
sFileUrl = ConvertToURL( exportPath + exportName + " - " + slideNum + ".png"

Dim aArgs (2) as new com.sun.star.beans.PropertyValue

aArgs(0).Name  = "MediaType"
aArgs(0).Value = "image/png" 'image/gif , image/png ... see http://www.oooforum.org/forum/viewtopic.phtml?t=51021
aArgs(1).Name  = "URL"
aArgs(1).Value = sFileUrl
aArgs(2).Name  = "FilterData"
aArgs(2).Value = aFilterData()

Dim xExporter
xExporter = createUnoService( "com.sun.star.drawing.GraphicExportFilter" )
xExporter.setSourceDocument( oShape )

xExporter.filter( aArgs() )
End Sub

Function PickFolderSpecific( docDir ) as string
   oFolderPickerDlg = createUnoService( "com.sun.star.ui.dialogs.OfficeFolderPicker" )
'   oFolderPickerDlg = createUnoService( "com.sun.star.ui.dialogs.FolderPicker" )
   'oFolderPickerDlg = createUnoService( "com.sun.star.ui.dialogs.SystemFolderPicker" )
   If docDir<>"" Then
      oFolderPickerDlg.setDisplayDirectory( ConvertToURL(docDir) ) Rem... Broken. Does not work with system folder picker.
   End If

   If oFolderPickerDlg.execute()=1 then
      cPickedFolder = oFolderPickerDlg.getDirectory()
      PickFolderSpecific = ConvertFromURL( cPickedFolder )
   Endif
End Function

'Returns the minimum number of decimal digits required to represent a given integer
function NumDigitsIn(num as Integer) as Integer
   decimalRep = cstr(num)
   NumDigitsIn = Len(decimalRep)
end function

'Returns the a string consisting of the given number of zeros
function Zeroes(num as Integer) as String
   dim result as String
   dim i as Integer
   result = ""
   for i = 1 to num
      result = result & "0"
   next i
   Zeroes = result
end function

REM Author: Andrew Pitonyak
Sub DocumentFileNames
   ' Dim Doc
   Dim sDocURL
   Doc = ThisComponent
   If (Not GlobalScope.BasicLibraries.isLibraryLoaded("Tools")) Then
      GlobalScope.BasicLibraries.LoadLibrary("Tools")
   End If
   Dim sDocPath As String
   If (Doc.hasLocation()) Then
      sDocPath = ConvertFromURL(Doc.URL)
      Dim sep As String
      sep = getPathSeparator()
      'if sDocPath="" then sDocPath=createUnoService("com.sun.star.util.PathSettings").Work
   '   Print "Document Directory = " & DirectoryNameoutofPath(sDocURL, "/")
   '   Print "Document File Name = " & FileNameoutofPath(sDocURL, "/")
   docDir = DirectoryNameoutofPath(sDocPath, sep)
   'docName = FileNameoutofPath(sDocURL, "/")
   docName = GetFileNameWithoutExtension(sDocPath, sep)
   End If
End Sub

PyGreen

закомментил строку: ' exportPath = PickFolderSpecific ( docDir ) и расскоментил:exportPath = InputBox("Path to export to?")
и дело пошло.. данные строки где-то в районе с 20ую по 30ую

bigor

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

mikekaganski

С уважением,
Михаил Каганский

PyGreen

это да.. но хотелось бы с помощью уже установленного софта..

mikekaganski

Цитата: PyGreen от 11 апреля 2019, 19:28установленного
Portable?

Делать конвертацию из PDF в PNG с помощью LO и большой головной боли в виде макросов вместо пятнадцатиминутной подготовки в виде скачивания и распаковки IM + написания команды ... тоже весело.
С уважением,
Михаил Каганский

bigor

Ещё разрешение, читал, что при выгрузке из LO всегда 96 dpi
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

PyGreen

ну если заморочек будет много, то прийдётся.. с другой стороны не хотелось бы прыгать с велосипеда на велосипед, если есть такая возможность.. т.к перевод из pdf в png бывает, но не так чтобы постоянно...