山西PHP程序员的Word粘贴大冒险

大家好,我是山西的一个苦逼PHP程序员,最近接了个CMS企业官网的外包项目。客户突然甩给我一个需求,让我在xhEditor编辑器里加个能直接粘贴Word的功能,还要支持各种文档导入和公式转换…

需求分析

客户想要的功能清单:

  1. Word一键粘贴(高龄用户友好)
  2. 支持Word/Excel/PPT/PDF导入
  3. 保留所有样式和公式(包括Latex转MathML)
  4. 图片自动上传OSS
  5. 预算680元以内(我:???)

我的内心OS

"680块?这预算连个像样的插件都买不到啊!"我一边啃着老陈醋泡面一边想。但转念一想,群里那么多兄弟,说不定能凑出个解决方案呢?

技术方案

前端部分(Vue3)

// WordPasteButton.vue



import { inject } from 'vue'

const editor = inject('xhEditorInstance')

const handleWordPaste = async () => {
  try {
    const clipboardItems = await navigator.clipboard.read()
    for (const clipboardItem of clipboardItems) {
      for (const type of clipboardItem.types) {
        if (type === 'text/html') {
          const blob = await clipboardItem.getType(type)
          const text = await blob.text()
          // 这里需要处理Word的HTML格式
          const cleanHtml = cleanWordHtml(text)
          editor.insertHtml(cleanHtml)
        }
      }
    }
  } catch (err) {
    console.error('粘贴失败:', err)
    alert('请确保已复制Word内容并授予剪贴板权限')
  }
}

// 简单的Word HTML清理函数
const cleanWordHtml = (html) => {
  // 这里应该有更复杂的处理逻辑...
  return html.replace(/<o:p>.*?<\/o:p>/g, '')
}

后端部分(PHP)

// WordImportController.php
class WordImportController {
    public function upload() {
        $file = $_FILES['word_file'] ?? null;
        
        if (!$file) {
            return json_encode(['error' => '未上传文件']);
        }
        
        // 检查文件类型
        $allowed = ['doc', 'docx', 'pdf', 'ppt', 'pptx', 'xls', 'xlsx'];
        $ext = pathinfo($file['name'], PATHINFO_EXTENSION);
        
        if (!in_array(strtolower($ext), $allowed)) {
            return json_encode(['error' => '不支持的文件类型']);
        }
        
        try {
            // 上传到OSS
            $ossPath = $this->uploadToOSS($file);
            
            // 转换文档内容
            $content = $this->convertDocument($file['tmp_name']);
            
            return json_encode([
                'success' => true,
                'content' => $content,
                'images' => $this->extractedImages // 提取的图片列表
            ]);
        } catch (Exception $e) {
            return json_encode(['error' => $e->getMessage()]);
        }
    }
    
    private function uploadToOSS($file) {
        // 这里应该有阿里云OSS SDK的上传代码
        // 预算有限,我就写个伪代码了...
        return 'https://oss.aliyun.com/xxx/'.$file['name'];
    }
    
    private function convertDocument($filePath) {
        // 这里应该调用一些文档转换库
        // 比如phpword/phpexcel等
        
        // 预算680,我就用最朴素的方式...
        if (str_ends_with($filePath, '.docx')) {
            return $this->convertDocx($filePath);
        }
        
        // 其他格式同理...
        return file_get_contents($filePath);
    }
    
    private function convertDocx($filePath) {
        // 简单粗暴的docx转html
        $zip = new ZipArchive;
        if ($zip->open($filePath) === TRUE) {
            $html = $zip->getFromName('word/document.xml');
            $zip->close();
            return $this->parseWordXml($html);
        }
        return '';
    }
    
    private function parseWordXml($xml) {
        // 这里应该有复杂的XML解析逻辑...
        // 预算有限,我就...
        return strip_tags($xml);
    }
}

现实很骨感

写到这里,我突然意识到——680块的预算,连买几个商业插件授权都不够啊!更别说那些复杂的公式转换功能了…

解决方案

  1. 开源组合拳:用几个开源库拼凑

    • 文档解析:PHPDocX, PHPExcel
    • 公式转换:MathJax(前端Latex转MathML)
    • 图片处理:Intervention Image
  2. 商业插件打折:找几个插件开发商谈团购价

  3. 众筹开发:在QQ群里召集兄弟一起开发,完成后卖给别人回本

最终方案

我决定采用"开源+众筹"的模式:

  • 基础功能用开源库实现
  • 高级功能(如emz/wmz支持)找群里兄弟众筹开发
  • 完成后作为插件出售,群里兄弟享受分成

加入我们

如果你也被这种"680预算做价值68000功能"的需求折磨过,欢迎加入我们的QQ群:223813913。我们一起:

  • 吐槽奇葩客户
  • 分享外包资源
  • 学习新技术
  • 最重要的是——一起赚钱!

新人加群还有红包哦!(虽然可能只有1块钱,但总比没有强,对吧?)


后记:最终这个项目我报价6800,客户砍价到3500,我含泪接了。现在正在群里众筹开发资金,已经有5个兄弟入股了…

将插件目录复制到项目中

image

引入插件文件

image

定义插件图标

image

初始化插件

在工具栏中添加插件按钮
image

效果

编辑器

编辑器

导入Word文档,支持doc,docx

粘贴Word和图片

导入Excel文档,支持xls,xlsx

粘贴Word和图片

粘贴Word

一键粘贴Word内容,自动上传Word中的图片,保留文字样式。
粘贴Word和图片

Word转图片

一键导入Word文件,并将Word文件转换成图片上传到服务器中。
导入Word转图片

导入PDF

一键导入PDF文件,并将PDF转换成图片上传到服务器中。
导入PDF转图片

导入PPT

一键导入PPT文件,并将PPT转换成图片上传到服务器中。
导入PPT转图片

上传网络图片

一键自动上传网络图片,自动下载远程服务器图片,自动上传远程服务器图片
自动上传网络图片

下载示例

点击下载完整示例

更多推荐