如何在Linux上的几个.doc / .docx文件中删除行号?

时间:2018-07-19 12:03:38

标签: python ms-word libreoffice doc libreoffice-writer

作为(Python)数据处理管道的一部分,我需要从大量的Word .doc / .docx文件中删除行号。

我知道使用Word.Interop(例如Is it possible to use Microsoft.Office.Interop.Word to programatically remove line numbering from a Word document?)在C#中执行此操作的解决方案,但是最好做到这一点,例如(在评估MS Word + wine解决方案之前)以 ${__FileToString("C:/Users/LoginUserName/Desktop/company/hugemodify.txt",,)} 模式使用LibreOffice。

对于使用UI的单个文件,可以遵循https://help.libreoffice.org/Writer/Line_Numbering,但是我需要对很多文件执行此操作,因此需要使用宏/脚本/命令行解决方案

1)循环浏览一组文件
2)删除行号并将结果保存到文件

并通过例如最好使用Python --headless进行调用,甚至可以使用Python API(https://help.libreoffice.org/Common/Scripting)进行调用。

1 个答案:

答案 0 :(得分:3)

要对工作目录中的文件列表执行行删除(并将结果输出到pdf中),请在Linux命令行中运行LibreOffice:

soffice --headless --accept="socket,host=localhost,port=2002;urp;StarOffice.ServiceManager"

,然后在Python解释器中

import uno
import socket
import os
import subprocess
from pythonscript import ScriptContext
from com.sun.star.beans import PropertyValue

# list docfiles in working dir
files = [x for x in os.listdir('.') if x.endswith(".docx")]

# iterate on files
for file in files:

    localContext = uno.getComponentContext()
    resolver = localContext.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", localContext)
    ctx = resolver.resolve("uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext")
    smgr = ctx.ServiceManager
    desktop = smgr.createInstanceWithContext("com.sun.star.frame.Desktop", ctx)

    # open file 
    model = desktop.loadComponentFromURL(uno.systemPathToFileUrl(os.path.realpath(file)), "_blank", 0, ())

    # remove line numbers
    model.getLineNumberingProperties().IsOn = False

    # prepare to save output to pdf
    XSCRIPTCONTEXT = ScriptContext(ctx, None, None)

    p = PropertyValue()
    p.Name = 'FilterName'
    p.Value = 'writer_pdf_Export'

    oDoc = XSCRIPTCONTEXT.getDocument()

    # create pdf 
    oDoc.storeToURL("file://" + os.getcwd() + "/" + file + ".pdf", tuple([p]))

这应该在您的工作目录中创建没有行号的pdf文件。

有用的链接:
Add line numbers and export to pdf via macro on OpenOffice forums
LineNumberingProperties documentation
Info on running a macro from the command line