大家好,我目前正在使用 Angular.js 开发一个网站,我想根据用户的输入生成一个 Word 文档,效果很好!!
问题是我想让用户预览并将word文档下载为PDF文档 因此我尝试更改 MIME 类型并更改 SaveAs 格式,但它不起作用
我也尝试过使用包将单词更改为 PDF,但到目前为止还没有成功
这里是保存生成的word文档的代码
this.loadFile("/assets/document/Template.docx", function(
error,
content
) {
if (error) {
console.log("Load file error: ",error) ;
}
var zip = new PizZip(content);
var doc = new Docxtemplater().loadZip(zip);
doc.setData({
tag: "Hello"
});
try {
doc.render();
} catch (error) {
console.log(error)
}
var out = doc.getZip().generate({
type: "blob",
mimeType:
//"application/pdf;charset=utf-8"
"application/vnd.openxmlformats-officedocument.wordprocessingml.document"
}); //Output the document using Data-URI
saveAs(out, "GeneratedDocx.docx");
});
}
我仍然无法使用 out 变量使用 docxConverter 或任何其他包进行转换
我在使用 docxtemplater 的项目中遇到了类似的问题。以下事情对我有用。我使用 docx-pdf npm 包将其转换为 pdf。 https://www.npmjs.com/package/docx-pdf
var doc = new Docxtemplater()
.attachModule(imageModule)
.loadZip(zip)
.setData(finalData)
.render();
var buffer = await doc.getZip().generate({ type: "nodebuffer" });
fs.writeFile(outputPath, buffer, function (err, result) {
if (err) {
return next(new ErrorHandler(err.response, 401));
}
});
docxConverter(outputPath,'./output.pdf',function(err,result){
if(err){
console.log(err);
}
console.log('result'+result);
});
转换不是那么准确,但它在很多情况下对我有用。还有一些 API 可用,但它们免费提供次数有限。
正如我建议的 在并行线程中,使用
libreoffice-convert
根本不需要保留到磁盘 DOCX 或 PDF 文件。但缺点是你需要在服务机器上安装 libreoffice:
// In your controller or service:
export const exportTextToFile = async (text: string, filetype: string): Promise<Blob> => {
const exportToFileEndpointUrl = `${API_BASE_URL}/api/export/${filetype}`;
const response = await axios.post<ArrayBuffer>(exportToFileEndpointUrl, text, {
responseType: 'arraybuffer',
});
return new Blob([response.data]);
};
// In your component:
const getAndDownloadFile = async (filetype: string) => {
try {
const blob = await exportTextToFile(text, filetype);
saveAs(blob, `MyFile.${filetype}`);
} catch (error) {
console.error(error);
}
};
在 NodeJS 后端应用程序中:
import libre from 'libreoffice-convert';
try {
const docxBuffer = await generateDocx(...);
if (filetype === 'pdf') {
libre.convert(docxBuffer, 'pdf', undefined, (err, pdfBuffer) => {
if (err) {
throw err;
} else {
res.send(pdfBuffer);
}
});
} else if (filetype === 'docx') {
res.send(docxBuffer);
}
logger.info('Sent file buffer to the client', { filetype });
} catch (error) {
logger.error('Error during file creation', { filetype, error: error.message });
res.sendStatus(500);
}
// Your docxtemplater generator:
import Docxtemplater from 'docxtemplater';
function generateDocx(...): Promise<Buffer> {
const content = fs.readFileSync(path.resolve(__dirname, 'your-template.docx'), 'binary');
const zip = new PizZip(content);
const doc = new Docxtemplater(zip, {
paragraphLoop: true,
linebreaks: true,
});
doc.render({
/// your template params
});
const buffer = doc.getZip().generate({
type: 'nodebuffer',
compression: 'DEFLATE',
});
return buffer;
}