Export

Pro ExtensionNew

Export Tiptap's editor content to various formats like docx, odt, and markdown.

We also have an Import extension, or you can review an example that does both import and export over here.

Beta release

This extension is accessible to anyone with a Tiptap account. To install the extension you need access to our private registry, set this up first.

Setup JWT authentication on your server

JWT, or JSON Web Token, is a compact, URL-safe means of representing claims to be transferred between two parties. The information in a JWT is digitally signed using a cryptographic algorithm to ensure that the claims cannot be altered after the token is issued. This digital signature makes the JWT a reliable vehicle for secure information exchange in web applications, providing a method to authenticate and exchange information.

Create a static JWT for testing

For testing purposes, you might not want to set up a complete backend system to generate JWTs. In such cases, using online tools like http://jwtbuilder.jamiekurtz.com/ can be a quick workaround. These tools allow you to create a JWT by inputting the necessary payload and signing it with a secret key.

When using these tools, ensure that the "Key" field is replaced with the secret key from your Convert settings page. You don’t need to change any other information.

Remember, this approach is only recommended for testing due to security risks associated with exposing your secret key.

Generate JWTs server side

For production-level applications, generating JWTs on the server side is a necessity to maintain security. Exposing your secret key in client-side code would compromise the security of your application. Here’s an example using NodeJS for creating JWTs server-side:

npm install jsonwebtoken
import jsonwebtoken from 'jsonwebtoken'

const payload = {
  // The payload contains claims like the user ID, which can be used to identify the user and their permissions.
  userId: 'user123',
}

// The 'sign' method creates the JWT, with the payload and your secret key as inputs.
const jwt = jsonwebtoken.sign(payload, 'your_secret_key_here')
// The resulting JWT is used for authentication in API requests, ensuring secure access.
// Important: Never expose your secret key in client-side code!

This JWT should be incorporated into API requests within the token field of your authentication provider, safeguarding user sessions and data access.

To fully integrate JWT into your application, consider setting up a dedicated server or API endpoint, such as GET /getConvertToken. This endpoint would dynamically generate JWTs based on a secret stored securely on the server and user-specific information, like document access permissions.

This setup not only increases security but also provides a scalable solution for managing user sessions and permissions in your convert application.

Ensure the secret key is stored as an environment variable on the server, or define it directly in the server code. Avoid sending it from the client side.

Setting up the client-side

Before we can start import & exporting documents, we need to set up the extension. The extension will handle all requests and responses to the convert API & will handle content insertions and downloads.

Installing the extension

To use the convert extension, you need to install the @tiptap-pro/extension-export package:

npm i @tiptap-pro/extension-export

Configure the extension

// Start with importing the extension
import { Export } from '@tiptap/extension-export'

const editor = new Editor({
  // ...
  extensions: [
    // ...
    Export.configure({
      // The Convert App-ID from the convert settings page: https://cloud.tiptap.dev/convert-settings
      appId: 'your-app-id',

      // The JWT token you generated in the previous step
      token: 'your-jwt',
    }),
  ],
})

Export a document

// Do a simple export to docx
// Supported formats: docx, odt, md and gfm
editor.chain().focus().export({ format: 'docx' }).run()

Customize the export behavior

// You can also use the onExport callback to customize the export behavior
editor.chain().export({
  format: 'docx',
  onExport(context) {
    const { blob, error, download, filename } = context

    // add error handling
    if (error) {
      showErrorToast({ message: error.message })
    }

    // you can change the loading state of your application for example
    isLoading = false

    // you could modify the filename or handle the blob differently here
    // but we will keep them as they are

    // you can trigger a download directly by calling the download method
    download()

    // keep in mind that the download method will only work in the browser
    // and if the blob and filename was changed before must be managed manually
  },
})

Options

NameTypeDefaultDescription
appIdstringundefinedThe convert app ID from the Convert settings page: https://cloud.tiptap.dev/convert-settings
tokenstringundefinedThe JWT token generated from your server via secret

Commands

NameDescription
exportExport the editor content

export

Arguments

NameTypeDefaultOptionsDescription
formatstringundefineddocx,odt,md,gfmThe format you want to export to
contentJSONContentundefinedAny Tiptap JSONThe Tiptap JSON content you want to export
onExportFunctionundefinedfn(context)A callback used to customize the export behavior. The context argument includes information about the blob, filename, errors and a download function to download the document directly

Supported formats

  • docx - Microsoft Word, Google Docs, OpenOffice, LibreOffice and others
  • odt - OpenDocument Text format used by OpenOffice, LibreOffice and others
  • Commonmark markdown - Markdown format used by various editors and platforms
  • GFM markdown - GitHub Flavored Markdown used by GitHub

Caveats and limitations

  • Custom Node exports - Exporting custom nodes or marks is not supported as they can't be converted into other format structures
  • Custom docx templates - Currently it's not possible to use custom docx templates for exporting documents
  • PDF import & export - Exporting PDF files is not yet supported
  • Inline styles - Inline styles are currently not parsed and are not available in import & export

We're continuously working on improving the import & export extension, so if you have any feedback or feature requests, please let us know!

More information