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