简单粗暴的翻译英文pdf

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

Step 1

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

Step 2

写一个C++脚本

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
  • 命令行运行脚本
c 复制代码
ToolPdf2Html.exe data.txt
  • 在output文件夹下生成一堆html

Step 3

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

通过上一页下一页翻页

相关推荐
Lzc7747 分钟前
C++初阶——简单实现vector
c++·简单实现vector
一个小白11 小时前
C++——list模拟实现
开发语言·c++
程序员老舅1 小时前
C++ Qt项目教程:WebServer网络测试工具
c++·qt·测试工具·webserver·qt项目·qt项目实战
靡不有初1111 小时前
CCF-CSP第18次认证第一题——报数【两个与string相关的函数的使用】
c++·学习·ccfcsp
菜鸟单飞1 小时前
介绍一款非常实用的PDF阅读软件!
windows·pdf·电脑
cookies_s_s3 小时前
Linux--进程(进程虚拟地址空间、页表、进程控制、实现简易shell)
linux·运维·服务器·数据结构·c++·算法·哈希算法
不想编程小谭3 小时前
力扣LeetCode: 2506 统计相似字符串对的数目
c++·算法·leetcode
曼巴UE54 小时前
UE5.3 C++ TArray系列(一)
开发语言·c++·ue5
阿巴~阿巴~5 小时前
多源 BFS 算法详解:从原理到实现,高效解决多源最短路问题
开发语言·数据结构·c++·算法·宽度优先
CoderCodingNo6 小时前
【GESP】C++二级真题 luogu-b3924, [GESP202312 二级] 小杨的H字矩阵
java·c++·矩阵