在我的xampp htdocs文件夹中,我有两个文件:一个图像和一个PHP脚本。我试图用图像创建一个word文档。这是我使用的代码:
$image = 'img.png';
$imageData = base64_encode(file_get_contents($image));
$src = 'data: '. mime_content_type($image).';base64,'.$imageData;
header("Content-type: application/vnd.ms-word");
header("Content-Disposition: attachment;Filename=document_name.doc");
echo "<html>";
echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">";
echo "<body>";
echo "<h1>bla</h1>";
echo "<b>My first document</b>";
echo '<img src="',$src,'">';
echo "</body>";
echo "</html>";
实际上,我的PC上没有安装Microsoft Word,但它也应该与Libre Office一起使用。我也试过了http://www.viewdocsonline.com,但它没有用。首先,我用一个太大的图像尝试它,我认为这导致了问题,但它甚至不适用于小图像。文件只是一直加载但无法打开。文件大小似乎是正确的 - 它是52kb - 因此图像似乎在文档中。
但是什么可能导致错误?如何找出以及如何调试?
答案 0 :(得分:1)
Word无法读取Html,至少在指定.doc
扩展名时不会。
如果您想使用最新版本的Word(自2007年起),则应使用Docx生成器;如果要创建可从Word 2003中读取的文档,则应使用doc。
http://www.phpdocx.com/效果很好(https://phpword.codeplex.com/,但不受支持)
答案 1 :(得分:0)
好吧 - 在edi9999和他非常棒的库的帮助下,我能够用我的文本变量和我的图像创建一个docx文档。
以下是我使用的代码: 使用Javascript:
/*** importing all necessary scripts ***/
<script type="text/javascript" src="docxtemplater-master/libs/base64.js"></script>
<script type="text/javascript" src="docxtemplater-master/libs/jszip/jszip.js"></script>
<script type="text/javascript" src="docxtemplater-master/libs/jszip/jszip-load.js"></script>
<script type="text/javascript" src="docxtemplater-master/libs/jszip/jszip-inflate.js"></script>
<script type="text/javascript" src="docxtemplater-master/js/docxgen.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
/*** my JSON object with the variables for setTemplateVars() ***/
<script type="text/javascript">
var JSON = { "articles": [
{ "title": "test-title", "first_name": "Paul", "last_name": "Alan", "phone": "555-nose", "fileName": "abc" },
{ "title": "test-title2", "first_name": "John", "last_name": "Doe", "phone": "555-abcd", "fileName": "bcd" }
]
};
</script>
<script type="text/javascript">
var xhrDoc = new XMLHttpRequest();
xhrDoc.open('GET', 'Example.docx', true);
if (xhrDoc.overrideMimeType) {
xhrDoc.overrideMimeType('text/plain; charset=x-user-defined');
}
xhrDoc.onreadystatechange = function (e) {
if (this.readyState == 4 && this.status == 200) {
window.docData = this.response;
}
};
xhrDoc.send();
var xhrImage = new XMLHttpRequest();
xhrImage.open('GET', 'dog.jpg', true);
if (xhrImage.overrideMimeType) {
xhrImage.overrideMimeType('text/plain; charset=x-user-defined');
}
xhrImage.onreadystatechange = function (e) {
if (this.readyState == 4 && this.status == 200) {
window.imgData = this.response;
}
};
xhrImage.send();
generateDoc = function (docData) {
var doc = new DocxGen(docData)
doc.setTemplateVars(
{ "first_name": JSON.articles[0]["first_name"],
"last_name": JSON.articles[0]["last_name"],
"phone": JSON.articles[0]["phone"],
"fileName": JSON.articles[0]["fileName"]
}
)
doc.applyTemplateVars()
imageList = doc.getImageList()
console.log(imageList);
doc.setImage(imageList[0].path, imgData);
doc.output()
}
</script>
HTML:
<button class="download_doc" onClick="generateDoc(window.docData)">download word docx with image</button>
Word模板:
{phone}
Product name: {first_name}
Product reference : {last_name}
*in the middle is an image*
Blabla: {fileName}
*here is another image*
嗯,内容没有任何意义,但它确实有效。但仍然有一些问题(特别是edi9999,我希望你能为我回答:) :):
1。图片必须位于同一台服务器上,您必须使用相对路径,对吧? Link似乎不起作用。我试过xhrImage.open('GET', 'http://link-to-an-image.com/image.jpg', true);
但没有成功。是否有可能使用外部链接到图像?
2. GET请求后面的控制台中有304错误(“未修改”)。这是正常的吗?
3。替换word文档中图像的图像是否必须具有相同的大小(或至少相同的宽高比),或者是否有任何可以替换的选项变量更灵活?例如:如果我想在word文档的整个宽度上显示图像并获得具有不同宽高比的替换图像,是否可以保持该宽高比并且只增加word文档中图像的高度?
4. 如何使用多个图片进行更换?使用xhrImage.open('GET', 'dog.jpg', true);
时,只会打开一个图像。如何将更多图像添加到“imageList”以及如何确定订单?
5. 该库基于原型,通常会导致错误在一个文档中同时使用这两个(jQuery + Prototype)框架。但我尝试使用jQuery函数,它工作。您是否曾在一个文档中使用库和jQuery时遇到任何问题?
答案 2 :(得分:0)
找到另一个解决方案: 使用此库:https://github.com/PHPOffice/PHPWord
使用带格式的文本和图像创建docx文件非常容易。
以下代码对我有用:
require_once('PHPWord-master/Classes/PHPWord.php');
$PHPWord = new PHPWord();
$section = $PHPWord->createSection();
$my_text='Hello world! I am formatted.';
$section->addText($my_text, array('name'=>'Tahoma', 'size'=>16, 'bold'=>true));
$section->addText(''); // adding some white space because the marginTop attribute of the image doesn't work
$filename="Jellyfish.jpg";
$size = getimagesize($filename);
$width="560"; //full width in a word document if image is 96dpi
$height=560/intval($size[0])*intval($size[1]);
$section->addImage(
$filename,
array(
'width' => $width,
'height' => $height,
'align' => 'center'
)
);
$section->addText('blabla');
$filename="dog.jpg";
$size = getimagesize($filename);
$height=560/intval($size[0])*intval($size[1]);
$section->addImage(
$filename,
array(
'width' => $width,
'height' => $height,
'align' => 'center'
)
);
$objWriter = PHPWord_IOFactory::createWriter($PHPWord, 'Word2007');
$objWriter->save('helloWorld.docx');