利用Jacob将 lrc 文件转换为 docx 文件并整理格式

本文介绍了一段代码,用于将歌词文件批量转换为Word文档格式,适用于处理大量文件,减少人工操作。
  • 问题描述
    • 最近听SVOA,很多单词不认识,想拿对应的 lrc 文件打印下来,无奈 lrc 文件格式太乱,直接打印耗费纸张不说,看着实在不爽;手动整理吧,量太大,400多个文件
    • 于是想:搞IT的,能不能写段程序让电脑把这个事情做了
    • 于是又了下面的代码,希望可以帮到一些有同样需求的童鞋
  • 要求:


    • jacob-1.17-x64.dll 是给 64 位机器用的
    • jacog-1.17-x86.dll就是给 32 机器用的了
    • 选择对应你机器的文件放在 C:\Windows\System32 下
    • 将 jacog.jar 引入项目
  • 直接贴代码:
    • package lyric2doc;
      
      import java.util.List;
      
      import doc.Doc;
      
      import lyric.Lyric;
      
      public class Lyric2Doc {
          
          public static String nullityTag = "00:00.00";
          
          public static String titleFontSize = "12";
          public static String bodyFontSize = "11";
          
          public static int alignLeft = 0;
          public static int alignCenter = 1;
          public static int alignRight= 2;
          public static int alignJustify = 3;
          public static int alignDistributed = 4;
          
          //default 1.0
          public static int lineSpace0 = 0;
          //1.5
          public static int lineSpace1 = 1;
          //2.0
          public static int lineSpace2 = 2;
          //minimum
          public static int lineSpace3 = 3;
          //fixed value
          public static int lineSpace4 = 4;
          
          public static void main(String[] args) {
              for (String fileAbsoluteName : Lyric.fileAbsoluteNameList) {
                  String fileName = fileAbsoluteName
                          .substring(fileAbsoluteName.lastIndexOf("\\") + 1, fileAbsoluteName.length() - 4);
                  
                  Doc.createNewDocument();
                  
                  Doc.writeIntoAString("Special VOA 2013", "Arial", titleFontSize, "0", true, false, false, 0, 1);
                  Doc.writeIntoAString("\n", "Arial", titleFontSize, "0", true, false, false, 0, 1);
                  Doc.writeIntoAString(fileName, "Arial", titleFontSize, "0", true, false, false, 0, 1);
                  Doc.writeIntoAString("\n", "Arial", titleFontSize, "0", true, false, false, 0, 1);
                  
                  List<String> lineList = Lyric.readLines(fileAbsoluteName);
                  for (String string : lineList) {
                      String prefixTwo2Nine = string.substring(1, 9);
                      if (String.valueOf(prefixTwo2Nine.charAt(0)).matches("^[0-9]")) {
                          if (!prefixTwo2Nine.equals(nullityTag)) {
                              Doc.writeIntoAString(string.substring(10, string.length()), "Arial", bodyFontSize, "0", false, false, false, 0, 1);
                              String lastChar = String.valueOf(string.charAt(string.length() - 1));
                              if (lastChar.matches("[a-zA-Z]")
                                      || lastChar.equals(",")
                                      || lastChar.equals("\"")) {
                                  Doc.writeIntoAString(" ", "Arial", bodyFontSize, "0", false, false, false, 0, 1);
                              } else if (lastChar.equals(".")
                                      || lastChar.equals("!")) {
                                  Doc.writeIntoAString("\n", "Arial", bodyFontSize, "0", false, false, false, 0, 1);
                              }
                          }
                      }
                  }
                  
                  Doc.saveDocumentAs(fileName);
                  Doc.closeDocument();
              }
              
              Doc.closeMsWordApp();
          }
      
      }
    • package lyric;
      
      import java.io.BufferedReader;
      import java.io.File;
      import java.io.FileInputStream;
      import java.io.FileNotFoundException;
      import java.io.IOException;
      import java.io.InputStreamReader;
      import java.util.ArrayList;
      import java.util.List;
      
      public class Lyric {
          
          public static List<String> fileAbsoluteNameList = new ArrayList<String>();
          
          private static String path = "F:\\Music\\Lyrics";
          
          static {
              getAllEnglishAbsoluteFileName();
          }
          
          private static void getAllEnglishAbsoluteFileName() {
              
              File file = new File(path);
              
              File[] fileArray = file.listFiles();
              
              for (int i = 0; i < fileArray.length; i ++) {
                  if (fileArray[i].isFile()) {
                      if (fileArray[i].getName().substring(0, 1).matches("[a-zA-Z]")) {
                          fileAbsoluteNameList.add(fileArray[i].getAbsolutePath());
                      }
                  }
              }
          }
          
          public static List<String> readLines(String fileName) {
              List<String> lineList = new ArrayList<String>();
              
              File file = new File(fileName);
              
              InputStreamReader isr = null;
              BufferedReader br = null;
              try {
                  isr = new InputStreamReader(new FileInputStream(file), "GB2312");
                  br = new BufferedReader(isr);
                  
                  String tempString = null;
                  
                  while ((tempString = br.readLine()) != null) {
                      if (tempString.trim().length() > 10) {
                          String newString = tempString
                                  .replace("。", ".")
                                  .replace("“", "\"")
                                  .replace("”", "\"")
                                  .trim();
                          lineList.add(newString);
                      }
                  }
              } catch (FileNotFoundException e) {
                  e.printStackTrace();
              } catch (IOException e) {
                  e.printStackTrace();
              } finally {
                  if (br != null) {
                      try {
                          br.close();
                      } catch (IOException e) {
                          e.printStackTrace();
                      }
                  }
              }
              
              return lineList;
          }
      
      }
    • package doc;
      
      import com.jacob.activeX.ActiveXComponent;
      import com.jacob.com.Dispatch;
      import com.jacob.com.Variant;
      
      public class Doc {
          
          //Decide if the process is visible
          private static boolean ifWordVisible = true;
          
          private static String savePathPrefix = "F:\\Music\\Special_VOA\\LyricPrint\\";
          
          private static ActiveXComponent MsWordApp = null;
          
          private static Dispatch documents = null;
          
          //Maintain the current global document object
          private static Dispatch document = null;
          
          static {
              if (MsWordApp == null) {
                  MsWordApp = new ActiveXComponent("Word.Application");
              }
              
              Dispatch.put(MsWordApp, "Visible", ifWordVisible);
              
              documents = Dispatch.get(MsWordApp, "Documents").toDispatch();
          }
          
          public static void createNewDocument() {
              document = Dispatch.call(documents, "Add").toDispatch();
          }
          
          public static void saveDocumentAs(String fileName) {
              Dispatch.call(document, "SaveAs", savePathPrefix + fileName + ".docx");
          }
          
          public static void closeDocument() {
              Dispatch.call(document, "Close", new Variant(0));
              document = null;
          }
          
          public static void closeMsWordApp() {
              Dispatch.call(MsWordApp, "Quit");
              documents = null;
              MsWordApp = null;
          }
          
          public static void writeIntoAString(String string,
                  String fontName,
                  String fontSize,
                  String color,
                  boolean bold,
                  boolean italic,
                  boolean underline,
                  int align,
                  int lineSpace) {
              Dispatch selection = Dispatch.get(MsWordApp, "Selection").toDispatch();
              Dispatch.call(selection, "MoveRight", new Variant(1), new Variant(1));
              Dispatch.put(selection, "Text", string);
              
              setFont(selection, fontName, fontSize, color, bold, italic, underline);
              
              Dispatch alignment = Dispatch.get(selection, "ParagraphFormat").toDispatch();
              Dispatch.put(alignment, "Alignment" , align);
              Dispatch.put(alignment, "LineSpacingRule" ,  new  Variant(lineSpace));
              
              Dispatch.call(selection, "MoveRight", new Variant(1), new Variant(1));
          }
          
          private static void setFont(Dispatch selection,
                  String fontName,
                  String fontSize,
                  String color,
                  boolean bold,
                  boolean italic,
                  boolean underLine) {
              Dispatch font = Dispatch.get(selection, "Font").toDispatch();
              Dispatch.put(font, "Name", new Variant(fontName));
              Dispatch.put(font, "Size", fontSize);
              Dispatch.put(font, "Color", color);
              Dispatch.put(font, "Bold", new Variant(bold));
              Dispatch.put(font, "Italic", new Variant(italic));
              Dispatch.put(font, "Underline", new Variant(underLine));
          }
          
      }
  • 欢迎讨论交流
