Skip to content

Export a prosemirror document to a Microsoft Word file, using docx.

License

Notifications You must be signed in to change notification settings

curvenote/prosemirror-docx

Folders and files

NameName
Last commit message
Last commit date

Latest commit

0bebe59 Β· Mar 28, 2025

History

94 Commits
Mar 28, 2025
Jul 7, 2024
Mar 28, 2025
Jun 27, 2022
Jun 27, 2022
Sep 24, 2021
Sep 24, 2021
Mar 28, 2025
Sep 24, 2021
Oct 19, 2021
Jun 27, 2022
Mar 28, 2025
Jun 27, 2022
Dec 18, 2024

Repository files navigation

prosemirror-docx

prosemirror-docx on npm MIT License CI

Export a prosemirror document to a Microsoft Word file, using docx.

image

Overview

prosemirror-docx has a similar structure to prosemirror-markdown, with a DocxSerializerState object that you write to as you walk the document. It is a light wrapper around https://docx.js.org/, which actually does the export. Currently prosemirror-docx is write only (i.e. can export to, but can’t read from *.docx), and has most of the basic nodes covered (see below).

Curvenote uses this to export from @curvenote/editor to word docs, but this library currently only has dependence on docx, prosemirror-model and buffer-image-size - and similar to prosemirror-markdown, the serialization schema can be edited externally (see Extended usage below).

Basic usage

import { defaultDocxSerializer, writeDocx } from 'prosemirror-docx';
import { EditorState } from 'prosemirror-state';
import { writeFileSync } from 'fs'; // Or some other way to write a file

// Set up your prosemirror state/document as you normally do
const state = EditorState.create({ schema: mySchema });

// If there are images, we will need to preload the buffers
const opts = {
  getImageBuffer(src: string) {
    return anImageBuffer;
  },
};

// Create a doc in memory, and then write it to disk
const wordDocument = defaultDocxSerializer.serialize(state.doc, opts);

await writeDocx(wordDocument, (buffer) => {
  writeFileSync('HelloWorld.docx', buffer);
});

Extended usage

Instead of using the defaultDocxSerializer you can override or provide cusome serializers.

import { DocxSerializer, defaultNodes, defaultMarks } from 'prosemirror-docx';

const nodeSerializer = {
  ...defaultNodes,
  my_paragraph(state, node) {
    state.renderInline(node);
    state.closeBlock(node);
  },
};

export const myDocxSerializer = new DocxSerializer(nodeSerializer, defaultMarks);

The state is the DocxSerializerState and has helper methods to interact with docx.

Supported Nodes

  • text
  • paragraph
  • heading (levels)
    • TODO: Support numbering of headings
  • blockquote
  • code_block
    • TODO: No styles supported
  • horizontal_rule
  • hard_break
  • ordered_list
  • unordered_list
  • list_item
  • image
  • math
  • equations (numbered & unnumbered)
  • tables

Planned:

  • Internal References (e.g. see Table 1)

Supported Marks

  • em
  • strong
  • link
    • Note: this is actually treated as a node in docx, so ignored as a prosemirror mark, but supported.
  • code
  • subscript
  • superscript
  • strikethrough
  • underline
  • smallcaps
  • allcaps

Resources