2010-04-10 3 views
3

Мне нужно программно преобразовать файл Word-XML в RTF-файл. Это стало требованием из-за некоторых сторонних библиотек. Любой API/библиотека, который может это сделать?Преобразование Word XML в RTF

На самом деле язык не является проблемой, потому что мне просто нужно работать. Но предпочтительны Java, языки .NET или Python.

ответ

2

Python,/Linux путь:

Вам нужен OpenOffice Uno Bride (На сервере вы можете запустить OO в обезглавленный режиме). В результате вы можете конвертировать все ОО-читаемый формат для каждого ОО-Writeable:

см http://wiki.services.openoffice.org/wiki/Framework/Article/Filter/FilterList_OOo_3_0

Run Пример кода

/usr/lib64/openoffice.org/program/soffice.bin -accept=socket,host=localhost,port=8100\;urp -headless 

Python Пример:

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_SPREADSHEET = "Spreadsheet" 
FAMILY_PRESENTATION = "Presentation" 
FAMILY_DRAWING = "Drawing" 
DEFAULT_OPENOFFICE_PORT = 8100 

FILTER_MAP = { 
    "pdf": { 
     FAMILY_TEXT: "writer_pdf_Export", 
     FAMILY_SPREADSHEET: "calc_pdf_Export", 
     FAMILY_PRESENTATION: "impress_pdf_Export", 
     FAMILY_DRAWING: "draw_pdf_Export" 
    }, 
    "html": { 
     FAMILY_TEXT: "HTML (StarWriter)", 
     FAMILY_SPREADSHEET: "HTML (StarCalc)", 
     FAMILY_PRESENTATION: "impress_html_Export" 
    }, 
    "odt": { FAMILY_TEXT: "writer8" }, 
    "doc": { FAMILY_TEXT: "MS Word 97" }, 
    "rtf": { FAMILY_TEXT: "Rich Text Format" }, 
    "txt": { FAMILY_TEXT: "Text" }, 
    "docx": { FAMILY_TEXT: "MS Word 2007 XML" }, 
    "ods": { FAMILY_SPREADSHEET: "calc8" }, 
    "xls": { FAMILY_SPREADSHEET: "MS Excel 97" }, 
    "odp": { FAMILY_PRESENTATION: "impress8" }, 
    "ppt": { FAMILY_PRESENTATION: "MS PowerPoint 97" }, 
    "swf": { FAMILY_PRESENTATION: "impress_flash_Export" } 
} 

class DocumentConverter: 

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

    def convert(self, inputFile, outputFile): 

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

     document = self.desktop.loadComponentFromURL(inputUrl, "_blank", 0, self._toProperties(Hidden=True)) 
     #document.setPropertyValue("DocumentTitle", "saf") TODO: Check how this can be set and set doc update mode to FULL_UPDATE 

     if self._detectFamily(document) == FAMILY_TEXT: 
      indexes = document.getDocumentIndexes() 
      for i in range(0, indexes.getCount()): 
       index = indexes.getByIndex(i) 
       index.update() 

      try: 
       document.refresh() 
      except AttributeError: 
       pass 

      indexes = document.getDocumentIndexes() 
      for i in range(0, indexes.getCount()): 
       index = indexes.getByIndex(i) 
       index.update() 

     outputExt = self._getFileExt(outputFile) 
     filterName = self._filterName(document, outputExt) 

     try: 
      document.storeToURL(outputUrl, self._toProperties(FilterName=filterName)) 
     finally: 
      document.close(True) 

    def _filterName(self, document, outputExt): 
     family = self._detectFamily(document) 
     try: 
      filterByFamily = FILTER_MAP[outputExt] 
     except KeyError: 
      raise Exception, "unknown output format: '%s'" % outputExt 
     try: 
      return filterByFamily[family] 
     except KeyError: 
      raise Exception, "unsupported conversion: from '%s' to '%s'" % (family, outputExt) 

    def _detectFamily(self, document): 
     if document.supportsService("com.sun.star.text.GenericTextDocument"): 
      # NOTE: a GenericTextDocument is either a TextDocument, a WebDocument, or a GlobalDocument 
      # but this further distinction doesn't seem to matter for conversions 
      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 Exception, "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, **args): 
     props = [] 
     for key in args: 
      prop = PropertyValue() 
      prop.Name = key 
      prop.Value = args[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 Exception, exception: 
     print "ERROR!" + str(exception) 
     exit(1) 
+1

[pyod converter] (https://github.com/mirkonasato/pyodconverter) предоставляет удивительно простой скрипт для этого – Kato

0

Java

Я использовал Apache POI в прошлом для анализа Word Documents. Казалось, это работает очень хорошо. Затем вот some libraries для записи в RTF.

.Net

Here's an article о записи в документ Word в .Net. Я уверен, что вы можете использовать одну и ту же библиотеку для чтения.

Python

Here is an article для Python.

Связанные Вопрос

Также here is a related if not duplicate question.

0

взгляните на Docvert. Вы должны настроить его для себя, потому что демонстрация только позволяет загружать открытые офисные документы, я полагаю.

0

Вы можете использовать AutoIt для автоматизации открытия файлов XML в слове и сохранения в качестве RTF.

Я использовал определенные пользователем функции для Word, чтобы сохранять RTF-файлы в виде обычного текста для преобразования, и он работает хорошо. Синтаксис очень прост.

http://www.autoitscript.com/autoit3/index.shtml

0

Из java, вы можете использовать Docmosis, чтобы сделать преобразование и необязательное заполнение. Он выполняет работу над openoffice для преобразования формата. Если вы устанавливаете openoffice и загружаете вручную и сохраняете несколько примеров документов, вы получите представление о том, достаточно ли для вас конверсии формата. Если это так, вы можете использовать Docmosis для управления им с Java.

Смежные вопросы