PoDoFo: создание динамического документа (текстовое поле и флажок), где содержимое поля можно распечатать - PullRequest
0 голосов
/ 04 марта 2019

Я посмотрел PoDoFo Docs, но я не нашел функцию, которая устанавливает свойства поля.

    using namespace PoDoFo;
auto filename = QFileDialog::getSaveFileName(this, lat("Wähle Speicherort aus"), "neues_document.pdf", tr("Portable Document Format (*.pdf)"), nullptr);
PdfStreamedDocument document(filename.toStdString().c_str(), ePdfVersion_1_7);
PdfPage* page;
PdfPainter painter;
PdfFont* pFont;
page = document.CreatePage(PdfPage::CreateStandardPageSize(ePdfPageSize_A4));
if (!page)
    PODOFO_RAISE_ERROR(ePdfError_InvalidHandle);
painter.SetPage(page);
pFont = document.CreateFont("Times");
pFont->SetFontSize(7);
painter.SetFont(pFont);
painter.DrawText(56, page->GetPageSize().GetHeight() - 150, PdfString(std::wstring(first + L" "+strasse + L" " + plz + L" " + stadt).c_str()));
if (this->ui.cb_tennant->currentText() == "FREI")
{
    PdfRect rect(56, 600, 250, 90);
    PdfTextField *tf = new PdfTextField(page, rect, &document);
    tf->SetMultiLine(true);
    tf->SetRichText(true);
    tf->SetFieldName("tb_addresse");
}
pFont = document.CreateFont("Times");
pFont->SetFontSize(10);
painter.SetFont(pFont);
auto cc = setting->value("Chef").toString();
std::wstring chef = L"Geschäftsführer: " + setting->value("Chef").toString().toStdWString();
painter.DrawText(400, 770,PdfString(setting->value("Firma","").toString().toStdWString().c_str()));
painter.DrawText(400, 760, PdfString(chef.c_str()));
painter.DrawText(400, 750, PdfString(strasse.c_str()));
painter.DrawText(400, 740, PdfString(std::wstring(plz + L" " + stadt).c_str()));
painter.DrawText(400, 730, PdfString(std::wstring(L"USt.-ID: " + setting->value("UstID", "").toString().toStdWString()).c_str()));
painter.DrawText(400, 720, PdfString(std::wstring(L"Handelsregister Nr.: " + setting->value("Handelsregister", "").toString().toStdWString()).c_str()));
painter.DrawText(400, 710, PdfString(std::wstring(L"Sachbearbeiter: " + setting->value("Vorname").toString().toStdWString() + L" " + setting->value("Nachname").toString().toStdWString()).c_str()));

painter.DrawText(400, 700, PdfString(std::wstring(L"Datum: " + QLocale(QLocale::German).toString(QDate::currentDate()).toStdWString()).c_str()));

pFont = document.CreateFont("Times-Bold",true,false);
pFont->SetFontSize(10);
painter.SetFont(pFont);
painter.DrawText(50, 550, PdfString("Betreff: Ihr Mietvertrag"));
pFont = document.CreateFont("Times", false, false);
pFont->SetFontSize(10);
painter.SetFont(pFont);
PdfRect textrect(50, 100, 500, 430);
QDate date = QDate::currentDate().addDays(14);

//painter.DrawText(50, 530, PdfString(std::wstring(L"Anbei schicken wir Ihnen den Mietvertrag zu, bitte lesen Sie ihn sorgfältig durch").c_str()));
std::wstring text = L"Anbei schicken wir Ihnen den Mietvertrag zu, bitte lesen Sie ihn genau durch und bei Fragen können Sie gerne uns fragen.\n"
    L"Bitte schicken Sie den Mietvertrag bis zum " + QLocale(QLocale::German).toString(date).toStdWString() + L" unterschrieben zurück.\n"
    L"wir wünschen Ihnen viel Vergnügen mit Ihrer neuen Wohnung.\n\n"
    L"Mit freundlichen Grüßen\n";
painter.DrawMultiLineText(textrect, PdfString(text.c_str()));
painter.FinishPage();

PdfPage* vpage = document.CreatePage(PdfPage::CreateStandardPageSize(ePdfPageSize_A4));
painter.SetPage(vpage);
PdfFont* vFont = document.CreateFont("Courier-Bold", true, false);
vFont->SetFontSize(18);
painter.SetFont(vFont);
PdfRect TOrect(50, 700, 500, 80);
painter.DrawMultiLineText(TOrect, PdfString(L"Mietvertrag"), ePdfAlignment_Center);
vFont->SetFontSize(12);
PdfRect zwischenRect(50, 700, 500, 25);
painter.DrawMultiLineText(zwischenRect, PdfString(L"zwischen"), ePdfAlignment_Center);
PdfRect firmaRect(50, 620, 500, 84);
std::wstring firmen_stempel = first + L"\n" + strasse + L"\n" + plz + L" " + stadt + L"\nvertreten durch:\n" + chef+L"\n\nund";
painter.DrawMultiLineText(firmaRect, PdfString(firmen_stempel.c_str()), ePdfAlignment_Center);
if (this->ui.cb_tennant->currentText() == "FREI") {
    PdfRect mieterRect(180, 560, 250, 80);
    PdfTextField *empf = new PdfTextField(vpage, mieterRect, &document);
    empf->SetMultiLine(true);
    empf->SetFieldName(PdfString(L"tb_Vertragspartner"));
}
PdfRect fuerRect(50, 540, 500, 15);
painter.DrawMultiLineText(fuerRect, PdfString(L"für das Mietobjekt"), ePdfAlignment_Center);
if (this->ui.cb_object->currentText() == "FREI") {
    PdfRect objectRect(180, 460, 250, 80);
    PdfTextField *tb_obj = new PdfTextField(vpage,objectRect, &document);
    tb_obj->SetMultiLine(true);
    tb_obj->SetFieldName(PdfString(L"tb_object"));
    painter.DrawText(50, 450, PdfString(L"Mit den Eigenschaften (bei keinem Eintrag, existiert die Eigenschaft nicht!):"));
    //GRÖße
    painter.DrawText(50, 430, PdfString(L"Größe:"));
    PdfRect sizeRect(100, 430, 50, 12);
    PdfTextField *tb_size = new PdfTextField(vpage, sizeRect, &document);
    tb_size->SetFieldName(PdfString(L"tb_size"));
    //Zimmer
    painter.DrawText(155, 430, PdfString(L"Zimmer:"));
    PdfRect roomRect(220, 430, 50, 12);
    PdfTextField *tb_zimmer = new PdfTextField(vpage, roomRect, &document);
    tb_zimmer->SetFieldName(PdfString(L"tb_zimmer"));
    painter.DrawText(270, 430, PdfString(L"Balkon:"));
    PdfRect balkonRect(320, 430, 25, 12);
    PdfCheckBox *cb_balkon = new PdfCheckBox(vpage, balkonRect, &document);
    cb_balkon->SetBackgroundColor(128, 128, 128);
    cb_balkon->SetFieldName("cb_balkon");

}

PoDoFo делает то, что должен делать с одним исключением!Я могу заполнить текстовые поля, но если я распечатаю документ, Adobe Reader не будет печатать содержимое текстового поля и не будет отмечен флажком.

Если я сохраню изменения и повторно открою документ, сохраненный текст будет отображаться правильно.

Может кто-нибудь помочь мне с вопросом: как сделать поля пригодными для печати?

Большое спасибо

...