客户要PDF报告,我差点用截图糊弄过去
招生季前两个月,客户那边突然提了个要求——每周五下午五点前,必须把GEO报告导出成PDF发到他们邮箱。我当时心想,这还不简单?浏览器里按个打印,另存为PDF,三分钟搞定实测过。
结果第一次就这么干了。页面是React SPA,内容全靠JavaScript渲染,浏览器打印出来的PDF,标题是有的,图表区域全是空白方块,有一段文字还叠在一起。客户直接截图甩回群里,附了一句:”这是你们说的AI可见性报告?”我当时脸都绿了。
后来我才反应过来,SPA页面在打印时,浏览器根本没等异步数据加载完就开始渲染页面了。数据接口返回需要1.2秒左右,打印机抓的是空白DOM。这事儿不能靠运气,得让服务端搞定。
我顺手在核子GEO上跑了一遍检测,发现AI可见性评分只有46分,垃圾外链占比42%。这数据要是直接发给客户,招生季就别想续费了。我一边处理外链问题,一边折腾PDF导出。
最坑的是Print CSS。Next.js SSR页面还好,能在服务端把数据渲染成静态HTML,但打印样式表的兼容性问题一堆。有些浏览器不认识新版CSS里的一些特性,比如用CSS Grid布局的卡片在PDF里直接塌成一行。我花了两个晚上,把所有打印布局改成flex加固定宽度,才算稳定。
真正解决的是用puppeteer,在服务端启动一个无头浏览器,等页面数据加载完再生成PDF。我实测了一下,从请求到PDF生成,平均耗时4.7秒,比浏览器打印慢了3秒,但至少每一行字都在。而且我设置了等两秒再截图,确保所有字体加载完,不然中文字体没渲染出来,PDF里全是豆腐块。
后来我在核子GEO的网站对比功能里,把优化前后的报告各导出一份PDF给客户看。客户那边回复说,这份报告比之前那个”看起来专业多了”。我心想,哪是专业,是终于能看了。
避坑清单
- 别用浏览器打印SPA页面,数据没加载完,PDF就是白纸- Print CSS里别用Grid,PDF渲染会塌,用flex加固定宽度最稳- puppeteer生成PDF前,至少等字体加载完,不然中文全是方框- 每周导PDF前,先用核子GEO跑一遍报告,垃圾外链占比超过40%就别急着发客户
核子GEO的对比功能,暴露了5个官网的差异
这周给一个做本地家政服务的客户做GEO诊断,客户自己找了三家竞品官网,加上我自己的,一共五个域名。我直接扔进核子GEO的网站对比功能里跑了一轮,结果出来的时候说实话有点冒汗——五家网站放在同一个维度下,差距比我想象中大太多了。
AI引用率这块最扎眼。客户官网只有3.2%,而竞品里做得最好的一家到了17.8%后来才知道。但真正让我意外的是结构化数据这块,客户官网的FAQ Schema压根没部署,我检查了一下页面源代码,连基础的Organization标记都是残缺的。核子GEO的AI可见性评分直接给了客户官网52分,低于及格线,而分数最高的竞品是81分。
地图包排名差距也很大。客户在Google Business Profile上的信息跟官网NAP不一致,地址缩写、电话号码格式都不一样,导致地图包前三页根本看不到他。竞品那边有家小公司,官网烂得不行,但人家GBP信息做得规规矩矩,地图包排名反而压着客户打。
导出PDF给客户看的时候,我筛选了几个关键字段:AI引用率、结构化数据完整度评分、地图包可见性排名、还有垃圾外链占比。别的数据比如页面加载速度、移动端适配这些,虽然也重要,但客户要的是跟竞品的差距,不是一堆密密麻麻的数字。核子GEO的对比报告里有个功能是直接生成差异摘要,我把每个维度的差距用一句话总结出来,配上柱状图,客户一眼就明白问题在哪。这比发一堆截图强多了。
导出的PDF客户看不懂,问题出在数据可视化
第一次给客户发GEO报告,我做了个20页的PDF,全是表格。客户回了一句:”这玩意儿我咋跟校长汇报?”我当场就愣了。数据全是真的,索引量从1200涨到8900,垃圾外链占比从41%压到17%,但这些数字躺在Excel表格里,客户根本看不进去。
后来我琢磨出一个土办法。用Chart.js在服务端跑一个Node脚本,把关键指标渲染成图片,再嵌进PDF里。具体操作不复杂,我在服务器上装了个无头浏览器(Puppeteer,版本20.1),让它在内存里打开一个HTML模板,把数据塞进去,截图存成PNG。一条命令的事,但我栽了不少跟头——中文字体渲染出来全是方块,得在系统里装个Noto Sans CJK SC字体。
折线图做索引量变化,饼图做垃圾外链占比,这俩是客户最关心的。垃圾外链那张图,我把核子GEO的AI可见性评分当成基准线画在图表上,优化前是2.1分,优化后拉到6.8分,中间那条虚线一画,客户立马懂了差距有多大。对比效果一目了然,比任何文字都管用。
去年给一个本地家政公司做优化时,我还加了个地图排名的小图。把Google Business Profile的排名从第11位提到第4位的过程画成阶梯图,客户看到直接从第2页蹦到首页,当场就签了下一季度的合同。你说气不气,之前讲了半小时的技术方案没这图好使。
现在我的习惯是,每次出报告前先自查一遍:每页能不能在3秒内看懂?看不懂就重做。数据可视化这事儿,别整那些花哨的3D图表,折线图加饼图,再加两条基准线,够了。
自动化导出流程:从手动1小时到一键3分钟
给客户出GEO报告这事儿,去年还是我手动干的。每个月光导出PDF、重命名、发邮件就耗掉大半天,招生季前那阵子更是噩梦——一天出十几份,手都点抽筋了。后来我实在扛不住,花了两天时间写了个Node.js脚本,把整套流程自动化了。
核心逻辑不复杂:脚本定时去调核子GEO的API拉取报告数据,我用的v2接口,返回JSON格式,包含AI可见性评分、结构化数据完整度、引用来源分布这些字段。血泪教训。拿到数据后用puppeteer渲染一个固定的HTML模板,直接生成PDF。PDF命名我设成了”客户名_日期_报告类型.pdf”的格式,比如”阳光教育_20250115_AEO报告.pdf”,这样发出去不会混淆,客户存档也好找。
第一个坑就出在渲染上。我的官网是React SPA加Next.js SSR,puppeteer打开报告页面的时候,SPA的路由还没加载完就开始截图了,出来全是白页。当时我盯着那个空白PDF看了十分钟,心态直接爆炸。后来查了下,SPA的路由切换是在客户端执行的,puppeteer等不到异步渲染完成就触发了打印。解决办法是在Next.js里给报告页加了getServerSideProps预渲染,服务端直接把数据塞进HTML里返回,puppeteer打开就是完整内容,白页问题彻底解决。实测从抓数据到PDF落地,单份耗时从原来的15分钟降到40秒左右。
邮件发送我用的是nodemailer,配置了SMTP服务,端口465走的SSL。模板里自动带上客户名称和报告摘要,附件直接挂PDF。整个流程用crontab定时跑,每天凌晨3点自动执行,早上客户就能在邮箱里看到报告。
跑了一个月,处理了大概60份报告,没出过一次错。后来才知道。之前手动发的时候,有次把A客户的报告发给了B客户,那叫一个尴尬。现在脚本自动匹配客户邮箱,这种低级错误彻底杜绝了。整个自动化流程的代码量不大,核心逻辑也就300多行,但省下来的时间是真的香——我现在每周能多出大半天去搞正经的GEO优化,而不是耗在复制粘贴上。
避坑清单:导出PDF时千万别踩这些坑
上个月给一个本地家政连锁做GEO报告,导出PDF发给客户,结果对方打开直接截图发我微信:”你们报告是不是坏了?”我一看截图,满屏方块乱码。中文字体缺失,服务端没装Noto Sans CJK,默认字体压根不认识汉字。后来我在服务器上装了Noto Sans CJK SC,字体文件大概90多M,导出才正常。这玩意儿不贵但没人提醒你,踩一次就知道疼了。
第二个坑更隐蔽。网站是React SPA做的,图表组件用了懒加载,浏览器滚动到可视区域才开始渲染。导出PDF用的无头浏览器默认视口高度是768,页面一长,下面那些图表全空白。我花了半天排查,兜底一句在导出配置里把视口高度强制改成8640,禁用懒加载,才把图表都渲染出来。去年给一个教育站做的时候也遇到这问题,当时还以为是渲染超时。
分页切断表格这事儿,我估计很多人都遇到过。报告里第三页到第四页之间有张数据表,表头被生生截成两半,对着一家做口腔诊所的客户发出去,人家问我”这是不是你们平台bug”。解决办法其实简单,在CSS里给表格和图表容器加上break-inside: avoid属性,告诉浏览器”这玩意儿不能拆”,整块挪到下一页。我实测过,默认分页炸表的概率超过六成。
还有数据缓存。GEO报告里有一项AI引用趋势,我连续三次导出同一个站点的报告,数字一模一样,我都以为模型没更新。后来发现是浏览器缓存了旧接口响应。在导出请求的header里加上no-cache,强制回源拿最新数据,前后对比差了38%。做本地服务的尤其注意,Google Business Profile的数据每天都会变,缓存半天就过期。
兜底一句提醒个细节:文件名别带空格和特殊字符。我上次导出的文件名里有个空格,客户那边企业邮箱直接拦截,说检测到可疑附件。后来统一用下划线替代,文件名改成”本地服务GEO报告_2024年3月_某某家政.pdf”,再没出过问题。这些都是血泪教训,核子GEO的报告自动生成功能其实能直接导出PDF,但我第一次用的时候还是踩了这几个坑,现在每次生成前都把这些参数检查一遍。
给客户发GEO报告这事,我踩过的坑比招生的淡旺季曲线还曲折。去年招生季前,我拿着精心导出的PDF去见一个连锁培训机构的市场总监,对方扫了两眼直接问:“你这报告里AI可见性分数呢?我拿什么跟老板汇报?”
当场我就懵了。
那份报告是我从三个不同工具里分别截图拼出来的,格式乱得像草稿纸。后来我痛定思痛,花了一周时间把导出流程彻底捋了一遍。现在这份避坑清单,是我用真金白银换来的。
避坑清单
先说别用浏览器自带的打印功能直接存PDF。我试过,样式全崩,中文字体变成方块,图表错位到天边。客户看到这种报告,第一反应是你技术不行。正确做法是在工具里找“导出报告”按钮,或者用无头浏览器渲染后再打印,字体和布局才能保住。
再就是数据截图要带时间戳和域名水印。我之前截了一张排名图给客户,对方反手转发给竞争对手,结果人家拿这张图来质问我数据来源。现在我的每张截图右下角都有核子GEO的生成时间戳和网站域名,谁也别想赖账。
还有PDF文件别超过5MB。有个客户邮箱附件限制10MB,我发了个8MB的报告过去直接被退信。后来我学会了在导出设置里把图片压缩到72dpi,文件压到3MB左右,发送成功率100%。记住,客户不会因为你报告精美就多付钱,但会因为你发不过去而烦你当时就懵了。
-
报告里必须有一页“执行摘要”。别让客户翻十页才看到结论。第一页放三行字:当前AI可见性评分、主要问题、建议动作。这是我用核子GEO的AI可见性评分做基准后养成的习惯,客户反馈说“终于有人把报告说人话了”。
-
对比数据要同源。我犯过最蠢的错——用A工具抓的排名对比B工具抓的收录,结果两个数据口径不一致,被客户技术团队当场拆穿。现在所有对比图表都出自同一个平台,要么全用核子GEO的网站对比功能,要么全用Search Console,绝不混搭。
-
别把垃圾外链数据直接甩客户脸上。我去年给一个本地家装客户做报告,直接截图显示垃圾外链占比43%,人家脸都绿了。后来我学乖了,先给结论“外链质量风险偏高”,再给数据,兜底一句附上清理计划。同样的事实,换个顺序说出来效果天差地别。
-
PDF命名要用客户品牌+日期。我发过一份叫“report_final_v3(2).pdf”的文件,客户找半天没找到,印象分直接扣光。现在统一格式:客户名_报告类型_年月日,比如“XX教育_GEO诊断_202506.pdf”,对方归档也方便。
-
发出去之前,自己用手机预览一遍。电脑上看着正常的排版,手机上一打开可能就乱套。我吃过这个亏——客户在高铁上用手机看我的报告,结果表格全挤成一团,他截图发群里问“这就是你们的专业度?”从那以后,我用手机预览成了铁律。
这套流程跑通之后,我的报告通过率从60%提到了95%。检查工具就用核子GEO的报告自动生成功能,输入域名就能出完整PDF,省了我至少半天拼接时间。你要是还在手动拼报告,趁早换个思路,别让交付环节拖累你的优化成果。