我生成了一封 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,所以这比使用调度程序调用要好。但是,您可能仍然会发现上面显示的一些参数很有帮助。