家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。
今天给大家带来的主题是HTML5 和word的互相转化,话不多说,直接进入正题!
html-docx-js 是一个非常小的库,能够将 HTML 文档转换为 Microsoft Word 2007 及更高版本使用的 DOCX 格式。 html-docx-js 设法使用称为“altchunks”的功能在浏览器中执行转换。 简而言之,它允许以不同的标记语言嵌入内容。 开发者使用 MHT 文档将嵌入内容发送到 Word,因为它允许处理图像。 Word 打开此类文件后,会将外部内容转换为 Word Processing ML(这是 DOCX 文件的标记语言的调用方式)并替换引用。
Microsoft Word for Mac 2008 不支持 Altchunk,LibreOffice 和 Google Docs 也不支持 Altchunk。
关于 html-docx-js 库有几点需要说明:
目前 Mammoth 在 Github 上通过 MIT 协议开源,有超过 1k 的 star、0.3k 的 fork、0.7k 的项目依赖量、NPM 周平均下载量 9k,是一个值得关注的前端开源项目。
var converted = htmlDocx.asBlob(content);
saveAs(converted, "test.docx");
asBlob 可以采用其他选项来控制文档的页面设置:
比如下面的例子:
var converted = htmlDocx.asBlob(content, {
orientation: "landscape",
margins: { top: 720 },
});
saveAs(converted, "test.docx");
需要注意的是,开发者需要传递完整、有效的 HTML(包括 DOCTYPE、html 和 body 标签)。 这可能不太方便,但可以让开发者在样式标签中包含 CSS 规则。
html-docx-js 作为独立”Browserify 模块(UMD)分发。 开发者可以将其作为 html-docx 要求。 如果没有可用的模块加载器,它将把自己注册在 window.htmlDocx。
Mammoth.js 旨在转换 .docx 文档,例如:由 Microsoft Word、Google Docs 和 LibreOffice 创建的文档,并将其转换为 HTML。 Mammoth 的目标是通过使用文档中的语义信息并忽略其他细节来生成简单且干净的 HTML。 例如,Mammoth 将任何具有标题 1 样式的段落转换为 h1 元素,而不是尝试精确复制标题的样式(字体、文本大小、颜色等)。
.docx 使用的结构与 HTML 的结构之间存在很大的不匹配,这意味着对于更复杂的文档来说,转换不太可能完美。 如果开发者仅使用样式来对文档进行语义标记,那么 Mammoth 效果最佳。
Mammoth.js 目前支持以下功能:
Mammoth 在众多平台可用,比如:Python、WordPress、Java/JVM、.NET 等等。目前 Mammoth 在 Github 上通过 BSD-2-Clause 开源,有超过 4.1k 的 star、0.5k 的 fork、4.4k 的项目依赖量、NPM 周平均下载量 76k,是一个值得关注的前端优质开源项目。
以文档转换为例。
Mammoth 允许在转换文档之前对其进行处理。 例如,假设该文档尚未进行语义标记,但开发者知道任何居中对齐的段落都应该是标题,则可以使用 transformDocument 参数来适当地修改文档:
function transformElement(element) {
if (element.children) {
var children = _.map(element.children, transformElement);
element = { ...element, children: children };
}
if (element.type === "paragraph") {
element = transformParagraph(element);
}
return element;
}
function transformParagraph(element) {
if (element.alignment === "center" && !element.styleId) {
return { ...element, styleId: "Heading2" };
} else {
return element;
}
}
var options = {
transformDocument: transformElement,
};
TransformDocument 的返回值在 HTML 生成期间使用。同时,上面的代码可以使用 mammoth.transforms.paragraph 函数进行优化,比如:
function transformParagraph(element) {
if (element.alignment === "center" && !element.styleId) {
return { ...element, styleId: "Heading2" };
} else {
return element;
}
}
var options = {
transformDocument: mammoth.transforms.paragraph(transformParagraph),
};
或者,如果开发者希望已明确设置为使用等宽字体来表示代码的段落:
const monospaceFonts = ["consolas", "courier", "courier new"];
function transformParagraph(paragraph) {
var runs = mammoth.transforms.getDescendantsOfType(paragraph, "run");
var isMatch =
runs.length > 0 &&
runs.every(function (run) {
return run.font && monospaceFonts.indexOf(run.font.toLowerCase()) !== -1;
});
if (isMatch) {
return {
...paragraph,
styleId: "code",
styleName: "Code",
};
} else {
return paragraph;
}
}
var options = {
transformDocument: mammoth.transforms.paragraph(transformParagraph),
styleMap: ["p[style-name='Code'] => pre:separator('\n')"],
};
关于 Mammoth 库的更多用法,更多 API 示例可以参考文末资料,本文不再过多展开。
本文主要和大家介绍 HTML5 和word互转的两个开源库,分别为:html-docx-js、mammoth.js。相信通过本文的阅读,大家对 html-docx-js、mammoth.js 会有一个初步的了解。
因为篇幅有限,关于 html-docx-js、mammoth.js 的更多用法和特性文章并没有过多展开,如果有兴趣,可以在我的主页继续阅读,同时文末的参考资料提供了大量优秀文档以供学习。最后,欢迎大家点赞、评论、转发、收藏,您的支持是我不断创作的动力。
https://github.com/evidenceprime/html-docx-js
https://github.com/mwilliamson/mammoth.js
https://www.npmjs.com/package/html-docx-js
https://www.npmjs.com/package/mammoth
https://www.tutorialswebsite.com/export-html-to-word-document-with-javascript/
https://www.vecteezy.com/vector-art/136754-free-vector-documents
路是方向,代码是时间,知识需积累,经验需摸索。希望对大家有用,有错误还望指出。
要实现一个文件上传和下载的页面,我们需要涉及到 Django 中的以下几个概念/类/函数:
一、在 models.py 文件中定义一个 File 模型,用于存储上传的文件和文件相关信息。
from django.db import models
class File(models.Model):
filename = models.CharField(max_length=100)
file = models.FileField(upload_to='uploads/')
created_at = models.DateTimeField(auto_now_add=True)
代码中定义了一个名为 File 的模型,包含了文件名、文件、创建时间三个字段,并规定文件上传到 uploads/ 文件夹下。
二、在 forms.py 文件中,定义一个 FileForm 表单,用于提交文件到后端处理。
from django import forms
from .models import File
class FileForm(forms.ModelForm):
class Meta:
model = File
fields = ['filename', 'file']
代码中定义了一个名为 FileForm 的表单类,它继承自 Django 的 ModelForm,并以 File 模型为模板。fields 属性定义了需要提交的字段。class Meta: model = File fields = ['filename', 'file']
三、在 views.py 文件中,定义处理文件上传和下载的视图函数。
from django.shortcuts import render, redirect
from django.http import FileResponse
from django.views import View
from .models import File
from .forms import FileForm
class FileView(View):
def get(self, request):
files = File.objects.all().order_by('-created_at')
form = FileForm()
return render(request, 'files.html', {'files': files, 'form': form})
def post(self, request):
form = FileForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('file_list')
else:
return render(request, 'files.html', {'form': form})
class FileDownloadView(View):
def get(self, request, file_id):
file = File.objects.get(pk=file_id)
response = FileResponse(open(file.file.path, 'rb'))
response['Content-Disposition'] = 'attachment; filename=' + file.filename
return response
代码中定义了两个视图函数,一个用于显示上传文件列表和提交表单,一个用于下载文件。其中 FileView 用于处理 GET 和 POST 请求,并加载模板 files.html;FileDownloadView 用于下载文件,将文件二进制数据返回给客户端。
四、定义前端模板,在 templates 目录下创建名为 files.html 的模板文件,用于显示上传文件列表和提交表单。
<h2>Upload File</h2> *****上传******
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Upload</button> </form>
<h2>Download Files</h2> *****下载*****
<ul>
{% for file in files %}
<li><a href="{% url 'file_download' file.id %}">{{ file.filename }}</a></li>
{% empty %}
<li>No files found.</li>
{% endfor %} </ul>
代码中用 html 的 form 标签以及 Django 的 csrf_token 安全验证提供了上传文件的表单。展示已上传的文件,通过从 model 中获取数据生成文件列表。
以上是一个实现文件上传和下载的基本示例,它涉及到了 Django 中的一系列概念、类和函数,其中包括两个关键的视图函数,即处理文件上传的 FileView,以及处理文件下载的 FileDownloadView。这两个视图函数实现了对于文件的上传、下载、展示。前端通过 html 文件上传的表单 形式 提交数据,后端通过 models.Model 和 forms.ModelForm 等定义实现数据存储和数据处理。最终,前端通过 FileResponse 实现文件下载。
*请认真填写需求信息,我们会在24小时内与您取得联系。