Importação automática de imagens através de script: Difference between revisions

From Scribus Wiki
Jump to navigation Jump to search
No edit summary
 
mNo edit summary
 
(20 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{localiza}}
[[Category:PT]]
[[Category:PT]]
[[Category:Scripts e Plugins]]
[[Category:Artigos depreciados ou desatualizados]]
{{Plugins}}
{{Desatualizados}}
Versão em [[Automatic import of images from a directory using a script|inglês]].
Versão em [[Automatic import of images from a directory using a script|inglês]].


=Básico=
=Básico=
The reasons I made these scripts was, first of all, to learn some Python, but also to be able to create a picture file or album in Scribus. What I generally use this for is to organize the digital pictures I may take from some trip. One advantage of Scribus is that its native .sla files do not include image data, but only references to them, so this cataloguing file is relatively small. For some collections I will add annotations, make a PDF, and then print out an actual album.


Initially, I had created a stand-alone Perl program (scribalbum.pl) to do this outside of Scribus. It still works even though I made it according to the 1.2.x series of file formats. One advantage it has is that it is quite fast and will generate a many-paged document in a few seconds. Its disadvantage is that it rather clumsily just does a rote spitting out of a particular format, and there is a danger that it may not work with some future versions of Scribus. "Fixing" it to generate a 1.3.x format is more work than I would like. Best to load into 1.3.x Scribus then save from there.
Uma nova versão está disponível: '''[[Importação automática de imagens V2]]'''
 
Primeiramente, a razão de eu ter criado esse scripts foi para aprender alguma coisa sobre Python e para poder criar um arquivador de imagens ou álbum no Scribus. Geralmente eu uso o script para organizar as imagens digitais que eu tiro nas minhas viagens.
Uma das vantagens do Scribus é que o seu formato de arquivo .sla não inclui nenhum dado de imagem, mas apenas suas referências, então, este arquivo de catálogo é relativamente pequeno.  Eu irei adicionar anotações, fazer um PDF e imprimir um álbum com algumas coleções.
 
Inicialmente eu criei um programa em Perl a parte (scribalbum.pl) para fazer a criação fora do Scribus. O script ainda funciona, mesmo tendo sido projetado para os formatos de arquivo da versão 1.2.x.
Uma de suas vantagens é a velocidade com que ele gera diversas páginas com informações. Sua desvantagem é que ele foi criado para o formato 1.2.x, ou seja, potencialmente incompatível com as novas versões (e até um tanto quanto perigoso). Ajustá-lo para gerar os documentos na nova versão é mais trabalho do que eu gostaria. Melhor carregá-lo no Scribus 1.3.x e então salvar de lá mesmo.
 
As implementações Python tem a vantagem de usar o próprio Scribus para criar um documento, sendo assim, enquanto o script funcionar o arquivo resultante estará atualizado. Outro benefício é a facilidade de modificação do script para ser ajustado a outras necessidades.
 
= Descrição =
== scribalbum.pl ==
Eu não irei dizer nada sobre este programa. Se você conhece alguma coisa de Perl, verá que isto não é "elegante", mas faz o trabalho. Sua operação é através da linha de comando.
 
== scribalbum.py e scribalbuma4.py ==
 
Estes scripts são similares, ambos criam um novo documento e quantas páginas forem necessárias. O '''scribalbum.py''' coloca quatro imagens desalinhadas uma das outras em uma página de tamanho carta (americana), permitindo anotações nos espaços remanescentes. Já o '''scribalbum4.py''' coloca 8 imagens por página A4, deixando pouco espaço livre restante. Ambas as versões farão um quadro de texto no canto superior esquerdo de cada página, indicando qual o diretório que a imagem está. Cada imagem possui um título indicando o nome de arquivo da imagem.
 
'''Atualização:''' O Gregory criou uma nova versão que elimina a necessidade do uso do Tkinter, veja a [[Automatic import of images: Versions not requiring Tkinter|nova versão]] (em inglês).
 
Aqui estão alguns dos recursos que ambos os scripts compartilham:
 
* Quando você executar o script no Scribus, duas janelas Tk aparecerão, uma branca e outra que pergunta o nome do diretório e possui caixas de marcação. Você pode usar um caminho relativo. O absoluto será mais preciso.
 
* Você pode marcar um ou mais formatos de imagens que você quer. TODAS as imagens daquele tipo serão incluidas - você não pode selecionar e/ou escolher imagens individualmente. Elas aparecerão na ordem alfa-numérica no seu documento, sendo a coluna da esquerda a primeira.
 
* PDFs serão importados mas somente a  sua primeira página.
 
* Por enquanto este script não importa SVGs. O que você tem é um quadro branco. Essa é uma das coisas na lista do meu "a fazer" (''TODO'').
 
* Todas as imagens são ajustadas para coresponder ao tamanho do quadro, sendo o mesmo tamanho de quadro em cada script.. Ajustar um quadro para uma imagem individual é uma tarefa melhor feita no Scribus após você ter feito o arquivo. Estes scripts foram desenvolvidos para fazer o trabalho "grosso". Vamos deixar que o Scribus faça o trabalho de refino.
 
* Uma vez que você tenha fornecido o diretório e selecionado os formatos das imagens, basta clicar em OK. Aguarde um tempo (durante este processo os quadros e os ícones do Scribus podem piscar).