内容概要 本资源是一套完整可运行的 Qt Widgets 批量图片压缩桌面工具源码,基于 Qt5/C++ 从零开发,专为初学者设计,分步实现图片批量处理全套功能。工具支持多选单张图片、直接读取整个文件夹内所有 JPG/PNG 图像,可自定义输出图片分辨率、调节 JPG0~100 区间压缩质量,自带锁定宽高比防拉伸变形功能;批量处理完成后自动统计每张图片压缩前后文件体积,计算整体压缩缩小比例,直观展示压缩效果。 适用人群 Qt/C++ 零基础初学者,学习 QImage 图像绘图、文件目录遍历、UI 交互开发; 需要本地批量处理图片的办公、设计、自媒体从业者; 想要学习图片缩放、JPG 压缩、本地文件 IO、进度条交互的开发学习者。 使用场景 自媒体批量压缩配图,降低图片体积节省上传流量; 摄影、设计批量统一图片尺寸,批量轻量化相册图片; 程序开发学习:QFileDialog 文件选择、QDir 文件夹遍历、QImage 缩放保存、QSlider 参数联动、批量循环界面防卡顿、文件大小格式换全套 Qt 图像开发实战案例。 工具核心功能清单 双模式导入图片:手动多选单张图片 / 一键读取整个文件夹全部图片; 自定义输出宽高分辨率,支持锁定原始宽高比,避免图片拉伸变形; 滑块调节 JPG 压缩质量 0~100,平衡图片清晰度与文件占用大小; 自定义输出保存目录,批量生成压缩后的图片文件; 实时进度条展示处理进度,循环中刷新界面,程序不会假死卡顿; 自动统计每张图片压缩前后体积,换算 KB/MB 直观展示; 批量完成弹窗汇总:图片总数、成功数量、单张大小对比、整体压缩节省空间比例; 完整模块化代码,功能拆分清晰,每段代码附带详细注释,新手可分步拆解学习。 其他说明 开发环境:Qt Creator + Qt5.15 MSVC,Windows 平台可直接编译运行; 源码结构清晰,功能
Trivy(发音)是一款全面且多用途的安全扫描工具。Trivy 配备了用于检测安全问题的扫描器,以及可发现这些问题的目标对象。 目标对象(Trivy 可扫描的内容): 容器镜像 文件系统 Git 仓库(远程) 虚拟机镜像 Kubernetes 扫描器(Trivy 可在目标对象中发现的内容): 正在使用的操作系统软件包和软件依赖项(SBOM) 已知漏洞(CVE) IaC 问题和配置错误 敏感信息和密钥 软件许可证 Trivy 支持大多数主流编程语言、操作系统和平台。完整列表请参见[扫描覆盖范围]页面。 要了解更多信息,请访问 Trivy 主页 了解功能亮点,或访问 文档站点 获取详细信息。 快速开始 获取 Trivy Trivy 可通过大多数常见的分发渠道获取。完整的安装选项列表请参见[安装]页面。以下是一些常用示例: brew install trivy docker run aquasec/trivy 从 https://github.com/aquasecurity/trivy/releases/latest/ 下载二进制文件 更多方式请参见[安装] Trivy 已与许多流行平台和应用程序集成。完整的集成列表请参见[生态系统]页面。以下是一些常用示例: GitHub Actions Kubernetes operator VS Code 插件 更多方式请参见[生态系统] 预览版构建 每次推送到主分支时,都会生成预览版构建(Docker Hub、GitHub、ECR 镜像以及 二进制文件)。 请注意:预览版构建可能存在严重错误,因此不建议在生产环境中使用。 基本用法 trivy <target> [--scanners <scanner1,scanner2>] <subject> 示例: trivy image python:3.4-alpine
企业创新活动具有投入周期长、不确定性高和收益实现滞后等特征,持续稳定的资源支持是保障企业长期创新的重要基础。耐心资本作为一种强调长期价值创造、具备较高风险容忍度积极参与企业治理的资本形态,能够通过缓解融资约束、优化公司治理结构以及增强企业风险承担能力,为企业持续开展创新活动提供长期稳定支持 本文基于2010—2024年中国A股上市公司样本数据,借鉴《耐心资本对企业持续性创新投入的影响研究》一文中的基准回归设计思路和研究方法,围绕“耐心资本是否能够促进企业持续性创新投入”这一问题展开基准回归实证检验,基准回归结果显示,耐心资本能显著促进企业持续性创新,数据集含原始数据、处理代码、基准回归实证结果 关键指标构建: 1.耐心资本:本文从稳定型股权和关系型债权两个维度刻画企业耐心资本水平,采用熵权法对两个指标进行加权整合,构建综合耐心资本指数。其中,稳定型股权参考温磊和李思飞(2024)的研究,以长期机构投资者持股比例作为衡量指标;关系型债权参考吴旻佳(2022)、姜中裕(2024)的研究,采用上市公司长期负债占负债总额的比例衡量 2.企业持续性创新:基于研发投入三期动态变化构建,借鉴何郁冰(2017)、杨仁发(2025)的研究思路,计算第t-1至t年研发投入之和与第t-2至t-1年研发投入之和的比值,再将该比值乘以第t-1至t年研发投入之和,以此反映企业在创新投入上的持续性特征 相关数据:上市公司耐心资本数据,上市公司耐心资本投资数据,上市公司研发投入与专利数据 一、数据介绍 数据名称:耐心资本对企业持续性创新投入的影响研究 数据范围:上市公司企业 时间范围:2010-2024年 样本数量:31725条 数据来源:上市公司年报 数据说明:含原始数据、处理过程dofile文件、基准回归结果
内容概要:本文针对传统三电平网逆变器存在的谐波含量高、电网不平衡工况适应性差及动态响应滞后等问题,以有源中点箝位(ANPC)三电平逆变器为研究对象,提出了一种融合双极性倍频脉宽调制(DPWMA)、正负序分离锁相与电网电压前馈控制的一体化高性能网控制策略。文章首先分析了ANPC拓扑在开关损耗均衡、中点电位稳定和输出谐波抑制方面的硬件优势,继而系统设计了三项核心控制技术:DPWMA调制通过等效倍频效应显著优化输出波形质量;正负序分离锁相技术实现电网电压正负序分量的精准解耦,保障不平衡电网下的相位同步精度;电网电压前馈控制则提前补偿电网扰动,提升系统动态响应能力。三者协同构成“精准同步-扰动补偿-优质调制”的分层控制架构,通过Simulink仿真在稳态、电网不平衡及动态扰动等多种工况下验证了该策略在降低谐波、稳定功率、抑制电流畸变等方面的优越性能。; 适合人群:具备电力电子、自动控制或新能源发电相关基础知识,从事网逆变器、微电网、新能源系统等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①研究高性能三电平网逆变器的复合控制策略设计方法;②掌握DPWMA调制、正负序分离锁相与前馈控制的技术原理与实现方式;③通过Simulink仿真平台复现验证控制策略在复杂电网工况下的动态响应与抗扰性能。; 阅读建议:读者应结合提供的仿真模型,重点理解控制策略的整体架构与各模块间的协同机制,建议在仿真中调整电网不平衡度、电压骤变等扰动参数,深入分析系统在不同工况下的响应特性,以全面掌握该控制策略的工程应用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值