Как получить данные из файла .docx и сохранить их в буфере обмена? - PullRequest
0 голосов
/ 04 октября 2019

Я не знаю, как читать (RTF) данные из файла .docx и сохранять их в буфере обмена, поэтому я могу скопировать их в другой файл .docx с помощью сочетаний клавиш CTRL + V. Я не могу найти примеры того, как это сделать.

Мой последний вопрос по коду был 4,5 года назад, так как я всегда разбираюсь в этом самостоятельно, но с этим мне нужна помощь

Хорошо, мне удалось скопировать данные из .docx в другой .docx с помощью std :: ios :: binary.

/// Copy file contents
std::ifstream inputFile("test.docx", std::ios::in | std::ios::binary);
inputFile.seekg(0, std::ios::end);
int length = inputFile.tellg();
inputFile.seekg(0, std::ios::beg);
std::string fileContents;
fileContents.resize(length);
inputFile.read(&fileContents[0], length);
inputFile.close();

/// Paste file contents
std::ofstream outputFile("new.docx", std::ios::app | std::ios::binary);
outputFile.write(&fileContents[0], length);
outputFile.close();

Мне даже удалось сохранить некоторый текст (данные) изTXT-файл в буфер обмена в формате CF_TEXT. Он работает, как я ожидал, текст в файле .txt хранится в буфере обмена, и я могу использовать CTRL + V.

int main () {
    std::vector<char> bytes = ReadAllBytes("test.txt");
    std::string x(bytes.begin(), bytes.end());
    std::cout << bytes.size() << std::endl;
    SaveClipboard(x.c_str());
}

void SaveClipboard(const char* text) {
    HGLOBAL global = GlobalAlloc(GMEM_FIXED, strlen(text) + 1); 
    memcpy(global, text, strlen(text));  //text size + \0 character
    if(OpenClipboard(NULL)) {
        EmptyClipboard();
        SetClipboardData(CF_TEXT, global);
        CloseClipboard();
    }
}

std::vector<char> ReadAllBytes(char const* filename) {
    std::ifstream ifs(filename, std::ios::binary | std::ios::ate);
    std::ifstream::pos_type pos = ifs.tellg();

    std::vector<char> result(pos);

    ifs.seekg(0, std::ios::beg);
    ifs.read(&result[0], pos);

    return result;
}

Хорошо, теперь, как мне получить данные из файла .docx и сохранитьэти данные в буфере обмена, поэтому я могу использовать CTRL + V в открытом окне .docx.

Я пытался использовать:

std::vector<char> bytes = ReadAllBytes("test.docx");
DWORD CF_RTF = RegisterClipboardFormat("Rich Text Format");
SetClipboardData(CF_RTF, global);

Но тогда я получаю результат "PK____" в буфере обмена, когда вставляю его в открытый файл .docx.

Спасибозаранее

...