The Python implementations have the advantage of using Scribus itself to make the document, so as long as the script works, the resulting file will be up-to-date. Another advantage is more easy modification to fit other needs.
* Quando o script terminar, a janela TK que estava branca agora dirá: ''Agora clique no X no canto superior direito desta janela'', significando que o X no canto da janela Tk irá a apagar. Com esta ação o script termina e o Scribus assume.


I will add a link to the files once I learn how to upload files to the Wiki.
* Neste ponto o Scribus está - em teoria - carregando o arquivo para exibição. Esse processo pode demorar até minutos dependendo do número e do tamanho das imagens, além das configurações de sua máquina (memória, processador etc).


* Se nesse ponto o Scribus quebrar/travar,  provavelmente toda a memória RAM e swap foi usada no seu sistema. Ainda não há uma proteção incluida neste script contra essa possibilidade. Se você tiver sorte, o Scribus terá salvo um arquivo de emergência começando com '''DocumentN...''', mas, se o arquivo for grande demais, o Scribus não conseguirá o carregar, já que a memória continuará criando essa restição (o arquivo por sí só não é grande, o requerimento de memória para todas as imagens que é a fonte do problema).


= Notas adicionais =
Devido a limitações desconhecidas neste instante, este script não funciona na versão Windows do Scribus; Aguarde até que o problema seja solucionado.
= Arquivos =
== scribalbum.pl ==
== scribalbum.pl ==
I'm not going to say anything about this program. If you know something about Perl, you will see that it's not elegant, but it gets the job done. It operates on the command line.
Como este é um programa a parte (''stand-alone''), suas ''strings'' não serão traduzidas.
Consulte a [[Automatic import of images from a directory using a script#scribalbum.pl 2| página em inglês]] para ver o código.
 
== scribalbum.py ==
<pre><nowiki>
#!/usr/bin/env python
 
# Arquivo: scribalbum.py
# originado em 2005.02.13  Gregory Pittman
# modificado em  2005.02.27 - from scribalbuma4.py
# Esta versão é para o formato papel carta (E.U.A)
# Também, apenas coloca 4 imagens por página, permitindo quadros de textos (notas) entre as imagens.
#
# Usa o Tkinter para exibir uma caixa de entrada para o nome do diretório.
# Filtra os arquivos terminados com .jpg, .png, e assim por diante (selecionável pelo usuário)
# Nota: no momento não é possível a seleção de extensões em caixa alta
# Cria um novo documento
#
# Alguma das coisas a serem solucionadas: necessita de um fechamento mais elegante;
# por enquanto pede que você clique
# no X no canto superior direito do quadro raiz, mas pelo menos diz quando
# você deve.
# Eventualmente ser hábil a navegar entre diretórios, talvez mostrar uma
# Listbox (lista de seleção) para a seleção do diretório.
 
from scribus import *
import Tkinter
import os
 
class ImageDialog(Tkinter.Toplevel):
   
    def __init__(self, parent):
        global jpg, tif, png, pdf, svg, gif
        Tkinter.Toplevel.__init__(self, parent, bg="#bbbbff")
 
        Tkinter.Label(self, text='Enter the Image Directory, Click OK',bg="#bbbbff").grid(row=0,columnspan=6)
 
        self.e = Tkinter.Entry(self)
        self.e.grid(row=1,columnspan=6)
        self.jpg = Tkinter.StringVar()
        self.tif = Tkinter.StringVar()
        self.png = Tkinter.StringVar()
        self.pdf = Tkinter.StringVar()
        self.svg = Tkinter.StringVar()
        self.gif = Tkinter.StringVar()
        b = Tkinter.Button(self, text='OK', bg="#55ff88", command=self.ok)
        b.grid(row=2,columnspan=6)
        self.protocol("WM_DELETE_WINDOW", self.quit)
        Tkinter.Label(self, text='Filters',bg="#bbbbff").grid(row=3)
        j = Tkinter.Checkbutton(self, text = '.jpg', variable = self.jpg,onvalue='.jpg')
        j.grid(row=4,column=0)
        t = Tkinter.Checkbutton(self, text = '.tif', variable = self.tif,onvalue='.tif')
        t.grid(row=4,column=2)
        p = Tkinter.Checkbutton(self, text = '.png', variable = self.png,onvalue='.png')
        p.grid(row=4, column=4)
        P = Tkinter.Checkbutton(self, text = '.pdf', variable = self.pdf,onvalue='.pdf')
        P.grid(row=5, column=0)
        s = Tkinter.Checkbutton(self, text = '.svg', variable = self.svg,onvalue='.svg')
        s.grid(row=5, column=2)
        g = Tkinter.Checkbutton(self, text = '.gif', variable = self.gif,onvalue='.gif')
        g.grid(row=5, column=4)
        j.select() # descomente esta linha para ter uma opção padrão de configuração nos botões de checagem
#        t.select() # j = .jpg, t = .tif, etc.
#        s.select()
#        p.select()
#        P.select()
#        g.select()
 
    def ok(self):
        m = Tkinter.Message(root, text="Agora clique no X no canto superior direito desta janela")
        m.grid(row=0, columnspan=4)
        try:
            D=[]
            imagecount = 0
            framecount = 0
            filetype = []
            if len(self.jpg.get()) == 4: filetype.append(self.jpg.get())
            if len(self.tif.get()) == 4: filetype.append(self.tif.get())
            if len(self.png.get()) == 4: filetype.append(self.png.get())
            if len(self.pdf.get()) == 4: filetype.append(self.pdf.get())
            if len(self.svg.get()) == 4: filetype.append(self.svg.get())
            if len(self.gif.get()) == 4: filetype.append(self.gif.get())
            d = os.listdir(self.e.get())
            for file in d:
                for format in filetype:
                    if file.endswith(format):
                        D.append(file)
            D.sort()
# Há 4 imagens por página; xpos e ypos são as coordenadas  x,y do canto superior esquerdo
# As coordenadas são: (15, 42),(15, 388), (310, 187), (310, 533)
            xpos = (15, 310)   
            ypos = (42, 388, 187, 533)
# Esta proporção é a certa para fotografias (pelo menos com a minha digital Olympus)
            pwidth = 288
            pheight = 217
 
            if newDoc(PAPER_LETTER, (10,10,20,20),PORTRAIT, 1, UNIT_POINTS, NOFACINGPAGES, FIRSTPAGERIGHT):
                while D[imagecount]:
                    if imagecount > 0:
                        newPage(-1)
                        framecount = 0
# L é o quadro no topo de cada página que mostra o nome de diretório
                    L = createText(15, 20, 200, 20)
                    setText("Dir: " + self.e.get(), L)
                    setTextAlignment(ALIGN_LEFT, L)
                    setFont("Luxi Sans Regular", L)
                    setFontSize(10, L)
# Aqui é onde nós estamos carregando as imagens na página, quadro por vez, então volta e cria uma nova página
                    for xframe in xpos:
                            if D[imagecount]:
                                f = createImage(xframe, ypos[framecount], pwidth, pheight)
                                loadImage(self.e.get() + '/' + D[imagecount], f)
                                setScaleImageToFrame(scaletoframe=1, proportional=1, name=f)
                                lenfilename = len(D[imagecount])
                                Lpiclen = int(5.3 * lenfilename)
# Lpic é o título de cada imagem com as posição e largura ajustadas
# de acordo com a largura do texto.
# Então se você mudar a fonte ou o seu tamanho, talvez você precise ajustar
# isto para um calculo aproximado.
                                Lpic = createText(xframe, ypos[framecount] + 217, Lpiclen, 15)
                                setText(D[imagecount], Lpic)
                                setTextAlignment(ALIGN_RIGHT, Lpic)
                                setFont("Luxi Mono Regular", Lpic)
                                setFontSize(8, Lpic)
                                setFillColor("White", Lpic)
                                imagecount = imagecount + 1
                                framecount = framecount + 1
                            if D[imagecount]:
                                f = createImage(xframe, ypos[framecount], pwidth, pheight)
                                loadImage(self.e.get() + '/' + D[imagecount], f)
                                setScaleImageToFrame(scaletoframe=1, proportional=1, name=f)
                                lenfilename = len(D[imagecount])
                                Lpiclen = int(5.3 * lenfilename)
                                Lpic = createText(xframe, ypos[framecount] + 217, Lpiclen, 15)
                                setText(D[imagecount], Lpic)
                                setTextAlignment(ALIGN_RIGHT, Lpic)
                                setFont("Luxi Mono Regular", Lpic)
                                setFontSize(8, Lpic)
                                setFillColor("White", Lpic)
                                imagecount = imagecount + 1
                                framecount = framecount + 1
            setRedraw(1)
            redrawAll()
            self.Tkinter.Toplevel.destroy()
                                       
        except os.error, value:
            Tkinter.Button(root, text=value[1], bg="#ffff55").grid(row=3, columnspan = 4)
 
root = Tkinter.Tk()
root.update()


== scribalbum.py and scribalbuma4.py ==
d = ImageDialog(root)


These are similar Python scripts. Both create a new document and as many pages as needed. '''scribalbum.py''' places 4 staggered images on a US Letter page, allowing for annotations in the remaining white space. '''scribalbuma4.py''' places 8 images per A4 page with little remaining white space. Both versions will make a text frame in the upper left corner of each page indicating the directory the images came from, and each image has a label showing the image's filename.
root.wait_window(d)
</nowiki>


Here are some features that both share:
</pre>


* When you run the script from within Scribus, you will see two Tk windows, one of which is blank, the other of which asks for the name of the directory and has a number of checkboxes. You can use a relative path, but an absolute one is more precise.
== scribalbuma4.py ==


* You may check one or as many image formats as you like. ALL images of that type will be included -- you cannot pick and choose individual images. As written, they will appear in alphanumeric order in your document, left column filled first. You could go left-right-left right down the page by changing the logic.
<pre><nowiki>
#!/usr/bin/env python


* PDFs will import, but only the first page.
# Arquivo: scribalbuma4.py
# originado em 2005.02.13  Gregory Pittman
# modificado em  2005.02.27 - from scribalbuma4.py
# Esta versão é para o formato papel A4 (S.I.)
# Também, coloca 8 imagens por página, deixando pouco espaço para as anotações.
#
# Usa o Tkinter para exibir uma caixa de entrada para o nome do diretório.
# Filtra os arquivos terminados com .jpg, .png, e assim por diante (selecionável pelo usuário)
# Nota: no momento não é possível a seleção de extensões em caixa alta
# Cria um novo documento
#
# Alguma das coisas a serem solucionadas: necessita de um fechamento mais elegante;
# por enquanto pede que você clique
# no X no canto superior direito do quadro raiz, mas pelo menos diz quando
# você deve.
# Eventualmente ser hábil a navegar entre diretórios, talvez mostrar uma
# Listbox (lista de seleção) para a seleção do diretório.


* Thus far, SVGs will not import with this script. What you get is a blank frame. One of those "to do" things.
from scribus import *
import Tkinter
import os


* All images are adjusted to fit the frame size, and the frame size is the same within each script version. Adjusting the frame for individual images is a job best done in Scribus after you have made and loaded the file. These scripts are just meant to do the grunt work, let Scribus do the tweaking.
class ImageDialog(Tkinter.Toplevel):
   
    def __init__(self, parent):
        global jpg, tif, png, pdf, svg, gif
        Tkinter.Toplevel.__init__(self, parent, bg="#bbbbff")


* Once you have entered the directory, selected the image formats, then click OK. Expect some time to go by, during which Scribus frames and icons may blink in and out.
        Tkinter.Label(self, text='Enter the Image Directory, Click OK',bg="#bbbbff").grid(row=0,columnspan=6)


* When the script is done, the formerly blank Tk window now says, "Now click the X in the upper right corner of this window", meaning the X in the corner of the Tk window to delete this window. This ends the script, and Scribus takes over.
        self.e = Tkinter.Entry(self)
        self.e.grid(row=1,columnspan=6)
        self.jpg = Tkinter.StringVar()
        self.tif = Tkinter.StringVar()
        self.png = Tkinter.StringVar()
        self.pdf = Tkinter.StringVar()
        self.svg = Tkinter.StringVar()
        self.gif = Tkinter.StringVar()
        b = Tkinter.Button(self, text='OK', bg="#55ff88", command=self.ok)
        b.grid(row=2,columnspan=6)
        self.protocol("WM_DELETE_WINDOW", self.quit)
        Tkinter.Label(self, text='Filters',bg="#bbbbff").grid(row=3)
        j = Tkinter.Checkbutton(self, text = '.jpg', variable = self.jpg,onvalue='.jpg')
        j.grid(row=4,column=0)
        t = Tkinter.Checkbutton(self, text = '.tif', variable = self.tif,onvalue='.tif')
        t.grid(row=4,column=2)
        p = Tkinter.Checkbutton(self, text = '.png', variable = self.png,onvalue='.png')
        p.grid(row=4, column=4)
        P = Tkinter.Checkbutton(self, text = '.pdf', variable = self.pdf,onvalue='.pdf')
        P.grid(row=5, column=0)
        s = Tkinter.Checkbutton(self, text = '.svg', variable = self.svg,onvalue='.svg')
        s.grid(row=5, column=2)
        g = Tkinter.Checkbutton(self, text = '.gif', variable = self.gif,onvalue='.gif')
        g.grid(row=5, column=4)
        j.select() # uncomment these to have default on settings in Checkbuttons
#        t.select() # j = .jpg, t = .tif, etc.
#        s.select()
#        p.select()
#        P.select()
#        g.select()


* At this point, Scribus is, in essence, loading this file for display, so you may have some considerable time (minutes) go by, depending on the number and size of the images and the speed of your processor.
    def ok(self):
        m = Tkinter.Message(root, text="Agora clique no X no canto superior direito desta janela")
        m.grid(row=0, columnspan=4)
        try:
            D=[]
            imagecount = 0
            filetype = []
            if len(self.jpg.get()) == 4: filetype.append(self.jpg.get())
            if len(self.tif.get()) == 4: filetype.append(self.tif.get())
            if len(self.png.get()) == 4: filetype.append(self.png.get())
            if len(self.pdf.get()) == 4: filetype.append(self.pdf.get())
            if len(self.svg.get()) == 4: filetype.append(self.svg.get())
            if len(self.gif.get()) == 4: filetype.append(self.gif.get())
            d = os.listdir(self.e.get())
            for file in d:
                for format in filetype:
                    if file.endswith(format):
                        D.append(file)
            D.sort()
# Há 8 imagens por página; xpos e ypos são as coordenadas  x,y do canto superior esquerdo
            xpos = (25, 321)  
            ypos = (42, 236, 430, 624)
# Esta proporção é a certa para fotografias (pelo menos com a minha digital Olympus)
            pwidth = 250
            pheight = 187


* If at this point Scribus crashes, you most likely have used up all your RAM and swap memory, and at this time there is no protection built into the script. If you're lucky, Scribus may have saved an emergency file starting with ''"DocumentN..."'', but if it's too big (the file itself may not be very large, it's the memory requirements of all the images that's the source of the problem), Scribus still won't be able to load it, since it will still bump up against the memory problem.
            if newDoc(PAPER_A4, (10,10,20,20),PORTRAIT, 1, UNIT_POINTS, NOFACINGPAGES, FIRSTPAGERIGHT):
                while D[imagecount]:
                    if imagecount > 0:
                        newPage(-1)
# L é o quadro no topo de cada página que mostra o nome de diretório
                    L = createText(15, 20, 200, 20)
                    setText("Dir: " + self.e.get(), L)
                    setTextAlignment(ALIGN_LEFT, L)
                    setFont("Luxi Sans Regular", L)
                    setFontSize(10, L)
# Aqui é onde nós estamos carregando as imagens na página, oito por vez, então volta e cria uma nova página
                    for yframe in ypos:
                        for xframe in xpos:
                            if D[imagecount]:
                                f = createImage(xframe, yframe, pwidth, pheight)
                                loadImage(self.e.get() + '/' + D[imagecount], f)
                                setScaleImageToFrame(scaletoframe=1, proportional=1, name=f)
                                lenfilename = len(D[imagecount])
                                Lpiclen = int(5.3 * lenfilename)
# Lpic é o título de cada imagem com as posição e largura ajustadas
# de acordo com a largura do texto.
# Então se você mudar a fonte ou o seu tamanho, talvez você precise ajustar
# isto para um calculo aproximado.
                                Lpic = createText(xframe + (250 - Lpiclen), yframe + 172, Lpiclen, 15)
                                setText(D[imagecount], Lpic)
                                setTextAlignment(ALIGN_RIGHT, Lpic)
                                setFont("Luxi Mono Regular", Lpic)
                                setFontSize(8, Lpic)
                                setFillColor("White", Lpic)
                                imagecount = imagecount + 1
                   
            setRedraw(1)
            redrawAll()
            self.Tkinter.Toplevel.destroy()
                                       
        except os.error, value:
            Tkinter.Button(root, text=value[1], bg="#ffff55").grid(row=3, columnspan = 4)


== Additional Notes ==
root = Tkinter.Tk()
root.update()


I have yet to try this on the brand-new Windows version of Scribus. An initial issue will be making sure you have Python on your Windows machine.
d = ImageDialog(root)


If I get some specific questions, I can add notes (or others can add them) about how to modify scribalbum.py and scribalbuma4.py to fit other needs.
root.wait_window(d)
</nowiki></pre>

Latest revision as of 00:21, 20 January 2007

Voltar para a página principal

Important.png

Atenção: O artigo 'Importação automática de imagens através de script' foi marcado como desatualizado ou depreciado. As instruções constantes neste artigo podem não funcionar com as úttimas versões do Scribus.
Você pode ajudar a Wiki do Scribus reescrevendo ou atualizando este artigo.

Versão em inglês.

Básico

Uma nova versão está disponível: Importação automática de imagens V2

Primeiramente, a razão de eu ter criado esse scripts foi para aprender alguma coisa sobre Python e para poder criar um arquivador de imagens ou álbum no Scribus. Geralmente eu uso o script para organizar as imagens digitais que eu tiro nas minhas viagens. Uma das vantagens do Scribus é que o seu formato de arquivo .sla não inclui nenhum dado de imagem, mas apenas suas referências, então, este arquivo de catálogo é relativamente pequeno. Eu irei adicionar anotações, fazer um PDF e imprimir um álbum com algumas coleções.

Inicialmente eu criei um programa em Perl a parte (scribalbum.pl) para fazer a criação fora do Scribus. O script ainda funciona, mesmo tendo sido projetado para os formatos de arquivo da versão 1.2.x. Uma de suas vantagens é a velocidade com que ele gera diversas páginas com informações. Sua desvantagem é que ele foi criado para o formato 1.2.x, ou seja, potencialmente incompatível com as novas versões (e até um tanto quanto perigoso). Ajustá-lo para gerar os documentos na nova versão é mais trabalho do que eu gostaria. Melhor carregá-lo no Scribus 1.3.x e então salvar de lá mesmo.

As implementações Python tem a vantagem de usar o próprio Scribus para criar um documento, sendo assim, enquanto o script funcionar o arquivo resultante estará atualizado. Outro benefício é a facilidade de modificação do script para ser ajustado a outras necessidades.

Descrição

scribalbum.pl

Eu não irei dizer nada sobre este programa. Se você conhece alguma coisa de Perl, verá que isto não é "elegante", mas faz o trabalho. Sua operação é através da linha de comando.

scribalbum.py e scribalbuma4.py

Estes scripts são similares, ambos criam um novo documento e quantas páginas forem necessárias. O scribalbum.py coloca quatro imagens desalinhadas uma das outras em uma página de tamanho carta (americana), permitindo anotações nos espaços remanescentes. Já o scribalbum4.py coloca 8 imagens por página A4, deixando pouco espaço livre restante. Ambas as versões farão um quadro de texto no canto superior esquerdo de cada página, indicando qual o diretório que a imagem está. Cada imagem possui um título indicando o nome de arquivo da imagem.

Atualização: O Gregory criou uma nova versão que elimina a necessidade do uso do Tkinter, veja a nova versão (em inglês).

Aqui estão alguns dos recursos que ambos os scripts compartilham:

  • Quando você executar o script no Scribus, duas janelas Tk aparecerão, uma branca e outra que pergunta o nome do diretório e possui caixas de marcação. Você pode usar um caminho relativo. O absoluto será mais preciso.
  • Você pode marcar um ou mais formatos de imagens que você quer. TODAS as imagens daquele tipo serão incluidas - você não pode selecionar e/ou escolher imagens individualmente. Elas aparecerão na ordem alfa-numérica no seu documento, sendo a coluna da esquerda a primeira.
  • PDFs serão importados mas somente a sua primeira página.
  • Por enquanto este script não importa SVGs. O que você tem é um quadro branco. Essa é uma das coisas na lista do meu "a fazer" (TODO).
  • Todas as imagens são ajustadas para coresponder ao tamanho do quadro, sendo o mesmo tamanho de quadro em cada script.. Ajustar um quadro para uma imagem individual é uma tarefa melhor feita no Scribus após você ter feito o arquivo. Estes scripts foram desenvolvidos para fazer o trabalho "grosso". Vamos deixar que o Scribus faça o trabalho de refino.
  • Uma vez que você tenha fornecido o diretório e selecionado os formatos das imagens, basta clicar em OK. Aguarde um tempo (durante este processo os quadros e os ícones do Scribus podem piscar).
  • Quando o script terminar, a janela TK que estava branca agora dirá: Agora clique no X no canto superior direito desta janela, significando que o X no canto da janela Tk irá a apagar. Com esta ação o script termina e o Scribus assume.
  • Neste ponto o Scribus está - em teoria - carregando o arquivo para exibição. Esse processo pode demorar até minutos dependendo do número e do tamanho das imagens, além das configurações de sua máquina (memória, processador etc).
  • Se nesse ponto o Scribus quebrar/travar, provavelmente toda a memória RAM e swap foi usada no seu sistema. Ainda não há uma proteção incluida neste script contra essa possibilidade. Se você tiver sorte, o Scribus terá salvo um arquivo de emergência começando com DocumentN..., mas, se o arquivo for grande demais, o Scribus não conseguirá o carregar, já que a memória continuará criando essa restição (o arquivo por sí só não é grande, o requerimento de memória para todas as imagens que é a fonte do problema).

Notas adicionais

Devido a limitações desconhecidas neste instante, este script não funciona na versão Windows do Scribus; Aguarde até que o problema seja solucionado.

Arquivos

scribalbum.pl

Como este é um programa a parte (stand-alone), suas strings não serão traduzidas. Consulte a página em inglês para ver o código.

scribalbum.py

#!/usr/bin/env python

# Arquivo: scribalbum.py
# originado em 2005.02.13  Gregory Pittman
# modificado em  2005.02.27 - from scribalbuma4.py
# Esta versão é para o formato papel carta (E.U.A)
# Também, apenas coloca 4 imagens por página, permitindo quadros de textos (notas) entre as imagens.
#
# Usa o Tkinter para exibir uma caixa de entrada para o nome do diretório.
# Filtra os arquivos terminados com .jpg, .png, e assim por diante (selecionável pelo usuário)
# Nota: no momento não é possível a seleção de extensões em caixa alta
# Cria um novo documento
#
# Alguma das coisas a serem solucionadas: necessita de um fechamento mais elegante;
# por enquanto pede que você clique
# no X no canto superior direito do quadro raiz, mas pelo menos diz quando
# você deve.
# Eventualmente ser hábil a navegar entre diretórios, talvez mostrar uma
# Listbox (lista de seleção) para a seleção do diretório.

from scribus import *
import Tkinter
import os

class ImageDialog(Tkinter.Toplevel):
    
    def __init__(self, parent):
        global jpg, tif, png, pdf, svg, gif
        Tkinter.Toplevel.__init__(self, parent, bg="#bbbbff")

        Tkinter.Label(self, text='Enter the Image Directory, Click OK',bg="#bbbbff").grid(row=0,columnspan=6)

        self.e = Tkinter.Entry(self)
        self.e.grid(row=1,columnspan=6)
        self.jpg = Tkinter.StringVar()
        self.tif = Tkinter.StringVar()
        self.png = Tkinter.StringVar()
        self.pdf = Tkinter.StringVar()
        self.svg = Tkinter.StringVar()
        self.gif = Tkinter.StringVar()
        b = Tkinter.Button(self, text='OK', bg="#55ff88", command=self.ok)
        b.grid(row=2,columnspan=6)
        self.protocol("WM_DELETE_WINDOW", self.quit)
        Tkinter.Label(self, text='Filters',bg="#bbbbff").grid(row=3)
        j = Tkinter.Checkbutton(self, text = '.jpg', variable = self.jpg,onvalue='.jpg')
        j.grid(row=4,column=0)
        t = Tkinter.Checkbutton(self, text = '.tif', variable = self.tif,onvalue='.tif')
        t.grid(row=4,column=2)
        p = Tkinter.Checkbutton(self, text = '.png', variable = self.png,onvalue='.png')
        p.grid(row=4, column=4)
        P = Tkinter.Checkbutton(self, text = '.pdf', variable = self.pdf,onvalue='.pdf')
        P.grid(row=5, column=0)
        s = Tkinter.Checkbutton(self, text = '.svg', variable = self.svg,onvalue='.svg')
        s.grid(row=5, column=2)
        g = Tkinter.Checkbutton(self, text = '.gif', variable = self.gif,onvalue='.gif')
        g.grid(row=5, column=4)
        j.select() # descomente esta linha para ter uma opção padrão de configuração nos botões de checagem 
#        t.select() # j = .jpg, t = .tif, etc.
#        s.select()
#        p.select()
#        P.select()
#        g.select()

    def ok(self):
        m = Tkinter.Message(root, text="Agora clique no X no canto superior direito desta janela")
        m.grid(row=0, columnspan=4)
        try:
            D=[]
            imagecount = 0
            framecount = 0
            filetype = []
            if len(self.jpg.get()) == 4: filetype.append(self.jpg.get())
            if len(self.tif.get()) == 4: filetype.append(self.tif.get())
            if len(self.png.get()) == 4: filetype.append(self.png.get())
            if len(self.pdf.get()) == 4: filetype.append(self.pdf.get())
            if len(self.svg.get()) == 4: filetype.append(self.svg.get())
            if len(self.gif.get()) == 4: filetype.append(self.gif.get())
            d = os.listdir(self.e.get())
            for file in d:
                for format in filetype:
                    if file.endswith(format):
                        D.append(file)
            D.sort()
# Há 4 imagens por página; xpos e ypos são as coordenadas  x,y do canto superior esquerdo
# As coordenadas são: (15, 42),(15, 388), (310, 187), (310, 533)
            xpos = (15, 310)    
            ypos = (42, 388, 187, 533)
# Esta proporção é a certa para fotografias (pelo menos com a minha digital Olympus)
            pwidth = 288
            pheight = 217

            if newDoc(PAPER_LETTER, (10,10,20,20),PORTRAIT, 1, UNIT_POINTS, NOFACINGPAGES, FIRSTPAGERIGHT):
                while D[imagecount]:
                    if imagecount > 0:
                        newPage(-1)
                        framecount = 0
# L é o quadro no topo de cada página que mostra o nome de diretório
                    L = createText(15, 20, 200, 20)
                    setText("Dir: " + self.e.get(), L)
                    setTextAlignment(ALIGN_LEFT, L)
                    setFont("Luxi Sans Regular", L)
                    setFontSize(10, L)
# Aqui é onde nós estamos carregando as imagens na página, quadro por vez, então volta e cria uma nova página
                    for xframe in xpos:
                            if D[imagecount]:
                                f = createImage(xframe, ypos[framecount], pwidth, pheight)
                                loadImage(self.e.get() + '/' + D[imagecount], f)
                                setScaleImageToFrame(scaletoframe=1, proportional=1, name=f)
                                lenfilename = len(D[imagecount])
                                Lpiclen = int(5.3 * lenfilename)
# Lpic é o título de cada imagem com as posição e largura ajustadas
# de acordo com a largura do texto.
# Então se você mudar a fonte ou o seu tamanho, talvez você precise ajustar
# isto para um calculo aproximado.
                                Lpic = createText(xframe, ypos[framecount] + 217, Lpiclen, 15)
                                setText(D[imagecount], Lpic)
                                setTextAlignment(ALIGN_RIGHT, Lpic)
                                setFont("Luxi Mono Regular", Lpic)
                                setFontSize(8, Lpic)
                                setFillColor("White", Lpic)
                                imagecount = imagecount + 1
                                framecount = framecount + 1
                            if D[imagecount]:
                                f = createImage(xframe, ypos[framecount], pwidth, pheight)
                                loadImage(self.e.get() + '/' + D[imagecount], f)
                                setScaleImageToFrame(scaletoframe=1, proportional=1, name=f)
                                lenfilename = len(D[imagecount])
                                Lpiclen = int(5.3 * lenfilename)
                                Lpic = createText(xframe, ypos[framecount] + 217, Lpiclen, 15)
                                setText(D[imagecount], Lpic)
                                setTextAlignment(ALIGN_RIGHT, Lpic)
                                setFont("Luxi Mono Regular", Lpic)
                                setFontSize(8, Lpic)
                                setFillColor("White", Lpic)
                                imagecount = imagecount + 1
                                framecount = framecount + 1
            setRedraw(1)
            redrawAll()
            self.Tkinter.Toplevel.destroy()
                                        
        except os.error, value:
            Tkinter.Button(root, text=value[1], bg="#ffff55").grid(row=3, columnspan = 4)

root = Tkinter.Tk()
root.update()

d = ImageDialog(root)

root.wait_window(d)


scribalbuma4.py

#!/usr/bin/env python

# Arquivo: scribalbuma4.py
# originado em 2005.02.13  Gregory Pittman
# modificado em  2005.02.27 - from scribalbuma4.py
# Esta versão é para o formato papel A4 (S.I.)
# Também, coloca 8 imagens por página, deixando pouco espaço para as anotações.
#
# Usa o Tkinter para exibir uma caixa de entrada para o nome do diretório.
# Filtra os arquivos terminados com .jpg, .png, e assim por diante (selecionável pelo usuário)
# Nota: no momento não é possível a seleção de extensões em caixa alta
# Cria um novo documento
#
# Alguma das coisas a serem solucionadas: necessita de um fechamento mais elegante; 
# por enquanto pede que você clique
# no X no canto superior direito do quadro raiz, mas pelo menos diz quando
# você deve.
# Eventualmente ser hábil a navegar entre diretórios, talvez mostrar uma
# Listbox (lista de seleção) para a seleção do diretório.

from scribus import *
import Tkinter
import os

class ImageDialog(Tkinter.Toplevel):
    
    def __init__(self, parent):
        global jpg, tif, png, pdf, svg, gif
        Tkinter.Toplevel.__init__(self, parent, bg="#bbbbff")

        Tkinter.Label(self, text='Enter the Image Directory, Click OK',bg="#bbbbff").grid(row=0,columnspan=6)

        self.e = Tkinter.Entry(self)
        self.e.grid(row=1,columnspan=6)
        self.jpg = Tkinter.StringVar()
        self.tif = Tkinter.StringVar()
        self.png = Tkinter.StringVar()
        self.pdf = Tkinter.StringVar()
        self.svg = Tkinter.StringVar()
        self.gif = Tkinter.StringVar()
        b = Tkinter.Button(self, text='OK', bg="#55ff88", command=self.ok)
        b.grid(row=2,columnspan=6)
        self.protocol("WM_DELETE_WINDOW", self.quit)
        Tkinter.Label(self, text='Filters',bg="#bbbbff").grid(row=3)
        j = Tkinter.Checkbutton(self, text = '.jpg', variable = self.jpg,onvalue='.jpg')
        j.grid(row=4,column=0)
        t = Tkinter.Checkbutton(self, text = '.tif', variable = self.tif,onvalue='.tif')
        t.grid(row=4,column=2)
        p = Tkinter.Checkbutton(self, text = '.png', variable = self.png,onvalue='.png')
        p.grid(row=4, column=4)
        P = Tkinter.Checkbutton(self, text = '.pdf', variable = self.pdf,onvalue='.pdf')
        P.grid(row=5, column=0)
        s = Tkinter.Checkbutton(self, text = '.svg', variable = self.svg,onvalue='.svg')
        s.grid(row=5, column=2)
        g = Tkinter.Checkbutton(self, text = '.gif', variable = self.gif,onvalue='.gif')
        g.grid(row=5, column=4)
        j.select() # uncomment these to have default on settings in Checkbuttons
#        t.select() # j = .jpg, t = .tif, etc.
#        s.select()
#        p.select()
#        P.select()
#        g.select()

    def ok(self):
        m = Tkinter.Message(root, text="Agora clique no X no canto superior direito desta janela")
        m.grid(row=0, columnspan=4)
        try:
            D=[]
            imagecount = 0
            filetype = []
            if len(self.jpg.get()) == 4: filetype.append(self.jpg.get())
            if len(self.tif.get()) == 4: filetype.append(self.tif.get())
            if len(self.png.get()) == 4: filetype.append(self.png.get())
            if len(self.pdf.get()) == 4: filetype.append(self.pdf.get())
            if len(self.svg.get()) == 4: filetype.append(self.svg.get())
            if len(self.gif.get()) == 4: filetype.append(self.gif.get())
            d = os.listdir(self.e.get())
            for file in d:
                for format in filetype:
                    if file.endswith(format):
                        D.append(file)
            D.sort()
# Há 8 imagens por página; xpos e ypos são as coordenadas  x,y do canto superior esquerdo
            xpos = (25, 321)    
            ypos = (42, 236, 430, 624)
# Esta proporção é a certa para fotografias (pelo menos com a minha digital Olympus)
            pwidth = 250
            pheight = 187

            if newDoc(PAPER_A4, (10,10,20,20),PORTRAIT, 1, UNIT_POINTS, NOFACINGPAGES, FIRSTPAGERIGHT):
                while D[imagecount]:
                    if imagecount > 0:
                        newPage(-1)
# L é o quadro no topo de cada página que mostra o nome de diretório
                    L = createText(15, 20, 200, 20)
                    setText("Dir: " + self.e.get(), L)
                    setTextAlignment(ALIGN_LEFT, L)
                    setFont("Luxi Sans Regular", L)
                    setFontSize(10, L)
# Aqui é onde nós estamos carregando as imagens na página, oito por vez, então volta e cria uma nova página
                    for yframe in ypos:
                        for xframe in xpos:
                            if D[imagecount]:
                                f = createImage(xframe, yframe, pwidth, pheight)
                                loadImage(self.e.get() + '/' + D[imagecount], f)
                                setScaleImageToFrame(scaletoframe=1, proportional=1, name=f)
                                lenfilename = len(D[imagecount])
                                Lpiclen = int(5.3 * lenfilename)
# Lpic é o título de cada imagem com as posição e largura ajustadas
# de acordo com a largura do texto.
# Então se você mudar a fonte ou o seu tamanho, talvez você precise ajustar
# isto para um calculo aproximado.
                                Lpic = createText(xframe + (250 - Lpiclen), yframe + 172, Lpiclen, 15)
                                setText(D[imagecount], Lpic)
                                setTextAlignment(ALIGN_RIGHT, Lpic)
                                setFont("Luxi Mono Regular", Lpic)
                                setFontSize(8, Lpic)
                                setFillColor("White", Lpic)
                                imagecount = imagecount + 1
                    
            setRedraw(1)
            redrawAll()
            self.Tkinter.Toplevel.destroy()
                                        
        except os.error, value:
            Tkinter.Button(root, text=value[1], bg="#ffff55").grid(row=3, columnspan = 4)

root = Tkinter.Tk()
root.update()

d = ImageDialog(root)

root.wait_window(d)