class PrepMessage: def __init__(self): self.msg = EmailMessage() self.templates = {}
def _get_template(self, template_path): try: return copy.deepcopy(self.templates[template_path]) except KeyError: with open(template_path, "rb") as f: source_stream = StringIO(f.read()) self.templates[template_path] = DocxTemplate(source_stream) source_stream.close() return self.templates[template_path] def _get_html_string(self, html_path): """ Read message html file""" if html_path[-1] == "l": html_path = html_path[-1] with codecs.open(html_path, "r") as fp: stream = fp.read() os.remove(html_path) return stream def _get_mime(self, path): mime = mimetypes.guess_type(path)[0] if mime: return mime elif path.endswith(".rar"): return "application/x-rar-compressed" else: raise TypeError("Filetype not supported invalid") def __setitem__(self, name, val, *args, **kwargs): if name == "To": self.msg.__setitem__("To", self._get_formatted_to(val)) elif name == "Subject": self.msg.__setitem__("Subject", self ._get_formatted_subject(val)) elif name == "From": self.msg.__setitem__("From", self._get_formatted_from(val)) def _get_formatted_to(self, to): return ", ".join([i.strip() for i in to.split(",")]) def _get_formatted_subject(self, subject): return subject def _get_formatted_from(self, from_): return from_ def add_attachments(self, attachments): for file_ in map(lambda x: x.strip(), attachments.split(",")): if os.path.exists(file_): with open(file_, "rb") as fp: file_name = pathlib.Path(file_).name maintype, subtype = self._get_mime(file_name).split("/") self.msg.add_attachment( fp.read(), maintype=maintype, subtype=subtype, filename=file_name, ) def _get_path_of_converted_word_to_html(self, docx_string_io): TODO: word = wc.Dispatch("Word.Application") doc = word.Documents.Open(docx_path) html_path = "a.html" doc.SaveAs(html_path, 8) doc.Close() word.Quit() os.remove(docx_path) return html_path def add_alternative(self, docx_template_path, context): template = self._get_template(docx_template_path) template.render(context) target_stream = StringIO() template.save(target_stream) self.msg.add_alternative( self._get_html_string( self._get_path_of_converted_word_to_html(Path(word_doc)) ), subtype="html", ) On Sun, Mar 14, 2021 at 11:10 AM <manglavishes...@gmail.com> wrote: > > > To convert docx to html , one would do > > word = wc.Dispatch("Word.Application") > > doc = word.Documents.Open(docx_path) > > doc.SaveAs(html_path, 8) > > But here we require paths. I am using python-docx-template . I read a > docx file, template it, then save to a StringIO(). But now I have to first > save the doc as .docx, then open it and then create .html files, then deal > with PermissionErrors. How can I use the StringIO() in place of paths. > Something like this: > > > > word = wc.Dispatch("Word.Application") > > doc = word.Documents.Open(docx_string_io) > > doc.SaveAs(html_stream, 8) > > > > > > Sent from Mail <https://go.microsoft.com/fwlink/?LinkId=550986> for > Windows 10 > > >
_______________________________________________ python-win32 mailing list python-win32@python.org https://mail.python.org/mailman/listinfo/python-win32