如何从 Linux 上的多个 .doc/.docx 文件中删除行号?
Posted
技术标签:
【中文标题】如何从 Linux 上的多个 .doc/.docx 文件中删除行号?【英文标题】:How to remove row line numbers from several .doc/.docx files on Linux? 【发布时间】:2018-07-19 12:03:37 【问题描述】:作为 (Python) 数据处理管道的一部分,我需要从大量 Word .doc/.docx 文件中删除行号。
我知道在 C# 中使用 Word.Interop 执行此操作的解决方案(例如 Is it possible to use Microsoft.Office.Interop.Word to programatically remove line numbering from a Word document?),但实现这一点会很棒,例如在 --headless
模式下使用 LibreOffice(在评估 MS Word + wine 解决方案之前)。
对于单个文件,使用UI,可以关注https://help.libreoffice.org/Writer/Line_Numbering,但是我需要为很多文件这样做,所以一个宏/脚本/命令行解决方案
1) 循环浏览一组文件 2)删除行号并将结果保存到文件
并通过例如触发Python subprocess
调用会很棒,甚至可以调用 Python API (https://help.libreoffice.org/Common/Scripting)。
【问题讨论】:
【参考方案1】:要对工作目录中的文件列表执行行删除(并将生成的输出放入 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 forumsLineNumberingProperties documentationInfo on running a macro from the command line
【讨论】:
以上是关于如何从 Linux 上的多个 .doc/.docx 文件中删除行号?的主要内容,如果未能解决你的问题,请参考以下文章
如何在android中读取.doc、.docx、.xls文件[重复]
如何根据文件头识别doc、docx、pdf、xls和xlsx
寻找用于从 ppt、pptx、doc、docx 文件中解析和提取对象的库 [关闭]