Скрипт для автоматического изменения параметров страниц LibreOffice Calc
Скрипт для автоматического изменения параметров страниц LibreOffice Calc

Перед нами была поставлена задача - сделать так, чтобы все файлы LibreOffice Calc, в формате ODS автоматически изменяли масштаб и размеры полей справа и слева. Сделать это стандартными средствами LibreOffce Calc не представлялось возможным. Открывать все файлы и менять у них масштаб казалось невозможным. Причиной, по которой побудило нас написание скрипта - послужило то, что 1С: Предприятие 8.3 при сохранение табличных документов в формате PDF - ну может уместить из на одну страницу. Чтобы распечатать документ, нужно изменить масштаб и параметры страницы. Обучать бухгалтерию нам не хотелось, копаться в конфигураторе и изменять печатные формы - дело долгое, мы написали скрипт на Python, который автоматически приводил файлы ODS в нормальный вид.

Как работает скрипт автоматического изменения параметров страниц в LibreOffice

Работает скрипт следующим образом: все файлы сохраняем в папке, заданной в переменной, запускаем скрипт, он меняет параметры страницы, конвертирует их в PDF и посылет на принтер. В конце он удаляет файлы ODS и PDF.

Скрипт был написан и тестировался на ОС Ubuntu Linux 12.04 и 14.04.

Для работы скрипта нужно установить дополнительные компоненты:

sudo apt-get install unoconv

sudo apt-get install python-pip python-dev build-essential

sudo pip install --upgrade pip 

sudo pip install --upgrade virtualenv

Устанавливаем библиотеки для нормальной работы скрипта xlwt

sudo pip install xlwt

sudo pip install xlrd

sudo pip install xlutils

Приводим исходный код скрипта:

#!/usr/bin/python

# -*- coding: latin-1 -*-

import os, sys, subprocess, glob, time, shutil

from xlutils.copy import copy 

from xlrd import open_workbook

from xlwt import easyxf

# Отступ полей с лева

left_margin = 0.59 

# Отступ полей с права

right_margin = 0.27

# Масштаб документа 

scaling = 95

# Название принтера

printer_name = 'PDF'

# Имя пользователья

username = 'sergey' #need to set

# путь всех *.ods, *.pdf файлов

inputDir = '/home/'+username+'/ods'

outputDir = '/home/'+username+'/ods'

tempDir = '/home/'+username+'/temp'

# Если нет диртектории создаем ее для *.pdf файлов

if not os.path.exists(outputDir):

os.makedirs(outputDir);

if not os.path.exists(tempDir):

os.makedirs(tempDir);

# Задаем значения для pdf - масштаб, отступы с лева и с права, и убираем колонтитулы

def SetParams(File0,File1):

rb = open_workbook(File0,formatting_info=True)

r_sheet = rb.sheet_by_index(0) # read only copy to introspect the file

wb = copy(rb) # a writable copy (I can't read values out of this, only write to it)

w_sheet = wb.get_sheet(0) # the sheet to write to within the writable copy

w_sheet.print_scaling=scaling

w_sheet.footer_str=""

w_sheet.header_str=""

w_sheet.left_margin=left_margin

w_sheet.right_margin=right_margin

wb.save(File1)

return 

#for converting ods to pdf 

def convertor(ext, outDir, fileName):

subprocess.call(str('unoconv -f ' + ext + ' -o ' + outDir + ' ' + fileName), shell=True);

return

# Очистить папку с *.ods файлами 

def cleanFolder():

os.chdir(outputDir)

files=glob.glob('*.pdf')

for filename in files:

os.unlink(filename)

return

# Получаем имя файла

def getFileName(string):

filename = os.path.splitext(os.path.basename(string)) 

return filename[0]# Печатаем файл

def printPdf(filename):

subprocess.call(str('unoconv --stdout ' + filename + ' | lpr -U ' + username + ' -P ' + printer_name), shell=True)

return

# Изменяем пробелы на "-" для решения проблемы с файлами, в случае необходимости можно восстановить имена после скрипта

def Renamer():

filenames = os.listdir(inputDir)

for filename in filenames:

os.rename(os.path.join(inputDir, filename), os.path.join(inputDir, filename.replace(' ', '-')))

return

# Читаем из папки все *.ods файлы

Renamer();

try:

for file in os.listdir(inputDir):

# Если название файла заканчивается на *.ods продолжаем логику

if file.endswith(".ods"):

# Конвертируем файл в xls

convertor('xls',tempDir,inputDir+"/"+file);

tempFile0 = tempDir + "/" + getFileName(file) + ".xls";

tempFile0_sh = tempDir + "/" + getFileName(file) + ".xls";

tempFile1 = tempDir + "/" + getFileName(file) + "1.xls";

tempFile1_sh = tempDir + "/" + getFileName(file) + "1.xls";

pdfFile = outputDir+"/"+getFileName(file) + "1.pdf";

pdfFile_sh = outputDir+"/"+getFileName(file) + "1.pdf";

SetParams(tempFile0_sh,tempFile1_sh);

convertor('pdf',outputDir,tempFile1_sh);

os.remove(tempFile0);

os.remove(tempFile1);

printPdf(pdfFile_sh);

# Очищаем папку с ods файлами

os.remove(inputDir + "/" + file.decode(sys.getfilesystemencoding())); 

# Очищаем папку с pdfs файлами

cleanFolder(); 

except IOError:

print "ODS files was not found"

os.rmdir(tempDir);

 

Скрипт сохраняем в формате .py

Запускаем скрипт командой python pdf.py

Скрипт можно добавить в crontab. Приводим скрипт для добавления в crontab:

#write out current crontab

crontab -l > mycron

#echo new cron into cron file

echo "*/5 * * * * python /home/davit/Desktop/pdfConvertorDEMO.py" >> mycron #need to change to correct path of python script

#install new cron file

crontab mycron

rm mycron

Хотите внедрить в своей организации CRM или получить бесплатную консультацию? Тогда звоните нам по телефону: +7(843)202-38-93