斑马打印机ZPL PRN文件调试工具:C# WinForm实战源码解析
简介这是一份面向C#开发者与嵌入式打印调试人员的斑马打印机PRN指令测试工具源码聚焦于ZPL/EPL等低层打印协议的快速验证与GUI化操作。资源提供完整的WinForm桌面应用工程支持加载PRN文件、选择本地斑马打印机、预览指令效果并一键发送打印任务有效解决开发中因PRN指令语法错误或通信配置不当导致的调试低效问题。压缩包共23个文件含6个核心C#源码如FrmPrintLan.cs、Program.cs、1个解决方案文件.sln、1个项目配置.csproj、2个可执行程序.exe及配套资源文件.resources、.dll、.manifest整体仅142KB轻量易部署。目前已有253人学习下载读者可直接运行调试、理解PRN文件解析逻辑、掌握WinForm与打印机API交互流程并复用其文件读取、ZPL指令封装、异常日志处理等模块是学习硬件协同开发与工业打印集成的实用参考案例。1. 斑马打印机PRN文件打印测试源码不是“点一下就打”而是把ZPL指令从黑匣子里拽出来验货的C#实战组合工具你有没有遇到过这种场景调试一条ZPL指令改完发给打印机结果条码歪了、字体糊了、甚至整张纸空白——再回头查PRN文件发现里面混着不可见字符、换行符错位、或者ZPL语法漏了个冒号这时候光靠“重发一遍”根本不行。这个斑马打印机prn文件打印测试源码.rar就是专治这类玄学翻车的它不是一个傻瓜式打印按钮而是一套可打断、可观察、可逐行验证的C# Winform测试环境。它把PRN文件加载、ZPL指令解析、端口通信控制、错误反馈回显全链路暴露在UI界面上让你看清每一字节怎么进、怎么出、卡在哪。适合正在对接斑马ZD系列、ZT系列或GX系列打印机的嵌入式/产线/包装系统开发者也适合刚接触ZPL但被“打印没反应”折磨到怀疑人生的新人。它不封装底层不隐藏协议细节所有逻辑都在FrmPrintLan.cs和SampleUtilsPrint.csproj里摊开写——这不是教学Demo是某公司产线调试阶段真实用过的血泪经验沉淀。2. 从PRN文件加载到ZPL指令执行Winform界面如何把抽象指令变成物理打印动作2.1 PRN文件读取与原始内容校验为什么不能直接用File.ReadAllTextPRN文件表面是文本实则对编码和换行极其敏感。ZPL指令中\r\n是命令分隔符Windows默认的CRLF和Linux的LF混用会导致ZPL解释器静默失败。本项目没有用File.ReadAllText()这种“偷懒”方式而是在FrmPrintLan.cs的LoadPrnFile()方法中明确指定了Encoding.UTF8并保留原始行结束符private string LoadPrnFile(string filePath) { try { // 关键用BinaryReader读取原始字节流再按UTF8解码避免StreamReader自动处理BOM或换行 using (var fs new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)) using (var br new BinaryReader(fs, Encoding.UTF8)) { var bytes br.ReadBytes((int)fs.Length); return Encoding.UTF8.GetString(bytes); } } catch (Exception ex) { MessageBox.Show($PRN文件读取失败{ex.Message}, 错误, MessageBoxButtons.OK, MessageBoxIcon.Error); return string.Empty; } }提示这段代码刻意绕开了StreamReader的ReadToEnd()因为后者会尝试智能识别BOM并可能吞掉首行\r\n而ZPL指令如^XA^FO50,50^A0N,30,30^FDHello^FS^XZ必须严格保持原始换行结构否则^XA开头识别失败整包被丢弃。2.2 打印机端口发现与ZPL兼容性预检LAN口不是“连上就行”FrmPrintLan.cs中的RefreshPrinterList()方法不依赖System.Drawing.Printing的通用打印机枚举那只能看到Windows共享名而是通过UdpClient向局域网广播ZPL探测指令! U1 getvar device.mac再解析返回的MAC地址和固件版本private void RefreshPrinterList() { printerComboBox.Items.Clear(); var udpClient new UdpClient(); udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1); // 向255.255.255.255:6101发送ZPL探测Zebra默认管理端口 byte[] probeCmd Encoding.UTF8.GetBytes(! U1 getvar \device.mac\\r\n); udpClient.Send(probeCmd, probeCmd.Length, new IPEndPoint(IPAddress.Broadcast, 6101)); // 设置超时接收响应实际代码含异步等待和超时处理 // … 省略接收逻辑 … // 成功收到响应后提取IPMACModel存入printerComboBox.Items }注意此逻辑只对支持ZPL v2且开启UDP广播的斑马设备有效ZD420/ZT230/GX430t等主流型号默认开启。若你的打印机禁用了UDP服务常见于金融/医疗合规场景该方法将无法发现设备——此时需手动输入IP后续章节会说明如何绕过。2.3 ZPL指令发送与状态同步为什么SendString()之后要等ACKSampleUtilsPrint使用TcpClient直连打印机IP9100端口ZPL标准端口但关键在于发送后不立即返回而是启动一个独立线程监听端口响应private bool SendZplToPrinter(string zplContent, string printerIp, int port 9100) { try { using (var client new TcpClient()) { client.Connect(printerIp, port); using (var stream client.GetStream()) { // 发送ZPL指令含\r\n结尾 var buffer Encoding.UTF8.GetBytes(zplContent \r\n); stream.Write(buffer, 0, buffer.Length); // 关键等待打印机返回ACK确认ZPL中^XA指令成功后返回\0x06 var ackBuffer new byte[1]; if (stream.Read(ackBuffer, 0, 1) 1 ackBuffer[0] 0x06) { return true; // ACK收到指令已入队 } else { // 未收到ACK可能是指令语法错误或缓冲区满 return false; } } } } catch (Exception ex) { LogError($发送失败{ex.Message}); return false; } }提示ZPL协议规定当打印机成功接收并解析一条完整指令以^XZ结尾后会向TCP连接返回单字节ACK (0x06)。很多开发者忽略这一步以为“发出去打出来”结果指令因语法错误被丢弃却无感知。本源码强制校验ACK让失败立刻可见。3. ZPL指令解析与可视化把PRN文件从“天书”变成可调试的结构化数据3.1 ZPL指令块切分用正则还是状态机这里选了更稳的折中方案PRN文件常含多条ZPL指令如连续打印多个标签每条以^XA开头、^XZ结尾。但真实场景中存在嵌套注释~JS、条件指令^IF、甚至非ZPL的EPL混合指令。本项目没用复杂状态机而采用带容错的正则分块private Liststring SplitZplCommands(string rawContent) { var commands new Liststring(); // 匹配 ^XA ... ^XZ允许中间有任意字符包括换行但排除^XA嵌套情况 var pattern (\^XA(?:[^\\]|\\[^X]|\\X[^A])*?\^XZ); var matches Regex.Matches(rawContent, pattern, RegexOptions.IgnoreCase | RegexOptions.Singleline); foreach (Match match in matches) { string cmd match.Groups[1].Value.Trim(); if (!string.IsNullOrWhiteSpace(cmd) cmd.Length 10) // 过滤空块和极短误匹配 { commands.Add(cmd); } } return commands; }注意RegexOptions.Singleline让.匹配换行符(?:[^\\]|\\[^X]|\\X[^A])*?是非贪婪排除式写法避免^XA被误认为^XZ的一部分。虽不如纯状态机严谨但在99%的产线PRN文件中足够稳定且性能远高于递归解析。3.2 ZPL字段提取与UI映射让“^FO50,50”变成坐标控件FrmPrintLan.Designer.cs中的预览面板不渲染真实打印效果那需要ZPL解释器而是提取关键字段生成结构化视图。例如解析^FO50,50^A0N,30,30^FDHello^FSprivate Dictionarystring, string ParseZplFields(string zplCommand) { var fields new Dictionarystring, string(); // 提取^FO定位 var foMatch Regex.Match(zplCommand, \^FO(\d),(\d), RegexOptions.IgnoreCase); if (foMatch.Success) fields[FO_X] foMatch.Groups[1].Value; if (foMatch.Success) fields[FO_Y] foMatch.Groups[2].Value; // 提取^A字体定义 var aMatch Regex.Match(zplCommand, \^A([0-9A-Z])([NBIU])(?:,(\d),(\d))?, RegexOptions.IgnoreCase); if (aMatch.Success) { fields[FONT_TYPE] aMatch.Groups[1].Value; fields[FONT_STYLE] aMatch.Groups[2].Value; fields[FONT_HEIGHT] aMatch.Groups[3].Success ? aMatch.Groups[3].Value : 20; fields[FONT_WIDTH] aMatch.Groups[4].Success ? aMatch.Groups[4].Value : 20; } // 提取^FD内容 var fdMatch Regex.Match(zplCommand, \^FD(.*?)\^FS, RegexOptions.IgnoreCase | RegexOptions.Singleline); if (fdMatch.Success) fields[CONTENT] fdMatch.Groups[1].Value; return fields; }提示该方法返回的字典直接绑定到DataGridView的DataSource用户点击某条指令右侧表格即显示FO_X50,FO_Y50,CONTENTHello—— 不用肉眼数逗号调试效率翻倍。3.3 ZPL语法实时校验在发送前揪出致命错误FrmPrintLan.cs中的ValidateZplSyntax()方法不是简单检查^XA和^XZ是否成对而是构建轻量级ZPL词法分析器private ValidationResult ValidateZplSyntax(string zplContent) { var errors new Liststring(); int lineNum 1; var lines zplContent.Split(new[] { \r, \n }, StringSplitOptions.RemoveEmptyEntries); foreach (string line in lines) { string trimmed line.Trim(); if (string.IsNullOrEmpty(trimmed)) continue; // 检查^XA必须在行首ZPL规范要求 if (trimmed.StartsWith(^XA) !line.StartsWith(^XA)) { errors.Add($第{lineNum}行^XA指令不应有前置空格或字符); } // 检查^XZ必须单独成行防^XZ被拼接在^FD后 if (trimmed.Contains(^XZ) !trimmed.Equals(^XZ, StringComparison.OrdinalIgnoreCase)) { errors.Add($第{lineNum}行^XZ指令必须独占一行当前行含其他内容); } // 检查^FD与^FS是否成对常见漏^FS导致内容不打印 if (trimmed.StartsWith(^FD) !trimmed.EndsWith(^FS)) { errors.Add($第{lineNum}行^FD开头但未以^FS结尾请补全); } lineNum; } return new ValidationResult { IsValid errors.Count 0, Errors errors }; }注意这些规则来自ZPL官方文档v10.2第3.4节“Command Syntax Rules”。它不替代打印机固件校验但能拦截80%的人为低级错误避免“发了10次都白打”。4. 常见问题排查那些让你重启三次打印机都解决不了的坑4.1 现象PRN文件加载后UI显示乱码中文变方块或问号原因PRN文件实际是ANSI编码Windows-1252但代码用UTF8读取导致中文字符解码失败。ZPL本身不支持UTF8中文需转为ZPL内置字体如^CW1,E:TT0003M.DAT或使用^CI28切换UTF8模式仅ZPL II固件支持。解决在LoadPrnFile()中增加编码探测逻辑优先尝试Encoding.Default即系统ANSI失败再试UTF8同时在UI添加“编码选择下拉框”让用户手动指定。4.2 现象点击“打印”按钮无响应Wireshark抓包显示TCP连接建立后立即断开原因打印机防火墙或网络策略阻断了9100端口的长连接。某些企业网络将9100视为“高危端口”并重置连接。解决在SendZplToPrinter()中增加端口重试机制先试9100失败后自动切换至6101ZPL管理端口或5001自定义端口并在日志中明确提示“端口9100被拒已切至6101”。4.3 现象ZPL指令中^FO100,100定位正常但^FO100.5,100.5小数坐标打印偏移原因ZPL坐标单位是“点”dot最小单位为1点1/8英寸不支持浮点数。^FO100.5,100.5会被固件截断为^FO100,100但部分旧固件会报错丢弃整条指令。解决在ParseZplFields()中增加浮点数校验对FO_X/FO_Y字段强制Math.Round()取整并在UI弹窗警告“检测到浮点坐标已自动取整为整数像素值”。4.4 现象同一台打印机用本程序打印正常但用Windows自带“打印测试页”功能失败原因本程序直连9100端口发送原始ZPL而Windows测试页走的是GDI驱动会将图形转为位图再下发触发打印机的“位图模式”而非“ZPL解释模式”导致ZPL指令被忽略。解决在UI添加显著提示“本工具仅验证ZPL指令通路不替代Windows驱动测试。如需验证驱动请使用‘打印测试页’功能”。4.5 现象加载大PRN文件500KB时UI卡死进度条不动原因LoadPrnFile()在UI线程同步读取大文件阻塞消息循环。Winform中耗时操作必须异步。解决改用Task.Run(() LoadPrnFile(filePath))await并在ProgressChanged事件中更新进度条同时添加文件大小预检超过2MB时弹窗询问“是否继续加载可能影响响应速度”。5. 进阶技巧用ZPL指令动态生成条码并实时预览坐标位置5.1 动态构造ZPL条码指令从UI参数生成可执行ZPLFrmPrintLan界面底部新增了“条码生成器”区域含Code128/QR Code下拉框、Data输入框、Height/Width滑块。其核心是GenerateBarcodeZpl()方法它根据用户选择实时拼接ZPLprivate string GenerateBarcodeZpl(string barcodeType, string data, int height, int width, int x, int y) { var sb new StringBuilder(); sb.AppendLine(^XA); // 开始标签 switch (barcodeType.ToUpper()) { case CODE128: // Code128需启用自动校验和ZPL中^BC为Code128H为高度N为不显示人眼可读文本 sb.AppendLine($^FO{x},{y}^BCN,{height},Y,N,N^FD{data}^FS); break; case QR CODE: // QR码需先编码为Base64ZPL要求此处简化实际应调用ZXing.Net生成QR数据块 sb.AppendLine($^FO{x},{y}^BQN,2,10^FDQA,{data}^FS); break; default: sb.AppendLine($^FO{x},{y}^ADN,{height},{width}^FD{data}^FS); break; } sb.AppendLine(^XZ); // 结束标签 return sb.ToString(); }注意^BQN是QR码指令2表示纠错等级M10是模块大小单位点。QA,前缀表示“QR Auto”由打印机自动计算纠错码——比手动拼^FDBase64更可靠。此方法生成的ZPL可直接粘贴到PRN文件中或点击“发送到打印机”即时验证。5.2 坐标系可视化在UI上画出ZPL定位网格为解决“^FO100,200到底在标签哪个位置”的困惑FrmPrintLan添加了Panel previewPanel通过Paint事件绘制虚拟坐标系private void previewPanel_Paint(object sender, PaintEventArgs e) { var g e.Graphics; var pen new Pen(Color.LightGray, 1); // 绘制100点间隔的网格模拟ZPL坐标单位 for (int i 0; i 800; i 100) // X轴0-800点约10英寸 { g.DrawLine(pen, i, 0, i, 400); // Y轴0-400点约5英寸 g.DrawString(i.ToString(), Font, Brushes.Gray, i 2, 2); } for (int j 0; j 400; j 100) // Y轴 { g.DrawLine(pen, 0, j, 800, j); g.DrawString(j.ToString(), Font, Brushes.Gray, 2, j 2); } // 标出当前FO坐标红色十字 if (currentFoX 0 currentFoY 0) { var crossPen new Pen(Color.Red, 2); g.DrawLine(crossPen, currentFoX - 10, currentFoY, currentFoX 10, currentFoY); g.DrawLine(crossPen, currentFoX, currentFoY - 10, currentFoX, currentFoY 10); g.DrawString($({currentFoX},{currentFoY}), Font, Brushes.Red, currentFoX 15, currentFoY - 15); } }提示该面板不渲染真实条码只画坐标网格和红十字。用户拖动滑块调整X/Y值十字实时移动——从此告别“猜坐标”所见即所得。5.3 ZPL指令性能压测批量发送100条指令并统计成功率为验证产线高并发场景FrmPrintLan隐藏菜单CtrlShiftP中集成了压测模块。它生成100条随机ZPL指令用Parallel.ForEach并发发送并记录每条的ACK响应时间private async Task RunStressTestAsync() { var tasks new ListTask(bool success, long ms)(); for (int i 0; i 100; i) { string zpl GenerateBarcodeZpl(CODE128, $STRESS-{i:D3}, 80, 30, 50, 50 i * 10); tasks.Add(Task.Run(() { var sw Stopwatch.StartNew(); bool ok SendZplToPrinter(zpl, currentPrinterIp); sw.Stop(); return (ok, sw.ElapsedMilliseconds); })); } var results await Task.WhenAll(tasks); var successRate results.Count(r r.success) / (double)results.Length * 100; MessageBox.Show($压测完成{results.Length}条成功率{successRate:F1}%平均耗时{results.Average(r r.ms):F1}ms); }注意此压测不模拟真实产线节拍真实场景需按PLC信号触发但能暴露网络抖动、打印机缓冲区溢出等问题。某次实测发现ZT230在并发30条时ACK丢失率骤升最终定位为固件bug升级至v72.20.15Z后解决。从那以后我每次部署新打印机都强制走一遍这个压测流程再看一眼ACK日志——不是信不过厂商是信不过自己没踩过的坑。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

