您的位置:首页 > 编程语言 > Python开发

Python脚本利用openoffice将office文档转为html或者pdf。

2015-08-23 02:37 561 查看
准备工作:

一.软件环境:

jdk-7u9-linux-i586.tar.gz #openoffice安装需要有jdk支持 版本号你随便定

Apache_OpenOffice_4.1.1_Linux_x86_install-rpm_en-US.tar #openoffice软件请到官网下载,我的是最新版本

二.安装部署

1.查看是否安装了JDK

rpm -qa | grep java

如有显示说明已经安装了

那就删除掉

rmp -e java

2.拷贝jdk-7u9-linux-i586.tar.gz到数据库服务器的/web/下

mv jdk-7u9-linux-i586.tar.gz /home/wwwroot/

解压

tar -zxvf jdk-7u9-linux-i586.tar.gz

3.修改环境变量

vim /etc/profile

添加下面的代码

export JAVA_HOME=/www/web/jdk1.7.0_09

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export PATH=$PATH:$JAVA_HOME/bin

保存退出

4.重新加载环境变量

source /etc/profile

5.验证是否成功

java -version

如果出现下面三行

java version "1.7.0_09"

Java(TM) SE Runtime Environment (build 1.7.0_09-b05)

Java HotSpot(TM) Client VM (build 23.5-b02, mixed mode)

或者新建Test.java

class Test

{

public static void main(String[] args)

{

System.out.println("Hello World!");

}

}

保存

javac Test.java

java Test

运行结果如下

Hello World!

以上说明jdk没问题了。

6.安装openoffice

tar -zxvf Apache_OpenOffice_4.1.1_Linux_x86_install-rpm_en-US.tar.gz

进入里面RPMS去

ls查看

desktop-integration openoffice-en-US-calc-4.1.1-9775.i586.rpm

openoffice-4.1.1-9775.i586.rpm openoffice-en-US-draw-4.1.1-9775.i586.rpm

openoffice-base-4.1.1-9775.i586.rpm openoffice-en-US-help-4.1.1-9775.i586.rpm

openoffice-brand-base-4.1.1-9775.i586.rpm openoffice-en-US-impress-4.1.1-9775.i586.rpm

openoffice-brand-calc-4.1.1-9775.i586.rpm openoffice-en-US-math-4.1.1-9775.i586.rpm

openoffice-brand-draw-4.1.1-9775.i586.rpm openoffice-en-US-res-4.1.1-9775.i586.rpm

openoffice-brand-en-US-4.1.1-9775.i586.rpm openoffice-en-US-writer-4.1.1-9775.i586.rpm

openoffice-brand-impress-4.1.1-9775.i586.rpm openoffice-gnome-integration-4.1.1-9775.i586.rpm

openoffice-brand-math-4.1.1-9775.i586.rpm openoffice-graphicfilter-4.1.1-9775.i586.rpm

openoffice-brand-writer-4.1.1-9775.i586.rpm openoffice-images-4.1.1-9775.i586.rpm

openoffice-calc-4.1.1-9775.i586.rpm openoffice-impress-4.1.1-9775.i586.rpm

openoffice-core01-4.1.1-9775.i586.rpm openoffice-javafilter-4.1.1-9775.i586.rpm

openoffice-core02-4.1.1-9775.i586.rpm openoffice-math-4.1.1-9775.i586.rpm

openoffice-core03-4.1.1-9775.i586.rpm openoffice-ogltrans-4.1.1-9775.i586.rpm

openoffice-core04-4.1.1-9775.i586.rpm openoffice-onlineupdate-4.1.1-9775.i586.rpm

openoffice-core05-4.1.1-9775.i586.rpm openoffice-ooofonts-4.1.1-9775.i586.rpm

openoffice-core06-4.1.1-9775.i586.rpm openoffice-ooolinguistic-4.1.1-9775.i586.rpm

openoffice-core07-4.1.1-9775.i586.rpm openoffice-pyuno-4.1.1-9775.i586.rpm

openoffice-draw-4.1.1-9775.i586.rpm openoffice-ure-4.1.1-9775.i586.rpm

openoffice-en-US-4.1.1-9775.i586.rpm openoffice-writer-4.1.1-9775.i586.rpm

openoffice-en-US-base-4.1.1-9775.i586.rpm openoffice-xsltfilter-4.1.1-9775.i586.rpm

然后rpm -ivh *.rpm

很快就安装完成了

7.启动openoffice

cd /opt/openoffice4/program/

我装的是openoffice4,你自己看清楚,使用命令启动

./soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &

如果出现下面

[1] 1784

再查看一下进程

[root@www program]# netstat -tnlp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 1560/pure-ftpd (SER

tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1083/sshd

tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1027/cupsd

tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1543/sendmail

tcp 0 0 127.0.0.1:8100 0.0.0.0:* LISTEN 1814/soffice.bin

tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1494/mysqld

tcp 0 0 127.0.0.1:11211 0.0.0.0:* LISTEN 1576/memcached

tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 1523/redis-server 1

tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1067/nginx

tcp 0 0 :::21 :::* LISTEN 1560/pure-ftpd (SER

tcp 0 0 :::22 :::* LISTEN 1083/sshd

tcp 0 0 ::1:631 :::* LISTEN 1027/cupsd

可以发现8100端口已经处在监听状态

三、测试文档装换

需要一个Python脚本

注意我直接放在/opt/openoffice4/program 下面建了。

命名为DocumentConvert.py

直接用了网上一个哥们的代码

#
# PyODConverter (Python OpenDocument Converter) v1.1 - 2009-11-14
#
# This script converts a document from one office format to another by
# connecting to an OpenOffice.org instance via Python-UNO bridge.
#
# Copyright (C) 2008-2009 Mirko Nasato <mirko@artofsolving.com>
# Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl-2.1.html # - or any later version.
#
DEFAULT_OPENOFFICE_PORT = 8100

import uno
from os.path import abspath, isfile, splitext
from com.sun.star.beans import PropertyValue
from com.sun.star.task import ErrorCodeIOException
from com.sun.star.connection import NoConnectException

FAMILY_TEXT = "Text"
FAMILY_WEB = "Web"
FAMILY_SPREADSHEET = "Spreadsheet"
FAMILY_PRESENTATION = "Presentation"
FAMILY_DRAWING = "Drawing"

#---------------------#
# Configuration Start #
#---------------------#

# see http://wiki.services.openoffice.org/wiki/Framework/Article/Filter 
# most formats are auto-detected; only those requiring options are defined here
IMPORT_FILTER_MAP = {
"txt": {
"FilterName": "Text (encoded)",
"FilterOptions": "utf8"
},
"csv": {
"FilterName": "Text - txt - csv (StarCalc)",
"FilterOptions": "44,34,0"
}
}

EXPORT_FILTER_MAP = {
"pdf": {
FAMILY_TEXT: { "FilterName": "writer_pdf_Export" },
FAMILY_WEB: { "FilterName": "writer_web_pdf_Export" },
FAMILY_SPREADSHEET: { "FilterName": "calc_pdf_Export" },
FAMILY_PRESENTATION: { "FilterName": "impress_pdf_Export" },
FAMILY_DRAWING: { "FilterName": "draw_pdf_Export" }
},
"html": {
FAMILY_TEXT: { "FilterName": "HTML (StarWriter)" },
FAMILY_SPREADSHEET: { "FilterName": "HTML (StarCalc)" },
FAMILY_PRESENTATION: { "FilterName": "impress_html_Export" }
},
"odt": {
FAMILY_TEXT: { "FilterName": "writer8" },
FAMILY_WEB: { "FilterName": "writerweb8_writer" }
},
"doc": {
FAMILY_TEXT: { "FilterName": "MS Word 97" }
},
"rtf": {
FAMILY_TEXT: { "FilterName": "Rich Text Format" }
},
"txt": {
FAMILY_TEXT: {
"FilterName": "Text",
"FilterOptions": "utf8"
}
},
"ods": {
FAMILY_SPREADSHEET: { "FilterName": "calc8" }
},
"xls": {
FAMILY_SPREADSHEET: { "FilterName": "MS Excel 97" }
},
"csv": {
FAMILY_SPREADSHEET: {
"FilterName": "Text - txt - csv (StarCalc)",
"FilterOptions": "44,34,0"
}
},
"odp": {
FAMILY_PRESENTATION: { "FilterName": "impress8" }
},
"ppt": {
FAMILY_PRESENTATION: { "FilterName": "MS PowerPoint 97" }
},
"swf": {
FAMILY_DRAWING: { "FilterName": "draw_flash_Export" },
FAMILY_PRESENTATION: { "FilterName": "impress_flash_Export" }
}
}

PAGE_STYLE_OVERRIDE_PROPERTIES = {
FAMILY_SPREADSHEET: {
#--- Scale options: uncomment 1 of the 3 ---
# a) 'Reduce / enlarge printout': 'Scaling factor'
"PageScale": 100,
# b) 'Fit print range(s) to width / height': 'Width in pages' and 'Height in pages'
#"ScaleToPagesX": 1, "ScaleToPagesY": 1000,
# c) 'Fit print range(s) on number of pages': 'Fit print range(s) on number of pages'
#"ScaleToPages": 1,
"PrintGrid": False
}
}

#-------------------#
# Configuration End #
#-------------------#

class DocumentConversionException(Exception):

def __init__(self, message):
self.message = message

def __str__(self):
return self.message

class DocumentConverter:

def __init__(self, port=DEFAULT_OPENOFFICE_PORT):
localContext = uno.getComponentContext()
resolver = localContext.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", localContext)
try:
context = resolver.resolve("uno:socket,host=localhost,port=%s;urp;StarOffice.ComponentContext" % port)
except NoConnectException:
raise DocumentConversionException, "failed to connect to OpenOffice.org on port %s" % port
self.desktop = context.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", context)

def convert(self, inputFile, outputFile):

inputUrl = self._toFileUrl(inputFile)
outputUrl = self._toFileUrl(outputFile)

loadProperties = { "Hidden": True }
inputExt = self._getFileExt(inputFile)
if IMPORT_FILTER_MAP.has_key(inputExt):
loadProperties.update(IMPORT_FILTER_MAP[inputExt])

document = self.desktop.loadComponentFromURL(inputUrl, "_blank", 0, self._toProperties(loadProperties))
try:
document.refresh()
except AttributeError:
pass

family = self._detectFamily(document)
self._overridePageStyleProperties(document, family)

outputExt = self._getFileExt(outputFile)
storeProperties = self._getStoreProperties(document, outputExt)

try:
document.storeToURL(outputUrl, self._toProperties(storeProperties))
finally:
document.close(True)

def _overridePageStyleProperties(self, document, family):
if PAGE_STYLE_OVERRIDE_PROPERTIES.has_key(family):
properties = PAGE_STYLE_OVERRIDE_PROPERTIES[family]
pageStyles = document.getStyleFamilies().getByName('PageStyles')
for styleName in pageStyles.getElementNames():
pageStyle = pageStyles.getByName(styleName)
for name, value in properties.items():
pageStyle.setPropertyValue(name, value)

def _getStoreProperties(self, document, outputExt):
family = self._detectFamily(document)
try:
propertiesByFamily = EXPORT_FILTER_MAP[outputExt]
except KeyError:
raise DocumentConversionException, "unknown output format: '%s'" % outputExt
try:
return propertiesByFamily[family]
except KeyError:
raise DocumentConversionException, "unsupported conversion: from '%s' to '%s'" % (family, outputExt)

def _detectFamily(self, document):
if document.supportsService("com.sun.star.text.WebDocument"):
return FAMILY_WEB
if document.supportsService("com.sun.star.text.GenericTextDocument"):
# must be TextDocument or GlobalDocument
return FAMILY_TEXT
if document.supportsService("com.sun.star.sheet.SpreadsheetDocument"):
return FAMILY_SPREADSHEET
if document.supportsService("com.sun.star.presentation.PresentationDocument"):
return FAMILY_PRESENTATION
if document.supportsService("com.sun.star.drawing.DrawingDocument"):
return FAMILY_DRAWING
raise DocumentConversionException, "unknown document family: %s" % document

def _getFileExt(self, path):
ext = splitext(path)[1]
if ext is not None:
return ext[1:].lower()

def _toFileUrl(self, path):
return uno.systemPathToFileUrl(abspath(path))

def _toProperties(self, dict):
props = []
for key in dict:
prop = PropertyValue()
prop.Name = key
prop.Value = dict[key]
props.append(prop)
return tuple(props)

if __name__ == "__main__":
from sys import argv, exit

if len(argv) < 3:
print "USAGE: python %s <input-file> <output-file>" % argv[0]
exit(255)
if not isfile(argv[1]):
print "no such input file: %s" % argv[1]
exit(1)

try:
converter = DocumentConverter()
converter.convert(argv[1], argv[2])
except DocumentConversionException, exception:
print "ERROR! " + str(exception)
exit(1)
except ErrorCodeIOException, exception:
print "ERROR! ErrorCodeIOException %d" % exception.ErrCode
exit(1)


ok我们放一个doc文档转一下试试

[root@www program]# python DocumentConvert.py 1.doc 1.html

[root@www program]#

没问题

转pdf试试呢

[root@www program]# python DocumentConvert.py 1.doc 1.pdf

[root@www program]#

没问题。一切OK
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: