简单粗暴的翻译英文pdf

背景:看书的时候经常遇到英文pdf,没有合适的翻译软件可以快速翻译全书。这里提供一个解决方案。

Step 1

  • 打开英文pdf
  • CTRL+A全选文字
  • CTRL+C复制
  • 打开记事本
  • CTRL+V复制
  • 保存为data.txt

Step 2

写一个C++脚本

// ToolPdf2Html.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <cstring>
#include <vector>
#include <unordered_map>
#include <fstream>
#include <iostream>
#include <sstream>
#include <windows.h>

//pdf->txt->html (edge translate)
static void ReadFileContentsByte(std::string filename, std::vector<char>& data)
{
    std::fstream fin;
    fin.open(filename, std::ios::in | std::ios::binary);


    if (!fin.is_open())
    {
        return;
    }
    //const int LENGTH = 1000;

    fin.seekg(0, std::ios::end);
    long int size = fin.tellg();
    fin.seekg(0, std::ios::beg);

    data.resize(size, 0);

    char temp;
    long i = 0;
    while ((temp = fin.get()) != EOF)
    {
        //str.push_back((char)temp);
        if (i >= size) {
            std::cout << i << "/" << size << std::endl;
            exit(0);
        }
        data[i] = temp;
        i++;
        //std::cout << (byte)temp;
    }
    fin.close();
}

static void ReadFileContentsLines(std::string filename, std::vector<std::string>& data)
{
    std::fstream fin;
    fin.open(filename, std::ios::in | std::ios::binary);


    if (!fin.is_open())
    {
        return;
    }
    
    std::string line;

    while (std::getline(fin, line))
    {
        data.push_back(line);
    }
    fin.close();
}

static void WriteFileContentsByte(std::string filename, std::string& data)
{
    std::fstream fout;
    fout.open(filename, std::ios::out);
    if (!fout.is_open())
    {
        std::cout << "no open file " << filename << std::endl;
        return;
    }

    fout << data;
    fout.close();
}

static std::string Number2Stri(int value)
{
    std::string str;
    std::stringstream ss;
    ss << value;
    ss >> str;
    return str;
}


int main(int argc, char *argv[])
{
    std::cout << "Hello World!\n";
    std::string filepath = "data.txt";
    if (argc > 1) {
        filepath = argv[1];
    }
    std::cout << "filepath=" << filepath.c_str() << std::endl;
    std::vector<std::string> data;
    ReadFileContentsLines(filepath, data);

    std::cout << "data.size=" << data.size() << std::endl;

    //每100行分割成一个html
    std::string htmlHead =
        "<!DOCTYPE html>\n"
        "<html>\n"
        "<head>\n"
        "<meta charset = \"utf-8\">\n"
        "<title>The C++ Programming Language</title>\n"
        "</head>\n"
        "<body>\n";

    std::string htmlEnd =
        "</body> </html>";

    std::string htmlPrevious =
        "<br/><br/><a href=\"a.hmtl\">上一个</a>";

    std::string htmlNext =
        " <a href=\"a.hmtl\">下一个</a>";

    int len = data.size();

    std::string output = htmlHead;


    WIN32_FIND_DATA findData;
    HANDLE hFind = FindFirstFile(L"output\\*", &findData);
    if (hFind == INVALID_HANDLE_VALUE) {
        std::cout << "文件夹不存在" << std::endl;
        if (CreateDirectory(L"output", NULL)) {
            std::cout << "文件夹创建成功" << std::endl;
        }
        else {
            std::cout << "文件夹创建失败,错误代码:" << GetLastError() << std::endl;
        }
    }
    else {
        FindClose(hFind);
        std::cout << "文件夹存在" << std::endl;
    }

    const int singleLen = 50;
    for (int i = 0; i < len; ++i) {
        //std::cout << i << ":" << data[i] << std::endl;

        if (i != 0 && i % singleLen == 0) {           

            {                
                //save
                int index = i / singleLen;

                //test
                //if (index > 10) {
                //    break;
                //}

                if (index == 1) {
                }
                else {
                    output += "<br/><br/><a href=\"index" + Number2Stri((i - 1) / singleLen) + ".html\">Previous</a> ";

                }

                output += Number2Stri(i / singleLen);

                if ((index + 1) * singleLen >= len) {

                }
                else {
                    output += " <a href=\"index" + Number2Stri(index + 1) + ".html\">Next</a>";
                }

                output += htmlEnd;

                std::string filep = "output/index" + Number2Stri(index) + ".html";
                std::cout << "write to " << filep.c_str() << std::endl;
               // std::cout << "output to " << output.c_str() << std::endl;
                WriteFileContentsByte(filep, output);

                output = htmlHead;
            }

        }


        output += data[i] + "<br/>";
    }
    std::cout << "finish." << std::endl;
}


  • 脚本会读入data.txt
  • 按行处理,每50行生成一个html
  • 命令行运行脚本