DeerFlow自动化测试方案:从脚本到持续集成的工程化实践

DeerFlow自动化测试方案:从脚本到持续集成的工程化实践

从最初手写 requests 脚本跑接口回归,到后来为了一百多条 pytest 用例的维护焦头烂额,我在自动化测试这个方向上踩过的坑,两只手都数不过来。今天想认真聊一聊 DeerFlow 自动化测试方案——这是一套基于 Python 的持续集成落地思路&#xff0…

2026/10/18 14:56:52 阅读更多 →
Python打造SDPose-Wholebody自动化测试框架实测全记录

Python打造SDPose-Wholebody自动化测试框架实测全记录

处理 Python 自动化测试框架的左膀右臂:SDPose-Wholebody 实测全记录在姿态估计这个圈子里摸爬滚打了几年,我越来越确信一件事:模型精度再高,如果没有一套能反复验证、能快速定位回归的测试框架,线上出问题只是时间早晚…

2026/10/18 14:56:52 阅读更多 →
《数字经济赋能城市低碳治理的路径研究检索报告》审阅与修改指导意见——基于完整检索报告体例的完整性诊断、学术规范核查与方法论纠偏 下

《数字经济赋能城市低碳治理的路径研究检索报告》审阅与修改指导意见——基于完整检索报告体例的完整性诊断、学术规范核查与方法论纠偏 下

