Source / jaraco / office /

Full commit
import os
import optparse
from contextlib import contextmanager
from jaraco.util.filesystem import save_to_file, replace_extension

def word_context(word, filename, close_flags):
	doc = word.Documents.Open(filename)
		yield doc

class Converter(object):
	An object that will convert a Word-readable file to one of the Word-
	savable formats (defaults to PDF).
	Requires Microsoft Word 2007 or later.
	def __init__(self):
		from win32com.client import Dispatch
		import pythoncom
		import threading
		if threading.current_thread().getName() != 'MainThread':
		self.word = Dispatch('Word.Application')

	def convert(self, docfile_string, target_format=None):
		Take a string (in memory) and return it as a string of the
		target format (also as a string in memory).
		from win32com.client import constants
		target_format = target_format or getattr(constants, 'wdFormatPDF', 17)

		with save_to_file(docfile_string) as docfile:
			# if I don't put a pdf extension on it, Word will
			pdffile = replace_extension('.pdf', docfile)
			dont_save = getattr(constants, 'wdDoNotSaveChanges', 0)
			with word_context(self.word, docfile, dont_save) as doc:
				res = doc.SaveAs(pdffile, target_format)
			with open(pdffile, 'rb') as pdf:
				content =
		return content

	__call__ = convert

	def __del__(self):

form = """
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "">
<html xmlns=""
		<form method="post" action="convert" enctype="multipart/form-data">
			<input type="file" name="document"/>
			<input type="submit" />

class ConvertServer(object):
	def index(self):
		return form = True
	def convert(self, document):
		cherrypy.response.headers['Content-Type'] = 'application/pdf'
		return Converter().convert( = True

	def start_server():
		global cherrypy
		import cherrypy
		_, args = optparse.OptionParser().parse_args()
		config = None
		if args: config, = args
		cherrypy.quickstart(ConvertServer(), config=config)