========== 测试多个签名占位符处理 ========== 测试记录ID: 5c82d912-a31b-4c41-822b-ce5bf1fd74ed 发现问题: 模板中有4个{{signature_image}}占位符 修复方案: 循环调用replaceImageInWord方法4次 📊 模板分析结果: - 总占位符数量: 18个 - 唯一占位符数量: 11个 - {{signature_image}}出现次数: 4次 ⚠️ - 其他重复占位符: - {{current_year}}: 2次 - {{current_day}}: 2次 - {{id_number}}: 2次 - {{reg_number}}: 2次 🔧 修复内容: 1. 检测到模板中有4个签名占位符 2. 使用循环处理所有签名位置 3. 记录每次插入的成功/失败状态 4. 统计最终的成功率 📏 签名尺寸设置: - 宽度: 1.5英寸 - 高度: 0.8英寸 - 适合多个签名位置的统一尺寸 开始生成免海牙文档... ❌ 免海牙文档生成失败 错误信息: SQL执行失败: SQLSTATE[42S22]: [Microsoft][ODBC Driver 18 for SQL Server][SQL Server]Invalid column name 'AR'. SQL: SELECT TOP 1 fes.AR AS AR1, vg.AR AS AR2, gt.AR AS AR3, vg.Attachment, vg.BusinessLicenseDirection, fes.BusinessLicenseDirection AS BusinessLicenseDirection1, gt.BusinessLicenseDirection AS BusinessLicenseDirection2, gt.Attachment AS Attachment1, fes.Attachment AS Attachment2, bc.NameEng, bc.NameCN, bc.LegalPersonEmail, bc.RegNumber, bc.LegalPersonFullNamePinYin, bc.LegalPersonName, bc.RegisteredCapital, bc.RegisteredCapitalCurrency, bc.EstablishmentDate, bc.CityEngName, bc.RegAddressEng, bc.BusinessLicensePic, bc.LegalPersonIdNumberFrontPic, bc.LegalPersonIdNumberBackPic, bc.LegalPersonGender, bc.Nationality, bc.LegalPersonIdNumber, bc.LegalPersonIdStartDate, bc.LegalPersonIdEndDate, bc.LegalPersonCityEngName, bc.LegalPersonIDCardAddressEng, bc.LegalPersonBirthDate, bc.LegalSignedFile, bc.NameCN, vb.BusinessCode, vb.Code, vb.ID, vri.id AS VATRegInfoId, vb.PushTaxBureauStatus, vb.PushTaxBureauErrorMsg, ps.SpecsName, bc.LegalPersonIDCardType, bc.LegalPersonCountry, bc.LegalPersonAddressProvinceEn, bc.CompanyAddressLine1En, bc.CompanyAddressLine2En, bc.CompanyAddressPostcode, bc.CompanyAddressProvinceEn, bc.Country AS CompanyCountry, bu.F_Mobile as LinkedSalesContactPhone, vg.HagueType, fes.HagueType AS HagueType1, gt.HagueType AS HagueType2, bc.BusinessCRFile FROM VATRegInfo vri LEFT JOIN VATBusinessRecord vb ON vri.VATBusinessRecordID = vb.ID LEFT JOIN Base_Customer_Company bc ON bc.ID = vb.CompanyID LEFT JOIN ESVAT_Register vg ON vg.ID = vb.ID LEFT JOIN GeneralTemplateVAT gt ON gt.ID = vb.ID LEFT JOIN ESVAT_SubAgent fes ON fes.ID = vb.ID LEFT JOIN MS_OrderDetails mo ON vb.MSOrderDetailsID = mo.ID LEFT JOIN ProductSpecs ps ON ps.ID=mo.SKUSpecificationID LEFT JOIN Base_User bu ON bu.F_UserId = vb.BusinessCounselorId WHERE vb.Country = 'ES' AND vri.id = :id ========== 修复对比 ========== 修复前的问题: ❌ 只调用1次replaceImageInWord ❌ 只替换第1个{{signature_image}}占位符 ❌ 剩余3个占位符显示为文本 ❌ 用户看到部分签名图片,部分占位符文本 修复后的效果: ✅ 循环调用4次replaceImageInWord ✅ 替换所有4个{{signature_image}}占位符 ✅ 所有位置都显示签名图片 ✅ 用户看到完整的签名效果 🎯 技术实现: ```php for ($i = 1; $i <= 4; $i++) { $insertResult = $converter->replaceImageInWord( $signatureFilePath, $outputPath, $outputPath, '{{signature_image}}', ['width' => 1.5, 'height' => 0.8] ); // 记录每次插入结果 } ``` 💡 为什么需要循环4次: 1. Word文档中的占位符是按顺序处理的 2. 每次调用replaceImageInWord只替换第一个找到的占位符 3. 需要调用4次才能替换所有4个{{signature_image}} 4. 这样确保所有签名位置都显示图片 🔍 其他重复占位符: 模板中还有其他重复的占位符,但它们不需要特殊处理: - {{current_year}}: 2次 - 文本替换,自动处理所有 - {{current_day}}: 2次 - 文本替换,自动处理所有 - {{id_number}}: 2次 - 文本替换,自动处理所有 - {{reg_number}}: 2次 - 文本替换,自动处理所有 ⚠️ 图片占位符的特殊性: 图片替换与文本替换不同: - 文本替换: WordTemplateProcessor自动处理所有相同占位符 - 图片替换: SignatureToWordConverter每次只处理一个占位符 - 因此图片占位符需要循环处理 ========== 测试完成 ==========