Autor Téma: PDF jako formulář a jeho vyplnění  (Přečteno 752 krát)

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 953
  • Karma: 27
    • Verze Delphi: XE8, Seattle
PDF jako formulář a jeho vyplnění
« kdy: 20-12-2018, 07:46:04 »
Ahoj,

měl bych dotaz na formát PDF. Jsou v něm vytvořené formuláře s možností doplnit text do určitých částí či polí (ručně lze přes i Acrobat Reader, ale to není požadavkem). Vyplněný formulářový text se streamuje na konec souboru, takže by to asi mělo jít z programu vyplnit (např. daty z DB). Je potřeba pro vyplnění nějaká specializovaná DLL od Adobe? Jde to vůbec? Dík za případnou radu.

Offline leonell

  • Mladík
  • **
  • Příspěvků: 99
  • Karma: 3
Re:PDF jako formulář a jeho vyplnění
« Odpověď #1 kdy: 10-01-2019, 15:37:18 »
Tohle by to mělo umět. My nějakou (asi starší) verzi máme, ale používáme na generování a podepisování, s formuláři jsme neměli čest.
L.

Offline leonell

  • Mladík
  • **
  • Příspěvků: 99
  • Karma: 3
Re:PDF jako formulář a jeho vyplnění
« Odpověď #2 kdy: 10-01-2019, 17:28:53 »
Tak už jsme měli tu čest :)
Funguje. Samozřejmě by se měly testovat vrácené hodnoty, zda byla operace úspěšná atd...
Těch metod je tam milión.
Joo - Poříčí - čeština se asi musí nějak pořešit.

Kód: Delphi [Vybrat]
  1. procedure TForm2.Button1Click(Sender: TObject);
  2. var
  3.  r,i: integer;
  4.  debenu:  TDebenuPDFLibrary1112; // uses DebenuPDFLibrary1112
  5. begin
  6.    debenu := TDebenuPDFLibrary1112.Create();
  7.    r := debenu.UnlockKey('KoupenyKlic');
  8.    if r<>1 then raise Exception.Create('Wrong unlock DEBENU code');
  9.    debenu.LoadFromFile('OoPdfFormExample.pdf','');
  10.    memo1.Lines.add(Format('Počet:%d',[debenu.FormFieldCount]));
  11.    for i := 1 to debenu.FormFieldCount do
  12.    begin
  13.      memo1.Lines.Add(Format('#%d typ %d = %s',[
  14.      i, debenu.GetFormFieldType(i), debenu.GetFormFieldTitle(i)]));
  15.    end;
  16. {
  17. #1 typ 1 = Given Name Text Box
  18. #2 typ 1 = Family Name Text Box
  19. #3 typ 1 = House nr Text Box
  20. #4 typ 1 = Address 2 Text Box
  21. #5 typ 1 = Postcode Text Box
  22. #6 typ 5 = Country Combo Box
  23. #7 typ 1 = Height Formatted Field
  24. #8 typ 1 = City Text Box
  25. #9 typ 3 = Driving License Check Box
  26. #10 typ 5 = Favourite Colour List Box
  27. #11 typ 3 = Language 1 Check Box
  28. #12 typ 3 = Language 2 Check Box
  29. #13 typ 3 = Language 3 Check Box
  30. #14 typ 3 = Language 4 Check Box
  31. #15 typ 3 = Language 5 Check Box
  32. #16 typ 5 = Gender List Box
  33. #17 typ 1 = Address 1 Text Box
  34. }
  35.   debenu.SetFormFieldValueByTitle('Given Name Text Box', 'Neználek' );
  36.   debenu.SetFormFieldValueByTitle('Family Name Text Box', 'Neználkovič' );
  37.   debenu.SetFormFieldValueByTitle('Address 1 Text Box', 'Okurková' );
  38.   debenu.SetFormFieldValueByTitle('House nr Text Box', '123' );
  39.   debenu.SetFormFieldValueByTitle('Address 2 Text Box', 'Poříčí' );
  40.   debenu.SetFormFieldValueByTitle('City Text Box', 'Kvítečkov' );
  41.   debenu.SetFormFieldValueByTitle('Postcode Text Box', '12345' );
  42.   debenu.SetFormFieldValueByTitle('Country Combo Box', 'Portugal' );
  43.   debenu.SetFormFieldValueByTitle('Driving License Check Box', 'Off' );
  44.   debenu.SetFormFieldValueByTitle('Height Formatted Field', '2' );
  45.   debenu.SetFormFieldValueByTitle('Language 1 Check Box', 'Off' );
  46.   debenu.SetFormFieldValueByTitle('Language 2 Check Box', 'Off' );
  47.   debenu.SetFormFieldValueByTitle('Language 3 Check Box', 'Yes' );
  48.   debenu.SetFormFieldValueByTitle('Language 4 Check Box', 'Off' );
  49.   debenu.SetFormFieldValueByTitle('Language 5 Check Box', 'Off' );
  50.   debenu.SetFormFieldValueByTitle('Gender List Box', 'Man' );
  51.   debenu.SetFormFieldValueByTitle('Favourite Colour List Box', 'Red' );
  52.    debenu.SaveToFile('OoPdfFormExample-vyplneno.pdf');
  53.    debenu.Free();
  54. end;
  55.  

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 953
  • Karma: 27
    • Verze Delphi: XE8, Seattle