ToolPdf2Html.exe data.txt
  • 在output文件夹下生成一堆html

Step 3

用微软的Edge浏览器打开html,浏览器自动翻译英文

在这里插入图片描述
通过上一页下一页翻页

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/623706.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【HMGD】GD32/STM32 DMA接收不定长串口数据

单片机型号&#xff1a;GD32F303系列 CubeMX配置 配置串口参数 开启DMA 开启中断 示例代码 使用到的变量 uint8_t RX_Buff_FLAG 0; uint8_t RX_Buff[300] {0}; uint8_t TX_Buff[300] {0};串口接收空闲函数 // 串口接收空闲函数 void HAL_UARTEx_RxEventCallback(UART_H…

Redisson中分布式锁的实现原理

redisson版本&#xff1a;3.27.2 简介 锁归根结底就是对同一资源的竞争抢夺&#xff0c;不管是在单体的应用亦或者集群的服务中&#xff0c;上锁都是对同一资源进行修改的操作。至于分布式锁&#xff0c;那就是多个服务器或资源&#xff0c;同时抢占某一单体应用的同个资源了。…

基于Springboot+Vue的Java项目-农产品直卖平台系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

AD软件针对分散的元器件归一排列

先框选 然后快捷键TOL 绿色的十字箭头选框选位置 完成

将excel表中的数据导入到navicat中

1.将excel中的表头改成英文 2.在navicat中右键表&#xff0c;选择【导入向导】 3.在弹出的导入向导中选择Excel文件&#xff0c;然后点击【下一步】 4.选择需要导入的excel&#xff0c;选中后&#xff0c;在下方会罗列出excel中的sheet&#xff0c;勾选需要导入的sheet&#xf…

Chromium 调试指南2024 Windows11篇-使用日志来辅助调试(八)

1. 日志&#xff1a;你的第一个调试工具 日志是开发者最简单也是最常用的调试工具之一&#xff0c;它能够提供程序运行时的详细记录。通过合理的日志记录策略&#xff0c;开发者可以快速定位问题发生的上下文&#xff0c;理解程序的运行流程和状态。 2. 如何在Chromium中使用…

QMT如何写代码获取基金数据?方法总结!

此函数被设计为只支持单一基金查询&#xff0c;用于获取详细的股票信息。该函数可以让您接收关于特定基金的深度信息&#xff0c;包括但不限于其涨跌停价格、上市日期、退市日期以及期权到期日等重要数据。这将为您提供详尽的信息&#xff0c;以便更好地理解并分析股票的历史和…

【vue2项目经验总结:a标签干扰路由】

当我们点击页面中的a标签实现跳转时&#xff0c;会发现网页上方的路由也切换成了a标签的id值&#xff1a; 刷新后页面也会变成空白&#xff1a; 解决方法&#xff1a; 添加Click方法&#xff0c;传入的参数与id值保持一致 scrollIntoView() 方法&#xff0c;将该元素滚动到…

pycharm连接远程服务器,解决终端出现乱码问题

在终端输入命令时会有乱码问题&#xff0c;是字体编码设置错误。 根据上述步骤&#xff0c;设置完成后重启就可以了。

C#语言进阶

一、简单数据结构类 1. ArrayList ArrayList是一个 C# 为我们封装好的类&#xff0c;它的本质是一个 object 类型的数组。ArrayList类帮助我们实现了很多方法&#xff0c;比如数组的增删查改 1.1 声明 using System.Collections;ArrayList array new ArrayList(); 1.2 增…

MyBatis的创建和测试

创建项目点击Spring Initializr然后点击next 点击SQL 选择里面的Mybatis Framework和Mysql Driver 按如下图片创建项目 user表中的数据 #下面这些内容是为了让MyBatis映射 #指定Mybatis的Mapper文件 mybatis.mapper-locationsclasspath:mappers/*xml #指定Mybatis的实体目录 my…

亿级流量系统架构设计与实战

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

强烈推荐的AI生成PPT软件,快捷高效

提起PPT&#xff0c;大家的第一反应就是痛苦。经常接触PPT的学生党和打工人&#xff0c;光看到这3个字母&#xff0c;就已经开始头痛了&#xff1a; 1、PPT内容框架与文案挑战重重&#xff0c;任务艰巨&#xff0c;耗费大量精力。 2、PPT的排版技能要求高&#xff0c;并非易事…

EmotiVoice 实时语音合成TTS;api接口远程调用

参考:https://github.com/netease-youdao/EmotiVoice 测试整体速度可以 docker安装: 运行容器:默认运行了两个服务,8501 一个streamlit页面,另外8000是一个api接口服务 docker run -dp 8501:8501 -p 8250:8000 syq163/emoti-voice:latest##gpu运行 (gpu运行遇到CUDA er…

高效且安全的传输工具:FileLink跨网文件传输

在数字化时代&#xff0c;文件传输已成为我们日常工作和生活不可或缺的一部分。无论是企业内部的资料共享&#xff0c;还是企业对外的文件交换&#xff0c;都需要一个高效、稳定且安全的传输工具。而FileLink跨网文件传输正是满足这些需求的理想选择。 FileLink跨网文件传输 首…

【环境安装】nodejs 国内源下载与安装以及 npm 国内源配置

前言 Node.js 是一个基于 Chrome V8 引擎构建的 JavaScript 运行时环境&#xff0c;它能够使 JavaScript 在服务器端运行。它拥有强大的包管理器 npm&#xff0c;使开发者能够轻松管理和共享 JavaScript 代码包。 在中国&#xff0c;由于众所周知的原因&#xff0c;我们可能会…

Spring,SpringMVC,SpringBoot知识总结

1.简述Spring,SpringMVC&#xff0c;SpringBoot各自特点及联系 Spring、Spring MVC 和 Spring Boot 是 Java 开发中常用的三个框架&#xff0c;它们之间有以下关系&#xff1a; Spring&#xff1a;是一个全功能的 JavaEE 应用程序框架。它提供了一系列的解决方案&#xff0c…

VUE2+ffmpeg处理非h264编码格式视频

1、安装npm install ffmpeg/ffmpeg0.10.0 ffmpeg/core0.9.8 video.js8.12.0 2、在vue.config.js中devServer配置 headers: {// 如果需要用到ffmpeg确保ShareArrayBuffer能够正常使用,可能会有安全隐患Cross-Origin-Embedder-Policy: require-corp,Cross-Origin-Opener-Policy:…

XM1553B 航电总线协议模块(内置总线收发器)

是一款4M速率的高性能1553B模块&#xff0c;兼容1Mbps通信速率&#xff0c;支持单功能&#xff08;BC,orRT,or BM&#xff09;和多功能&#xff08;BC&1RT&BM&#xff09;&#xff0c;该模块内部集成32K16bit的双端口RAM和4M 1553B收发器。 主机端接口支持串口和SPI。串…

问题—前端调用接口url多加一个/,本地可以调通,测试环境报错302,分开调两个接口

问题背景 接口url前面多加一个/ &#xff0c;npm run serve 起项目&#xff0c;本地调用正常 npm run build 打包到测试环境&#xff0c;接口出现问题&#xff0c;分开调用接口&#xff0c;且报302错误 问题原因&#xff1a; 本地开发环境和测试环境的URL处理方式不同 本地使…