O problema que todo mundo tenta resolver sozinho
Você baixa uma imagem, quer imprimir algo grande, e aí o Word ou o visualizador de PDF não conseguem lidar com o tamanho direito. A solução mais prática na maioria dos casos é dividir a imagem em folhas A4 mesmo. Eu passei anos tentando fazer isso de formas complicadas — ferramentas online que quebravam, scripts Python que geravam margens estranhas — até encontrar um fluxo que realmente funciona no dia a dia. O que vou explicar aqui é o método que eu uso atualmente. Não é perfeito, mas é direto e evita as armadilhas mais comuns.
Dividir imagem em folhas A4 para imprimir com Python e Pillow
A base do processo é usar a biblioteca Pillow. Você especifica a largura e altura de uma folha A4 na resolução que a impressora vai usar, corta a imagem original em tiles retangulares, e salva cada tile como um PDF ou imagem separada. O script abaixo faz exatamente isso:
from PIL import Image
import sys
import os
def split_image_to_a4(image_path, output_dir, dpi=300):
img = Image.open(image_path)
Conversão de DPI para pixels
a4_width_px = int(210 * dpi / 25.4)
a4_height_px = int(297 * dpi / 25.4)
img_width, img_height = img.size
cols = -(-img_width // a4_width_px) ceiling division
rows = -(-img_height // a4_height_px)
os.makedirs(output_dir, exist_ok=True)
files = []
for r in range(rows):
for c in range(cols):
left = c * a4_width_px
top = r * a4_height_px
right = min(left + a4_width_px, img_width)
bottom = min(top + a4_height_px, img_height)
tile = img.crop((left, top, right, bottom))
filename = f"pagina_{r+1:03d}_{c+1:03d}.png"
tile.save(os.path.join(output_dir, filename))
files.append(filename)
return files
if __name__ == "__main__":
if len(sys.argv) < 3:
print("Uso: python split_a4.py [dpi]")
sys.exit(1)
image_path = sys.argv[1]
output_dir = sys.argv[2]
dpi = int(sys.argv[3]) if len(sys.argv) > 3 else 300
files = split_image_to_a4(image_path, output_dir, dpi)
print(f"Geradas {len(files)} folhas na pasta: {output_dir}")
Um detalhe importante que não aparece nos tutoriais genéricos: a conversão de milímetros para pixels usa a constante 25,4 (polegadas). Se você usar 25,0 ou arredondar mal, as bordas entre as folhas vão ter um descompasso de alguns pixels. Na prática, isso significa que ao montar a imagem impressa, as linhas de corte não vão se alinhar perfeitamente. Eu descobri isso da forma difícil, com um mapa técnico de 80 MB que precisei colar em 12 folhas. As bordas não casavam porque eu tinha usado 300 DPI no script mas a impressora viajava para 298 DPI no driver. A solução foi rodar o script em 298 DPI e ajustar o scale do driver de impressão para 100,7%.
O problema das imagens com aspect ratio irrelevante para A4
Nem toda imagem se encaixa limpo no formato A4. Imagens panorâmicas geram colunas extras, imagens verticais geram linhas extras. O script acima lida com isso usando crop nas bordas — as folhas finais simplesmente serão menores na direção que ultrapassar o limite. Se isso for um problema para seu uso (por exemplo, você precisa que todas as folhas tenham tamanho exatamente igual), você pode adicionar um padding branco usando:
tile = img.crop((left, top, right, bottom))
Pad for final column/row to be full A4 size
if right < img_width or bottom img_height:
padded = Image.new('RGB', (a4_width_px, a4_height_px), (255, 255, 255))
padded.paste(tile, (0, 0))
tile = padded
Essa etapa adicional aumenta o tempo de processamento em cerca de 20% para imagens grandes, mas garante que todas as folhas sejam idênticas no formato.
Alternativa: usar o ImageMagick
Se você não quer escrever código e prefere uma linha de comando, o ImageMagick tem o comando convert com a opção -crop:
convert input.jpg -resize 300x300 -crop 2480x3508 +repage pagina_%03d.jpg
Essa linha gera automaticamente as páginas numeradas. O cálculo de 2480x3508 vem de 210mm x 297mm convertidos para 300 DPI (210/25.4*300 2480, 297/25.4*300 3508). O problema é que o ImageMagick não lida bem com imágenes cuja dimensão não é múltipla exata do tile — ele corta fora o que sobra em vez de criar uma folha menor. Eu precisei contornar isso adicionando um padding antes do crop:
Pad the image to exact multiple of A4 tile size
convert input.jpg \
-gravity Center \
-extent $[ $(convert input.jpg -format "%[fx:ceil(w/2480)*2480)]x$[ $(convert input.jpg -format "%[fx:ceil(h/3508)*3508)]" ] \
-crop 2480x3508 +repage pagina_%03d.jpg
Isso é um workaround necessário mas pouco intuitivo. Se a imagem original já tem dimensões múltiplas exatas, pule essa etapa.
👉 Clique no botão abaixo para saber mais sobre o assunto!
O que acontece quando a imagem é muito grande
Imagens acima de 200 MP tendem a travar o Pillow ou o ImageMagick por memória insuficiente. A solução que eu encontrei foi abrir a imagem em modo "low mem" usando OpenCV e redimensionar antes do processamento:
import cv2
import numpy as np
img = cv2.imread("huge_image.jpg")
Resize to fit within 4GB of RAM (rough estimate: 4GB / 3 bytes per pixel 1.3B pixels)
max_pixels = 1300000000
current_pixels = img.shape[0] * img.shape[1]
if current_pixels > max_pixels:
scale = np.sqrt(max_pixels / current_pixels)
img = cv2.resize(img, (0, 0), fx=scale, fy=scale)
Reduzir a imagem antes de dividir economiza tempo de processamento e evita crashes. O custo é a perda de detalhes finos, mas para fins de impressão em A4, a diferença costuma ser imperceptível a olho nu a menos que você imprima muito perto do papel.
Erros comuns que custaram horas do meu tempo
O primeiro erro foi não considerar o modo de cor. Imagens em modo RGBA (com canal alpha) geram folhas com fundo preto ao invés de transparente quando convertidas para JPEG. A correção é converter explicitamente para RGB antes de salvar:
tile = tile.convert('RGB') if tile.mode == 'RGBA' else tile
O segundo erro foi ignorar a DPI padrão do documento. Alguns visualizadores de PDF assumem 72 DPI por padrão, o que faz as folhas saírem com tamanho errado na hora da impressão. A solução é incluir a metadata de DPI no PDF gerado, ou usar PNG que preserva as dimensões físicas corretas. O terceiro erro foi não testar com uma imagem pequena antes de processar o arquivo grande. Uma configuração errada de margins ou padding pode fazer com que 50 folhas sejam geradas com sobreposição de conteúdo. Teste sempre com uma imagem de 1000x1000 pixels antes de rodar no arquivo real.
Quando NÃO usar essa abordagem
Se você precisa de alta precisão de registro entre as folhas (por exemplo, para mapas técnicos, plantas arquitetônicas ou de alta fidelidade), a divisão em tiles retangulares simples não é suficiente. Nesses casos, recomenda-se usar software especializado como o Adobe Illustrator (conversão para PDF multipágina com marcas de corte) ou o QGIS (para imagens georreferenciadas). O Pillow e o ImageMagick são ferramentas gerais e não tratam de marcas de registro, sangria ou overprint. Outro cenário onde a abordagem falha completamente é com imagens que precisam de rotação ou transformação não-linear entre as folhas. Se a imagem original tem distorção de lente significativa e precisa ser corrigida antes da divisão, o processamento deve ser feito em etapas separadas: correção da distorção redimensionamento divisão em tiles.
Download e instalação
O script Python acima pode ser salvo como split_a4.py e rodado diretamente. Para instalar as dependências:
pip install Pillow
Para o ImageMagick:
Ubuntu/Debian
sudo apt-get install imagemagick
macOS
brew install imagemagick
A versão do ImageMagick precisa ser 7.x para suportar as expressões -extent com variáveis dinâmicas. Versões anteriores (6.x) têm comportamento diferente e podem gerar erros de sintaxe.
Resumo prático do fluxo recomendado
- Teste a imagem com o script Python em resolução 300 DPI
- Verifique se as bordas das folhas se alinham (olhando as folhas lado a lado)
- Se necessário, ajuste o DPI para corresponder à capacidade da sua impressora
- Adicione padding branco apenas se todas as folhas precisarem ter o mesmo tamanho
- Imprima uma folha de teste antes de processar todo o arquivo
Esse fluxo reduz o tempo de iteração de horas para minutos. O ganho real vem de evitar o erro mais comum: processar a imagem inteira e só descobrir depois que as folhas saíram com corte errado ou margens deslocadas.