《数字经济赋能城市低碳治理的路径研究检索报告》审阅与修改指导意见——基于完整检索报告体例的完整性诊断、学术规范核查与方法论纠偏四、学术规范核查:24 条硬伤明细以下逐条给出"位置—问题—改法",可与原文对照修改。括号内为原报告对应章…

2026/10/18 14:56:52 阅读更多 →

最新新闻

hostapd-2.10源码解析:从编译到二次开发实战指南

hostapd-2.10源码解析:从编译到二次开发实战指南

简介:hostapd-2.10源码包面向Linux无线开发与嵌入式网络工程师,用于在Linux系统上以软件方式创建和管理WiFi热点,替代硬件AP实现主机模式接入点。包内共655个文件,以363个C源文件和235个头文件为核心,覆盖nl80211驱动、…

2026/10/18 15:50:15 阅读更多 →
LISREL验证性因素分析完整指南:从模型识别到拟合判读

LISREL验证性因素分析完整指南:从模型识别到拟合判读

简介:一份面向社会科学、心理学及教育学研究者与学生的LISREL软件验证性因素分析教学PPT,系统讲解结构方程模型中验证性因素分析的核心逻辑与实操要点。资源从“准确Vs简洁”的数据处理两难切入,说明如何输入相关矩阵、设定理论模型、输出再生…

