diff --git a/product/ERP5Form/Extensions/ERP5Site_createModuleScribus.py b/product/ERP5Form/Extensions/ERP5Site_createModuleScribus.py index 9bb199b44166669056d96c42cfbe339294c669e7..6f04d9097078fa25168ef1041953c6be39ec9e7c 100644 --- a/product/ERP5Form/Extensions/ERP5Site_createModuleScribus.py +++ b/product/ERP5Form/Extensions/ERP5Site_createModuleScribus.py @@ -197,15 +197,15 @@ def ERP5Site_createModuleScribus(self, # used only with option_html == 1 # recover image_size image_size = ManageFiles.setBackgroundPictures(import_pdf_file, - object_names, skin_folder, desired_height, desired_width, + object_names, skin_folder, desired_width, desired_height, resolution, background_format) - page_width, page_height = image_size + new_width, new_height = image_size LOG('ERP5Site_createModuleScribus', INFO, - ' height = %s' % str(page_height)) + ' height = %s' % str(new_height)) LOG('ERP5Site_createModuleScribus', INFO, - ' width = %s' % str(page_width)) + ' width = %s' % str(new_width)) LOG('ERP5Site_createModuleScribus', INFO, 'createmodule < background generated') @@ -239,17 +239,17 @@ def ERP5Site_createModuleScribus(self, # get CSS class properties relative to the actual page # (background picture position, picture size, etc.) # and add them to the css dict - width_groups, height_groups = ManageFiles.getPageattributes( + old_width, old_height = ManageFiles.getPageAttributes( global_properties, import_pdf_file) properties_css_dict, properties_page = \ ManageCSS.setPageProperties(properties_css_dict, page_iterator, page_id, - page_height, - page_width, - width_groups, - height_groups) + new_width, + new_height, + old_width, + old_height) # RESUME DATA INTERPRETATION # iterating pageobjects in page @@ -266,8 +266,8 @@ def ERP5Site_createModuleScribus(self, properties_css_dict = ManageCSS.setFieldProperties( properties_css_dict, page_content[index], - page_width, - page_height, + new_width, + new_height, page_iterator, page_gap, keep_page, @@ -289,7 +289,7 @@ def ERP5Site_createModuleScribus(self, # add last properties to css dict, including implementation # of a n+1 page to prevent bug when rendering under Konqueror - ManageCSS.setFinalProperties(properties_css_dict, page_height, + ManageCSS.setFinalProperties(properties_css_dict, new_height, space_between_pages) # generate output string from dict diff --git a/product/ERP5Form/Extensions/ERP5Site_updateModuleScribus.py b/product/ERP5Form/Extensions/ERP5Site_updateModuleScribus.py index bd1239b96402eff62224ae9a7e20ab92a6e35c10..24a8f281917434ca8ca869eee4a65ac727ba126e 100644 --- a/product/ERP5Form/Extensions/ERP5Site_updateModuleScribus.py +++ b/product/ERP5Form/Extensions/ERP5Site_updateModuleScribus.py @@ -221,15 +221,15 @@ def ERP5Site_updateModuleScribus(self, # used only with option_html == 1 # recover image_size image_size = ManageFiles.setBackgroundPictures(import_pdf_file, - object_names, skin_folder, desired_height, desired_width, + object_names, skin_folder, desired_width, desired_height, resolution, background_format) - page_width, page_height = image_size + new_width, new_height = image_size LOG('ERP5Site_updateModuleScribus', INFO, - ' height = %s' % str(page_height)) + ' height = %s' % str(new_height)) LOG('ERP5Site_updateModuleScribus', INFO, - ' width = %s' % str(page_width)) + ' width = %s' % str(new_width)) LOG('ERP5Site_updateModuleScribus', INFO, 'createmodule < background generated') @@ -263,17 +263,17 @@ def ERP5Site_updateModuleScribus(self, # get CSS class properties relative to the actual page # (background picture position, picture size, etc.) # and add them to the css dict - width_groups, height_groups = ManageFiles.getPageattributes( + old_width, old_height = ManageFiles.getPageAttributes( global_properties, import_pdf_file) properties_css_dict, properties_page = \ ManageCSS.setPageProperties(properties_css_dict, page_iterator, page_id, - page_height, - page_width, - width_groups, - height_groups) + new_width, + new_height, + old_width, + old_height) # RESUME DATA INTERPRETATION # iterating pageobjects in page @@ -290,8 +290,8 @@ def ERP5Site_updateModuleScribus(self, properties_css_dict = ManageCSS.setFieldProperties( properties_css_dict, page_content[index], - page_width, - page_height, + new_width, + new_height, page_iterator, page_gap, keep_page, @@ -313,7 +313,7 @@ def ERP5Site_updateModuleScribus(self, # add last properties to css dict, including implementation # of a n+1 page to prevent bug when rendering under Konqueror - ManageCSS.setFinalProperties(properties_css_dict, page_height, + ManageCSS.setFinalProperties(properties_css_dict, new_height, space_between_pages) # generate output string from dict diff --git a/product/ERP5Form/ScribusUtils.py b/product/ERP5Form/ScribusUtils.py index 5b8d9045fb2b9c121ecf982b7c18c6c4f6c26ea6..d97f0060a643205b8a315e92c2766701724a6bf1 100644 --- a/product/ERP5Form/ScribusUtils.py +++ b/product/ERP5Form/ScribusUtils.py @@ -38,7 +38,7 @@ from StringIO import StringIO from zLOG import LOG, TRACE, WARNING, ERROR, INFO import imghdr import random -import getopt, sys, os +import getopt, sys, os, re from urllib import quote from Products.ERP5.ERP5Site import ERP5Site @@ -568,8 +568,8 @@ class ManageFiles: pdf_file, object_names, skin_folder, - desired_height, desired_width, + desired_height, resolution, background_format ): @@ -588,8 +588,10 @@ class ManageFiles: # opening new file on HDD to save PDF content temp_pdf = NamedTemporaryFile() - # opening new file on HDD to save created background image content + # get an unused file name on HDD to save created background image content temp_image = NamedTemporaryFile() + temp_image_name = temp_image.name + temp_image.close() # going to the begining of the input file pdf_file.seek(0) @@ -602,21 +604,21 @@ class ManageFiles: # convert add a '-N' string a the end of the file name if there is more # than one page in the pdf file (where N is the number of the page, # begining at 0) - if os.path.exists(temp_image.name): + if os.path.exists(temp_image_name): # thats mean there's only one page in the pdf file - background_image_list.append(temp_image.name) + background_image_list.append(temp_image_name) else: # in the case of multi-pages pdf file, we must find all files image_number = 0 - while os.path.exists(temp_image.name + '-%s' % image_number): - background_image_list.append(temp_image.name + '-%s' % image_number) + while os.path.exists(temp_image_name + '-%s' % image_number): + background_image_list.append(temp_image_name + '-%s' % image_number) image_number += 1 return background_image_list try: - result = commands.getstatusoutput('convert -density %s -resize %sx%s '\ + result = commands.getstatusoutput('convert -verbose -density %s -resize %sx%s '\ '%s %s' % (resolution, desired_width, desired_height, temp_pdf.name, - background_format + ':' + temp_image.name)) + background_format + ':' + temp_image_name)) # check that the command has been done succeful if result[0] != 0: @@ -638,18 +640,26 @@ class ManageFiles: if not len(background_image_list): LOG('ScribusUtils.setBackgroundPictures :', ERROR, 'no background '\ 'image found') - temp_image.close() raise ValueError, 'Error: ScribusUtils.setBackgroundPictures : '\ 'no background' # get the real size of the first image - # this could be usefull if the user only defined one dimention - # and convert has calculate the other using proportionnality - file_result= commands.getstatusoutput('identify %s' %\ - background_image_list[0]) + # this could be usefull if the user only defined one dimention : + # convert command has calculate the other using proportionnality + rawstr = r''' + PDF\s # The line begin with PDF + (\d+)x(\d+) # old file size + => # Separator between old and new size + (\d+)x(\d+) # The matching pattern : width and height''' + compile_obj = re.compile(rawstr, re.MULTILINE | re.VERBOSE) + match_obj_list = re.findall(compile_obj, result[1]) + + # old size is not use now, and depends of the density convert parameter + #old_size_x = match_obj_list[0][0] + #old_size_y = match_obj_list[0][1] - real_size_x = file_result[1].split(' ')[2].split('x')[0] - real_size_y = file_result[1].split(' ')[2].split('x')[1] + real_size_x = match_obj_list[0][2] + real_size_y = match_obj_list[0][3] # add images in erp5 : image_number = 0 @@ -662,11 +672,10 @@ class ManageFiles: # delete all images created in this method before raise an error background_image_list = makeImageList() - for background_image in background_image_list[1:]: + for background_image in background_image_list: # remove the file from the system if os.path.exists(background_image): os.remove(background_image) - temp_image.close() size_x = int(real_size_x) size_y = int(real_size_y) @@ -675,11 +684,14 @@ class ManageFiles: return (size_x, size_y) - security.declarePublic('getPageattributes') - def getPageattributes (self, + security.declarePublic('getPageAttributes') + def getPageAttributes (self, global_properties, pdf_file ): + '''return the size of the original pdf file (in pts) + This is usefull to calculate proportionnality between original size and + desired size. That permit to place correctly the fields on the page''' import commands from tempfile import NamedTemporaryFile # opening new file on HDD to save PDF content @@ -694,61 +706,32 @@ class ManageFiles: pdf_file.seek(0) # saving content temp_pdf.write(pdf_file.read()) - if os.path.exists(temp_pdf.name): - temp_pdf.close() - width_groups = [] - height_groups = [] - # launching first soft to convert from PDF to PPM - ScribusUtilsOriginaltempsPPM = NamedTemporaryFile(mode="w+b") - ScribusUtilsOriginaltempsPPMName = ScribusUtilsOriginaltempsPPM.name - original_result = commands.getstatusoutput('pdftoppm -r %s %s %s' % (72, - ScribusUtilsOriginaltempsPDFName, ScribusUtilsOriginaltempsPPMName)) - original_result= commands.getstatusoutput('identify %s' % \ - (ScribusUtilsOriginaltempsPPMName + '*')) - - def makePPMFileList(): - ppm_list = [] - # pdftoppm add a '-N' string a the end of the file name if there is more - # than one page in the pdf file (where N is the number of the page, - # begining at 1) - if os.path.exists(ScribusUtilsOriginaltempsPPMName): - # thats mean there's only one page in the pdf file - ppm_list.append(ScribusUtilsOriginaltempsPPMName) - # try to find the other pages if there is more than one (in case of - # multi-pages pdf file) - image_number = 1 - while os.path.exists(ScribusUtilsOriginaltempsPPMName + '-%s.ppm' %\ - image_number): - ppm_list.append(ScribusUtilsOriginaltempsPPMName + '-%s.ppm' % \ - image_number) - image_number += 1 - return ppm_list - - # this lines permit to delete tempory files (about 2.4 Mo for each file !) - # it's temporary because this function must be rewrited or deleted - # (perhaps setBackgroundPictures could return attributes list) - ppm_list = makePPMFileList() - for ppm in ppm_list[1:]: - if os.path.exists(ppm): - os.remove(ppm) - ScribusUtilsOriginaltempsPPM.close() - ScribusUtilsOriginalTempPDF.close() - - pg_nbr = len(original_result[1].split('\n')) - real_size_x = {} - real_size_y = {} - for i in range(0,pg_nbr): - real_size_x[i]= \ - float(original_result[1].split('\n')[i].split(' ')[2].split('x')[1]) - real_size_y[i]= \ - float(original_result[1].split('\n')[i].split(' ')[2].split('x')[0]) - for page_iterator in range(global_properties['page']): - actual_page_height = real_size_x[page_iterator] - actual_page_width = real_size_y[page_iterator] - width_groups.append(actual_page_width) - height_groups.append(actual_page_height) - - return (width_groups, height_groups) + temp_pdf.close() + + + command_output = commands.getstatusoutput('pdfinfo %s' % \ + ScribusUtilsOriginaltempsPDFName) + + if command_output[0] != 0: + LOG('ScribusUtils.getPageAttributes :', ERROR, 'pdfinfo command'\ + 'failed with the following error message : \n%s' % command_output[1]) + raise ValueError, 'Error: convert command failed with the following'\ + 'error message : \n%s' % command_output[1] + + # get the pdf page size + rawstr = r''' + Page\ssize: #begining of the instersting line + \s* #some spaces + (\S+)\sx\s(\S+) #the matching pattern : width and height in pts''' + compile_obj = re.compile(rawstr, re.MULTILINE | re.VERBOSE) + match_obj = re.search(compile_obj, command_output[1]) + width, height = match_obj.groups() + width = int(round(float(width))) + height = int(round(float(height))) + + LOG('width_groups, height_groups', 0, '%s, %s' % (width, height)) + return (width, height) + security.declarePublic('setPropertySheetAndDocument') def setPropertySheetAndDocument(self, @@ -844,10 +827,10 @@ class ManageCSS: ,properties_css_dict ,page_iterator ,page_id - ,page_height - ,page_width - ,width_groups - ,height_groups): + ,new_width + ,new_height + ,old_width + ,old_height): """ recover all CSS data relative to the current page and save these information in the output dict @@ -875,13 +858,13 @@ class ManageCSS: properties_css_page['margin-top'] = "%spx" % (40) # set width and height on page block - properties_css_page['width'] = str (page_width) + 'px' - properties_css_page['height'] = str (page_height) + 'px' + properties_css_page['width'] = str (new_width) + 'px' + properties_css_page['height'] = str (new_height) + 'px' - properties_page['actual_width'] = width_groups[page_iterator] - properties_page['actual_height'] = height_groups[page_iterator] - properties_css_background['height'] = str(page_height) + 'px' - properties_css_background['width'] = str (page_width) + 'px' + properties_page['actual_width'] = old_width + properties_page['actual_height'] = old_height + properties_css_background['height'] = str(new_height) + 'px' + properties_css_background['width'] = str (new_width) + 'px' # adding properties dict to global dicts properties_css_dict['head'][page_id] = properties_css_page properties_css_dict['head'][background_id] = properties_css_background @@ -918,8 +901,8 @@ class ManageCSS: # be found from the current's page top left corner. # that's why Y position must be updated - scaling_factor1 = page_width/properties_page['actual_width'] - scaling_factor2 = page_height/properties_page['actual_height'] + scaling_factor1 = float(page_width)/properties_page['actual_width'] + scaling_factor2 = float(page_height)/properties_page['actual_height'] properties_field['position_y'] = \ str(float(properties_field['position_y']) - \