Portál AbcLinuxu, 13. května 2025 17:31

Dotaz: Python: jak pribalit pdftk v cx_Freeze?

3.4.2016 21:05 zdenek2008 | skóre: 26
Python: jak pribalit pdftk v cx_Freeze?
Přečteno: 511×
Odpovědět | Admin
Pythonovym skriptem vyplnuji pdf formulare pomoci pdftk. Problem nastane, kdyz skript zmrazim pomoci cx_Freeze; zmrazeny skript pdftk nezavola a pdf formulare nevyplni. Jestli spravne rozumim, cx_Freeze umi pribalit moduly, ale jak je to s externimi programy? Umi je pribalit take? Z dokumentace jsem moc nezmoudrel. Nekde jsem cetl, ze toto by snad melo jit v jinych podobnych programech (pyinstaller, py2exe), nebo mozna pouzitim modulu pypdftk, ale to by znamenalo prepsat ten skript nebo presedlat na nektery z tech jinych programu. Nemate nejake tipy?

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Řešení 1× (zdenek2008 (tazatel))
Pavel Stárek avatar 4.4.2016 12:43 Pavel Stárek | skóre: 44 | blog: Tady bloguju já :-) | Kolín
Rozbalit Rozbalit vše Re: Python: jak pribalit pdftk v cx_Freeze?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Umí to přibalit. Jak jsem psal, je potřeba vyplnit v setup skriptu sekci include_files třeba takto:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from cx_Freeze import setup, Executable

# Dependencies are automatically detected, but it might need fine tuning.
#build_exe_options = {"packages": ["os"], "excludes": ["tkinter"]}
includefiles = [("src/pdftk.exe", "pdftk.exe"), ("src/libiconv2.dll", "libiconv2.dll")]
build_exe_options = {"packages": ["os"], "excludes": [""], "include_files": includefiles}
#build_exe_options = {}
# GUI applications require a different base on Windows (the default is for a
# console application).
base = None
#if sys.platform == "win32":
#    base = "Win32GUI"

setup(  name = "pdftkexample",
        version = "1.0",
        description = "PdfTk example",
        options = {"build_exe": build_exe_options},
        executables = [Executable("src/pdftkexample.py", base=base)])

Předpokládaná struktura adresáře je například: C:\MojeAplikace\src - tam bude pdftkexample.py a pdftk.exe+libiconv2.dll

C:\MojeAplikace\setup-cxfreeze.py kde bude to co je napsané nahoře. Po zmrazení bude pdftk.exe i s knihovnou libiconv2.dll přibaleno k výslednému exe progámku. Ovšem, aby ho bylo možno volat, je potřeba zjistit kde je umístěn, to se ve vlastním skriptu, který bude volat pdftk.exe udělá takto:
import sys
import os
import os.path


def getModulePath():
    if (hasattr(sys, "frozen")):
        return os.path.dirname(sys.executable)
    return os.path.dirname(__file__)


def getPdftkExe(exe_name="pdftk.exe"):
    path = os.path.join(getModulePath(), exe_name)
    return path


if __name__ == "__main__":
    exe = getPdftkExe()
    print exe

V proměné exe je celá cesta k pdftk.exe, která se dá použít pro volání pomocí popen() atd.
Kdo chce, hledá způsob; kdo nechce, hledá důvod.
4.4.2016 14:03 zdenek2008 | skóre: 26
Rozbalit Rozbalit vše Re: Python: jak pribalit pdftk v cx_Freeze?
Diky, ja jsem mylne zkousel zadat pdftk v setup.py do 'includes', coz hlasilo chybu ze takovy modul neexistuje; ale i kdybych se zkusmo trefil s 'include_files', tu druhou cast s vyhledanim cesty k pdftk bych stejne nevedel. Takze diky jeste jednou, vrhnu se na to.
5.4.2016 21:04 zdenek2008 | skóre: 26
Rozbalit Rozbalit vše Re: Python: jak pribalit pdftk v cx_Freeze?
Tvuj priklad jsem si upravil tak, ze cx_Freeze ted pribaluje pdftk.exe a ten dll soubor do stejne slozky s vygenerovanym exe skriptem. V puvodnim pythonovem skriptu volam pdftk takhle:
pdftk_command='pdftk form.pdf fill_form form.fdf output form_from_script.pdf'
os.system(pdftk_command)
Zmrazeny exe skript prislusne pdf soubory nevytvari, cili stale jeste nevola pdftk. Tim se dostavam k tvemu druhemu skriptu, ktery vyhleda cestu k pdftk a vrati ji v promenne exe. Kdyz je pdftk ve stejne slozce se skriptem ktery ho vola, nemelo by stacit volat s cestou .\ , tedy takto?:
pdftk_command='.\pdftk form.pdf fill_form form.fdf output form_from_script.pdf'
os.system(pdftk_command)
5.4.2016 22:01 zdenek2008 | skóre: 26
Rozbalit Rozbalit vše Re: Python: jak pribalit pdftk v cx_Freeze?
Pridal jsem do skriptu tvuj kod, ale zmrazeny exe pdf nevygeneruje. Jen problikne okno konzole a to je vse. Preddefinovany fdf soubor se vytvori, takze alespon zbytek skriptu funguje. S os.path moc zkusenosti jeste nemam, takze je to spis pokus-omyl; takhle jsem pouzil tvuj kod:
import logging
from decimal import *
import os
import glob
import sys
import os.path

def getModulePath():
    if (hasattr(sys, "frozen")):
        return os.path.dirname(sys.executable)
    return os.path.dirname(__file__)

def getPdftkExe(exe_name="pdftk.exe"):
    path = os.path.join(getModulePath(), exe_name)
    return path

if __name__ == "__main__":
    cesta_k_pdftk_exe = getPdftkExe()
    #print(cesta k_pdftk_exe)

pdftk_command=cesta_k_pdftk_exe+' form.pdf fill_form form.fdf output form_from_script.pdf'
os.system(pdftk_command)
5.4.2016 22:26 zdenek2008 | skóre: 26
Rozbalit Rozbalit vše Re: Python: jak pribalit pdftk v cx_Freeze?
Tvuj kod pro vyhledani cesty mi vypisuje primo "pdftk.exe", ale zmrazeny skript s nim zatim jeste nefunguje, tak mam nekde chybu. Ale zkusmo jsem do prikazu zadal "pdftk.exe" misto jen "pdftk" a vse zacalo fungovat pote co jsem do include_files v setup.py pridal prazdny pdf formular ktery se ma vyplnovat, aby se pribalil k vyslednemu baliku. No kdybych to umel, nakopal bych se sam...
Pavel Stárek avatar 8.4.2016 17:25 Pavel Stárek | skóre: 44 | blog: Tady bloguju já :-) | Kolín
Rozbalit Rozbalit vše Re: Python: jak pribalit pdftk v cx_Freeze?
Samozřejmě že je potřeba si pomocí include_files přidat všechny další soubory které aplikace používá, například i sdílené knihovny Microsoftu které jsou používány samotným Pythonem.

Ten modul os.path obsahuje různé funkce pro práci s "cestami". Funkce join "sečte" dva stringy tak, že přidá správný path separator (\ / - znak v proměnné os.sep) podle typu operačního systému na kterém je spuštěna. Samozřejmě na Windows (i v Linuxu) je možné si takovéhle stringy "sčítat" ručně, ale výsledný skript nebude přenositelný mezi různými OS.
Kdo chce, hledá způsob; kdo nechce, hledá důvod.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.