Как расшифровать и сохранить файл PDF с PoDoFo? - PullRequest
0 голосов
/ 03 марта 2020

Я решил написать программу, чтобы открыть зашифрованный PDF-документ, запросить у пользователя пароль, расшифровать его и сохранить в другом документе без шифрования. У меня нет проблем при открытии PDF-документа, зашифрованного 256-битным AES. Но когда я пытался сохранить дешифрованный PDF-документ, он выдает PoDoFo::PdfError со следующим сообщением:

PoDoFo encountered an error. Error: 8 ePdfError_InternalLogic
        Error Description: An internal error occurred.
        Callstack:
        #0 Error Source: C:/repo/mingw-w64-podofo/src/podofo-0.9.6/src/base/PdfWriter.cpp:211
        #1 Error Source: C:/repo/mingw-w64-podofo/src/podofo-0.9.6/src/base/PdfParserObject.cpp:403
                Information: Unable to parse the stream for object 4 0 obj .
        #2 Error Source: C:/repo/mingw-w64-podofo/src/podofo-0.9.6/src/base/PdfEncrypt.cpp:411
                Information: Error AES-decryption data

Мой код:

#include <iostream>
#include <string>
#include <podofo/podofo.h>

int main(){
    PoDoFo::PdfMemDocument *doc = new PoDoFo::PdfMemDocument();
    std::string pdf_path;
    std::cout << "Please enter the PDF path: " << std::flush;
    std::getline(std::cin, pdf_path);
    try{
        doc->Load(pdf_path.c_str());
    }
    catch(PoDoFo::PdfError &error){
        if (error.GetError() == PoDoFo::ePdfError_InvalidPassword){
            std::cout << "The PDF document is encrypted. Please enter the password: " << std::flush;
            std::string password;
            std::getline(std::cin, password);
            try{
                doc->SetPassword(password);
            }
            catch(PoDoFo::PdfError &error){
                error.PrintErrorMsg();
            }
        }
    }
    std::cout << "Please enter the PDF path to save the decrypted PDF: " << std::flush;
    std::string save_pdf_path;
    std::getline(std::cin, save_pdf_path);
    try{
        doc->Write(save_pdf_path.c_str());
    }
    catch(PoDoFo::PdfError &e){
        e.PrintErrorMsg();
    }
    return 0;
}

Сообщение об ошибке выше напечатано в строке 33, при сохранении документа PDF. При тестировании я использовал веб-сайт PdfProtectFree для шифрования произвольного файла PDF.

...