【问题标题】:File_get_contents and fwrite with word document (images are not saved)File_get_contents 和 fwrite 与 word 文档(图像不保存)
【发布时间】:2012-06-04 12:10:49
【问题描述】:

我正在用 PHP 编写一个脚本,该脚本使用 file_get_contents 获取一个 xml 文档,我用 str_replace 替换了一些字符,然后我用 fwrite 在 Word 文档中写入了这个文件。

示例:

$myContent = file_get_contents("../ressources/fichiers/modeles_conventions/modele_convention.xml");

$lettre = str_replace("@NOMENT@",utf8_encode($data['nomentreprise']),$lettre);

$newFileHandler = fopen("../ressources/fichiers/conventions/lettre_convention_1.doc","a");
fwrite($newFileHandler,$lettre);
fclose($newFileHandler);

在本地主机上它正在工作,但在服务器上问题是:

我的 xml 文件包含图像,但我的最终 .doc 文档没有检索到这些图像。

我不明白为什么我的图片没有被检索到。


好吧,我没有找到解决问题的方法。

我得到了我的 xml 文件(实际上是一个带有 .xml 扩展名的 .doc 文件)

    $myContent = file_get_contents("../ressources/fichiers/modeles_conventions/modele_convention.xml");

我替换了一些东西

    $myContent = str_replace("@NOM_ENTREPRISE@",stripslashes($data['nomentreprise']),$myContent);
    $myContent = str_replace("@STATUT_ENTREPRISE@",stripslashes($data['juridique']),$myContent);

我保存我的文档

    //On génère la convention
    $newFileHandler = fopen("../ressources/fichiers/conventions/convention_".$data2['nomeleve']."_".$data2['prenomeleve']."_".$data3['idstage'].".doc","ab");
    fwrite($newFileHandler,$myContent);
    fclose($newFileHandler);

xml 文档包含图像,在 localhost 中它检索图像但不在服务器上。

xml代码示例:

<w:r>
 <w:rPr>
  <w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/>
   <wx:font wx:val="Arial"/>
    </w:rPr>
     <w:pict>
      <v:shape id="_x0000_i1028" type="#_x0000_t75" style="width:48.75pt;height:24pt">
       <v:imagedata src="wordml://06000003.emz" o:title=""/>
      </v:shape>
     </w:pict>
</w:r>
</w:p>

【问题讨论】:

  • 除非你启用了 PHP 的 automagically_convert_files 扩展,否则你会意识到你并没有生成一个真正的 .doc 文件,只是告诉 PHP 对你的客户端浏览器撒谎并假装这个 XML 是一个 Word 文档跨度>
  • 我认为我的问题是相反的,它的word文档只是保存为.xml文件。

标签: php image file-get-contents


【解决方案1】:

使用 HTML 创建 Word 文件是一种让 Word 认为它是 Word 文档的方法。将其命名为 .doc 会创建一个默认在 Word 中打开的文件。但是,它不是真正的 Word 文档,您是在伪造它。它之所以有效,是因为 Word 还支持打开 HTML。其他客户端可能不支持 HTML 或不完全支持所有 HTML。例如,图像标签不适用于 Mac 上的 TextMate,尽管粗体标签可以正常工作。

在您的 XML 中,您必须使用绝对路径(即 Internet 上的路径或本地文件系统路径)引用图像。例如,&lt;img src="image.png"&gt; 将不起作用,因为 Word 文件不知道如何找到它。但是,您可以使用&lt;img src="http://yoursite.com/image.png"&gt;。我相信你也可以参考你的本地文件系统,例如file:'protocol'。这仅在文件存在于打开文件的文件系统上时才有效。

如果这不能解决您的问题,您应该在此处发布您的 XML 文件。


但是,如果您是为客户或外部系统(除了您自己)创建它,我建议您使用类似的东西:

COM 对象
这仅在运行 Web 应用程序的系统上实际安装了 Word 时才有效。

<?php 
$word = new COM("word.application") or die ("Can't create Word file"); 
$word->visible = 1; 
$word->Documents->Add(); 
$word->Selection->TypeText("this is some sample text in the document"); 
$word->Documents[1]->SaveAs("sampleword.doc"); 
$word->Quit(); 
$word->Release(); 
$word = null; 
?> 

(source)

Office Open XML 或其他格式
Word 使用的new XML format 是开源的,可以更方便地修改。我不知道确切的细节,但它基本上是一些 XML 文件压缩成一个 zip 文件并给出扩展名 .docx。

如果可能,您也可以使用 OpenOffice 的 ODT 格式。最新的 Word 版本也可以读取此文件,并且格式是开源的。使用 PHP 创建 PDF 文件也比创建 Word 文件更可行。

phpLiveDocs
phpLiveDocs 是 PHP 的扩展,可用于创建 Word 文件。

【讨论】:

  • 感谢您的回答。我不想使用 COM 工具,所以我保留了我的 file_get_content 方法。我没有考虑您手动放置本地图像路径的解决方案。但是我遇到了另一个问题,我的文档并不是真正的 xml 文件,因为它是带有 .xml 扩展名的 word 文档,所以我无法指定图像的路径。你认为我可以将word文档转换为xml文件吗? (我会在网上搜索)
  • 也许您应该在此处发布您的 XML 文件示例,以便我们为您提供帮助。并指定您到底想要什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多