dolanmiu / docx

Easily generate and modify .docx files with JS/TS with a nice declarative API. Works for Node and on the Browser.
https://docx.js.org/
MIT License
4.44k stars 486 forks source link

Apple Pages very basic scenario breaks (paragraph styles not reset) #2733

Open YousefED opened 1 month ago

YousefED commented 1 month ago

Code to reproduce:

const doc2 = new Document({
      sections: [
        {
          properties: {},
          children: [
            new Paragraph({
              children: [new TextRun("Hello World")],
            }),
            new Paragraph({
              children: [new TextRun("Heading")],
              heading: HeadingLevel.HEADING_1,
            }),
            new Paragraph({
              children: [new TextRun("Goodbye")],
            }),
          ],
        },
      ],
    });
[My Document.docx](https://github.com/user-attachments/files/17305065/My.Document.docx)

    const buffer = await Packer.toBuffer(doc2);
    fs.writeFileSync(__dirname + "/My Document.docx", buffer);

While opening the resulting doc in google docs works fine, in Apple pages the last paragraph will have a heading style applied:

image

docx file: My Document.docx

sorrowe commented 5 days ago

I was also struggling with this today.

I compared it to a document without the issue by unzipping. The styles.xml in the working one had a section just under 'w:docDefaults':

<w:style w:type="paragraph" w:default="1" w:styleId="Normal">
    <w:name w:val="Normal" />
    <w:qFormat />
    <w:rPr>
        <w:rFonts w:ascii="Arial" w:hAnsi="Arial" />
    </w:rPr>
</w:style>

Copying that across and recompressing seemed to fix the issue. Presumably that could also be done using the xml based styling and subbing in a 'working' style sheet.

It looks like the default stylesheet created doesn't have an entry for the 'Normal' style. That may be the cause, or it could be the default="1" property.