如何一次性将所有 LibreOffice Writer 页面导出为图像?

如何一次性将所有 LibreOffice Writer 页面导出为图像?

我生成了一封 300 页的连载信。每页都不同,每页都包含表情符号。由于 LibreOffice 中的一个错误,表情符号不会显示在导出的 pdf 中:https://bugs.documentfoundation.org/show_bug.cgi?id=129523

LibreOffice Writer 提供将单页导出为图像的功能。在这种情况下,表情符号会呈现。我的问题是,如何一次性将所有 300 页导出为 300 张图片?

我正在使用以下版本的 LibreOffice:

Version: 7.4.0.3 / LibreOffice Community
Build ID: 40(Build:3)
CPU threads: 8; OS: Linux 5.19; UI render: default; VCL: gtk3
Locale: en-US (en_US.UTF-8); UI: en-US
7.4.0-3
Calc: threaded

答案1

执行此任务的最简单的宏如下所示:

Sub StoreEachPageToPNG()
Dim oDoc As Variant, oViewCursor As Variant
Dim iPageCount As Long, iPage As Long 
Dim sOriginalURL As String, sFileURL As String 
Dim Args(1) as New com.sun.star.beans.PropertyValue
    Args(0).Name = "FilterName"
    Args(0).Value = "writer_png_Export"

    oDoc = ThisComponent
    iPageCount = oDoc.getCurrentController().PageCount
    oViewCursor = oDoc.getCurrentController().getViewCursor()
    sOriginalURL = oDoc.getURL()
    oViewCursor.jumpToFirstPage()
    For iPage = 1 To iPageCount
        sFileURL = Replace(sOriginalURL, ".odt", " - " & Format(iPage, "000") & ".png")
        oDoc.StoreToURL(sFileURL, Args)
        If Not oViewCursor.jumpToNextPage() Then End
    Next iPage
End Sub

例如,如果您需要更改分辨率,则必须添加几行代码

答案2

https://ask.libreoffice.org/t/use-soffice-to-convert-from-doc-to-png-images/41621/3

仅第一页被导出为光栅图像格式。

该答案中给出的解决方案是导出为 PDF,然后从 PDF 转换为图像格式。但是,这听起来不适用于你的情况。

编写宏来导出绘图页面并不太难;但是如果它是一封信,那么您可能希望页面上有文本,而不仅仅是图像。

您可以编写一个宏,转到每个页面,然后像在菜单中一样调用导出。这里有一个使用oViewCursor.jumpToPage()at的示例https://ask.libreoffice.org/t/basic-macro-to-export-specific-pages-of-a-writer-document/30553。它看起来像这样:

oViewCursor = oDoc.CurrentController.getViewCursor()
oViewCursor.jumpToLastPage()
iPageCount = oViewCursor.getPage()
For iPage = 1 To iPageCount
    oViewCursor.jumpToPage(iPage)
Next

通过打开宏录制并转到获取调度程序代码文件 > 导出.然后在循环内调用该录制的代码For

缺点是,使用uno:ExportTo图像格式的调度程序调用需要您为每个页面按 OK。您可以使用第三方软件(如 AutoHotkey)自动按下 OK 按钮。或者,按住或反复按 Enter 键也许效果会更好。

这是调度程序代码示例。

document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

dim args1(3) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(0).Value = "file:///path/to/your/folder/filename.png"
args1(1).Name = "FilterName"
args1(1).Value = "writer_png_Export"
args1(2).Name = "FilterData"
args1(2).Value = Array( _
    Array("Compression",0,6,com.sun.star.beans.PropertyState.DIRECT_VALUE), _
    Array("Interlaced",0,1,com.sun.star.beans.PropertyState.DIRECT_VALUE), _
    Array("Translucent",0,1,com.sun.star.beans.PropertyState.DIRECT_VALUE), _
    Array("PixelWidth",0,816,com.sun.star.beans.PropertyState.DIRECT_VALUE), _
    Array("PixelHeight",0,1056,com.sun.star.beans.PropertyState.DIRECT_VALUE), _
    Array("LogicalWidth",0,21587,com.sun.star.beans.PropertyState.DIRECT_VALUE), _
    Array("LogicalHeight",0,27936,com.sun.star.beans.PropertyState.DIRECT_VALUE))
args1(3).Name = "SelectionOnly"
args1(3).Value = false

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

编辑

@JohnSUN 的回答使用StoreToURL不需要按 OK,所以这比使用调度程序调用要好。但是,您可能仍然会发现上面显示的一些参数很有帮助。

相关内容