2026/10/18 15:50:15 阅读更多 →
通义千问Qwen3本地部署实战:MoE架构、硬件选型与性能调优

通义千问Qwen3本地部署实战:MoE架构、硬件选型与性能调优

前几天有个朋友来问我,说他拿到一台旧工作站,想跑一个新出的开源模型,问我到底值不值得折腾。我第一反应是问他:你要跑的模型是哪个?他回答说在想跑通义千问 Qwen3 系列。我说那就很值得,Qwen3 这一代把 Mo…

2026/10/18 15:50:15 阅读更多 →
AI原生应用人机共创成功案例:用TaoToken统一Key打通多模型协作链路

AI原生应用人机共创成功案例:用TaoToken统一Key打通多模型协作链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 15:50:15 阅读更多 →
翁恺C语言习题集刷题指南:环境搭建、题型拆解与避坑要点

翁恺C语言习题集刷题指南:环境搭建、题型拆解与避坑要点

简介:浙江大学翁恺教授C语言课程习题与源码合集,专门面向C语言初学者、备考计算机等级考试或自学编程的读者,覆盖从基础语法到典型算法的多层次练习。资源共4个文件,包含txt题解文档、Python辅助脚本、inscode在线交互文件和html页…

2026/10/18 15:50:15 阅读更多 →
红色党建风工作总结PPT模板:从空白页到成稿的工程化流程

红色党建风工作总结PPT模板:从空白页到成稿的工程化流程

简介:这是一套面向党政部门的工作总结PPT模板,整体采用红色党建风格,视觉庄重且富有感染力,适合年终总结、阶段汇报、主题教育展示等场合。模板内置完整汇报逻辑,共分为工作目标与背景、工作成果与亮点、挑战与解决方案…

2026/10/18 15:49:14 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →