简单粗暴的翻译英文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,浏览器自动翻译英文

通过上一页下一页翻页

相关推荐
醉颜凉1 小时前
【NOIP提高组】潜伏者
java·c语言·开发语言·c++·算法
hunandede1 小时前
FFmpeg 4.3 音视频-多路H265监控录放C++开发十三.2:avpacket中包含多个 NALU如何解析头部分析
c++·ffmpeg·音视频
爱学习的大牛1231 小时前
通过vmware虚拟机安装和调试编译好的 ReactOS
c++·windows内核
忠实米线2 小时前
使用pdf-lib.js实现pdf添加自定义水印功能
前端·javascript·pdf
tumu_C3 小时前
C++模板特化实战:在使用开源库boost::geometry::index::rtree时,用特化来让其支持自己的数据类型
c++·开源
杜若南星3 小时前
保研考研机试攻略(满分篇):第二章——满分之路上(1)
数据结构·c++·经验分享·笔记·考研·算法·贪心算法
Neophyte06083 小时前
C++算法练习-day40——617.合并二叉树
开发语言·c++·算法
云空3 小时前
《InsCode AI IDE:编程新时代的引领者》
java·javascript·c++·ide·人工智能·python·php
写bug的小屁孩3 小时前
websocket初始化
服务器·开发语言·网络·c++·websocket·网络协议·qt creator
慧都小妮子3 小时前
Spire.PDF for .NET【页面设置】演示:复制 PDF 文档中的页面
java·pdf·.net