Re:PDF jako formulář a jeho vyplnění
« Odpověď #3 kdy: 11-01-2019, 09:26:24 »
Debenu jsem viděl, docela by se mi to líbilo, ale hledal jsem nějaké jiné řešení např. s přímým doplněním dat do formuláře něco jako injektnutím (načíst, insertnout na správné místo a uložit do souboru). Bohužel, o fyzické struktuře pdf formuláře nevím nic :(

Offline leonell

  • Mladík
  • **
  • Příspěvků: 99
  • Karma: 3
Re:PDF jako formulář a jeho vyplnění
« Odpověď #4 kdy: 11-01-2019, 09:29:39 »
No ale to (načíst, insertnout na správné místo a uložit) je asi přesně to, co jsem poslal, ne?
Ten začátek (vypsání obsahu formuláře) je tam jen kvůli tomu, abych ukázal, jak zjistit názvy políček. Stejně tak se dá použít číslování, třeba:
Kód: Delphi [Vybrat]
  1. debenu.SetFormFieldValue(1, 'Neználek' );
  2.  
Ve skutečnosti jsem to tak i měl, jenže autoři toho PDF mně převezli a čísla nešla za sebou :)
L.

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 953
  • Karma: 27
    • Verze Delphi: XE8, Seattle
Re:PDF jako formulář a jeho vyplnění
« Odpověď #5 kdy: 11-01-2019, 09:36:11 »
Aha, to bude ono.
Já si udělal soukromou analýzu - prostě tak, že jsem vyplnil formulář specifickým textem např. ve formátu ($neznalek5$) zhruba v maximální délce, uložil a pak na ta vyplněná místa insertoval specifickým textem (s rozloženým kódováním pro češtinu). Ale tohle mi nefungovalo, Adobe Reader považoval pdf za poškozené :(

Offline leonell

  • Mladík
  • **
  • Příspěvků: 99
  • Karma: 3
Re:PDF jako formulář a jeho vyplnění
« Odpověď #6 kdy: 11-01-2019, 09:42:27 »
Ono to PDF bude mít asi kontrolní součty. Já detaily neznám, my to Debenu používáme na podepsání PDF elektronickým certifikátem, aby přímo aplikace odeslala mailem hotový podepsaný podklad. A tuším jsem ještě z něj dělal PDF od nuly, ale to spíše jako pokus, kdy se přes TWAIN skenovaly obrázky a tohle vytvořilo celkový PDF dokument.
Umí to hodně - taky to není úplně levné, pokud mne paměť neklame. I když pro ně je to "only $499" :)

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 953
  • Karma: 27
    • Verze Delphi: XE8, Seattle
Re:PDF jako formulář a jeho vyplnění
« Odpověď #7 kdy: 11-01-2019, 09:47:38 »
To je otázka priority.
Děkuji

Offline xprn

  • Nováček
  • *
  • Příspěvků: 1
  • Karma: 0
    • Verze Delphi: XE