OCA reporting engine fork for dev and update.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

385 lines
14 KiB

# Copyright 2018 Akretion (http://www.akretion.com)
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import logging
from odoo import _, api, fields, models
from odoo.exceptions import ValidationError
logger = logging.getLogger(__name__)
class Py3oPdfOptions(models.Model):
_name = "py3o.pdf.options"
_description = "Define PDF export options for Libreoffice"
name = fields.Char(required=True)
# GENERAL TAB
# UseLosslessCompression (bool)
image_compression = fields.Selection(
[("lossless", "Lossless Compression"), ("jpeg", "JPEG Compression")],
string="Image Compression",
default="jpeg",
)
# Quality (int)
image_jpeg_quality = fields.Integer(
string="Image JPEG Quality",
default=90,
help="Enter a percentage between 0 and 100.",
)
# ReduceImageResolution (bool) and MaxImageResolution (int)
image_reduce_resolution = fields.Selection(
[
("none", "Disable"),
("75", "75 DPI"),
("150", "150 DPI"),
("300", "300 DPI"),
("600", "600 DPI"),
("1200", "1200 DPI"),
],
string="Reduce Image Resolution",
default="300",
)
watermark = fields.Boolean("Sign With Watermark")
# Watermark (string)
watermark_text = fields.Char("WaterMark Text")
# UseTaggedPDF (bool)
tagged_pdf = fields.Boolean("Tagged PDF (add document structure)")
# SelectPdfVersion (int)
# 0 = PDF 1.4 (default selection).
# 1 = PDF/A-1 (ISO 19005-1:2005)
pdfa = fields.Boolean(
"Archive PDF/A-1a (ISO 19005-1)",
help="If you enable this option, you will not be able to "
"password-protect the document or apply other security settings.",
)
# ExportFormFields (bool)
pdf_form = fields.Boolean("Create PDF Form", default=True)
# FormsType (int)
pdf_form_format = fields.Selection(
[("0", "FDF"), ("1", "PDF"), ("2", "HTML"), ("3", "XML")],
string="Submit Format",
default="0",
)
# AllowDuplicateFieldNames (bool)
pdf_form_allow_duplicate = fields.Boolean("Allow Duplicate Field Names")
# ExportBookmarks (bool)
export_bookmarks = fields.Boolean("Export Bookmarks", default=True)
# ExportPlaceholders (bool)
export_placeholders = fields.Boolean("Export Placeholders", default=True)
# ExportNotes (bool)
export_comments = fields.Boolean("Export Comments")
# ExportHiddenSlides (bool) ??
export_hidden_slides = fields.Boolean("Export Automatically Insered Blank Pages")
# Doesn't make sense to have the option "View PDF after export" ! :)
# INITIAL VIEW TAB
# InitialView (int)
initial_view = fields.Selection(
[("0", "Page Only"), ("1", "Bookmarks and Page"), ("2", "Thumbnails and Page")],
string="Panes",
default="0",
)
# InitialPage (int)
initial_page = fields.Integer(string="Initial Page", default=1)
# Magnification (int)
magnification = fields.Selection(
[
("0", "Default"),
("1", "Fit in Window"),
("2", "Fit Width"),
("3", "Fit Visible"),
("4", "Zoom"),
],
string="Magnification",
default="0",
)
# Zoom (int)
zoom = fields.Integer(
string="Zoom Factor", default=100, help="Possible values: from 50 to 1600"
)
# PageLayout (int)
page_layout = fields.Selection(
[
("0", "Default"),
("1", "Single Page"),
("2", "Continuous"),
("3", "Continuous Facing"),
],
string="Page Layout",
default="0",
)
# USER INTERFACE TAB
# ResizeWindowToInitialPage (bool)
resize_windows_initial_page = fields.Boolean(
string="Resize Windows to Initial Page"
)
# CenterWindow (bool)
center_window = fields.Boolean(string="Center Window on Screen")
# OpenInFullScreenMode (bool)
open_fullscreen = fields.Boolean(string="Open in Full Screen Mode")
# DisplayPDFDocumentTitle (bool)
display_document_title = fields.Boolean(string="Display Document Title")
# HideViewerMenubar (bool)
hide_menubar = fields.Boolean(string="Hide Menubar")
# HideViewerToolbar (bool)
hide_toolbar = fields.Boolean(string="Hide Toolbar")
# HideViewerWindowControls (bool)
hide_window_controls = fields.Boolean(string="Hide Windows Controls")
# OpenBookmarkLevels (int) -1 = all (default) from 1 to 10
open_bookmark_levels = fields.Selection(
[
("-1", "All Levels"),
("1", "1"),
("2", "2"),
("3", "3"),
("4", "4"),
("5", "5"),
("6", "6"),
("7", "7"),
("8", "8"),
("9", "9"),
("10", "10"),
],
default="-1",
string="Visible Bookmark Levels",
)
# LINKS TAB
# ExportBookmarksToPDFDestination (bool)
export_bookmarks_named_dest = fields.Boolean(
string="Export Bookmarks as Named Destinations"
)
# ConvertOOoTargetToPDFTarget (bool)
convert_doc_ref_to_pdf_target = fields.Boolean(
string="Convert Document References to PDF Targets"
)
# ExportLinksRelativeFsys (bool)
export_filesystem_urls = fields.Boolean(string="Export URLs Relative to Filesystem")
# PDFViewSelection -> mnDefaultLinkAction (int)
cross_doc_link_action = fields.Selection(
[
("0", "Default"),
("1", "Open with PDF Reader Application"),
("2", "Open with Internet Browser"),
],
string="Cross-document Links",
default="0",
)
# SECURITY TAB
# EncryptFile (bool)
encrypt = fields.Boolean("Encrypt")
# DocumentOpenPassword (char)
document_password = fields.Char(string="Document Password")
# RestrictPermissions (bool)
restrict_permissions = fields.Boolean("Restrict Permissions")
# PermissionPassword (char)
permission_password = fields.Char(string="Permission Password")
# TODO PreparedPasswords + PreparedPermissionPassword
# I don't see those fields in the LO interface !
# But they are used in the LO code...
# Printing (int)
printing = fields.Selection(
[
("0", "Not Permitted"),
("1", "Low Resolution (150 dpi)"),
("2", "High Resolution"),
],
string="Printing",
default="2",
)
# Changes (int)
changes = fields.Selection(
[
("0", "Not Permitted"),
("1", "Inserting, Deleting and Rotating Pages"),
("2", "Filling in Form Fields"),
("3", "Commenting, Filling in Form Fields"),
("4", "Any Except Extracting Pages"),
],
string="Changes",
default="4",
)
# EnableCopyingOfContent (bool)
content_copying_allowed = fields.Boolean(
string="Enable Copying of Content", default=True
)
# EnableTextAccessForAccessibilityTools (bool)
text_access_accessibility_tools_allowed = fields.Boolean(
string="Enable Text Access for Accessibility Tools", default=True
)
"""
DIGITAL SIGNATURE TAB
This will be possible but not easy
Because the certificate parameter is a pointer to a certificate
already registered in LO
On Linux LO reuses the Mozilla certificate store (on Windows the
one from Windows)
But there seems to be some possibilities to send this certificate via API
It seems you can add temporary certificates during runtime:
https://api.libreoffice.org/docs/idl/ref/
interfacecom_1_1sun_1_1star_1_1security_1_1XCertificateContainer.html
Here is an API to retrieve the known certificates:
https://api.libreoffice.org/docs/idl/ref/
interfacecom_1_1sun_1_1star_1_1xml_1_1crypto_1_1XSecurityEnvironment.html
Thanks to 'samuel_m' on libreoffice-dev IRC chan for pointing me to this
"""
@api.constrains(
"image_jpeg_quality",
"initial_page",
"pdfa",
"cross_doc_link_action",
"magnification",
"zoom",
)
def check_pdf_options(self):
for opt in self:
if opt.image_jpeg_quality > 100 or opt.image_jpeg_quality < 1:
raise ValidationError(
_(
"The parameter Image JPEG Quality must be between 1 %%"
" and 100 %% (current value: %s %%)"
)
% opt.image_jpeg_quality
)
if opt.initial_page < 1:
raise ValidationError(
_(
"The initial page parameter must be strictly positive "
"(current value: %d)"
)
% opt.initial_page
)
if opt.pdfa and opt.cross_doc_link_action == "1":
raise ValidationError(
_(
"The PDF/A option is not compatible with "
"'Cross-document Links' = "
"'Open with PDF Reader Application'."
)
)
if opt.magnification == "4" and (opt.zoom < 50 or opt.zoom > 1600):
raise ValidationError(
_(
"The value of the zoom factor must be between 50 and 1600 "
"(current value: %d)"
)
% opt.zoom
)
@api.onchange("encrypt")
def encrypt_change(self):
if not self.encrypt:
self.document_password = False
@api.onchange("restrict_permissions")
def restrict_permissions_change(self):
if not self.restrict_permissions:
self.permission_password = False
@api.onchange("pdfa")
def pdfa_change(self):
if self.pdfa:
self.pdf_form = False
self.encrypt = False
self.restrict_permissions = False
def odoo2libreoffice_options(self):
self.ensure_one()
options = {}
# GENERAL TAB
if self.image_compression == "lossless":
options["UseLosslessCompression"] = True
else:
options["UseLosslessCompression"] = False
options["Quality"] = self.image_jpeg_quality
if self.image_reduce_resolution != "none":
options["ReduceImageResolution"] = True
options["MaxImageResolution"] = int(self.image_reduce_resolution)
else:
options["ReduceImageResolution"] = False
if self.watermark and self.watermark_text:
options["Watermark"] = self.watermark_text
if self.pdfa:
options["SelectPdfVersion"] = 1
options["UseTaggedPDF"] = self.tagged_pdf
else:
options["SelectPdfVersion"] = 0
if self.pdf_form and self.pdf_form_format and not self.pdfa:
options["ExportFormFields"] = True
options["FormsType"] = int(self.pdf_form_format)
options["AllowDuplicateFieldNames"] = self.pdf_form_allow_duplicate
else:
options["ExportFormFields"] = False
options.update(
{
"ExportBookmarks": self.export_bookmarks,
"ExportPlaceholders": self.export_placeholders,
"ExportNotes": self.export_comments,
"ExportHiddenSlides": self.export_hidden_slides,
}
)
# INITIAL VIEW TAB
options.update(
{
"InitialView": int(self.initial_view),
"InitialPage": self.initial_page,
"Magnification": int(self.magnification),
"PageLayout": int(self.page_layout),
}
)
if self.magnification == "4":
options["Zoom"] = self.zoom
# USER INTERFACE TAB
options.update(
{
"ResizeWindowToInitialPage": self.resize_windows_initial_page,
"CenterWindow": self.center_window,
"OpenInFullScreenMode": self.open_fullscreen,
"DisplayPDFDocumentTitle": self.display_document_title,
"HideViewerMenubar": self.hide_menubar,
"HideViewerToolbar": self.hide_toolbar,
"HideViewerWindowControls": self.hide_window_controls,
}
)
if self.open_bookmark_levels:
options["OpenBookmarkLevels"] = int(self.open_bookmark_levels)
# LINKS TAB
options.update(
{
"ExportBookmarksToPDFDestination": self.export_bookmarks_named_dest,
"ConvertOOoTargetToPDFTarget": self.convert_doc_ref_to_pdf_target,
"ExportLinksRelativeFsys": self.export_filesystem_urls,
"PDFViewSelection": int(self.cross_doc_link_action),
}
)
# SECURITY TAB
if not self.pdfa:
if self.encrypt and self.document_password:
options["EncryptFile"] = True
options["DocumentOpenPassword"] = self.document_password
if self.restrict_permissions and self.permission_password:
# fmt: off
options.update(
{
"RestrictPermissions": True,
"PermissionPassword": self.permission_password,
"Printing": int(self.printing),
"Changes": int(self.changes),
"EnableCopyingOfContent": self.content_copying_allowed,
"EnableTextAccessForAccessibilityTools":
self.text_access_accessibility_tools_allowed,
}
)
# fmt: on
logger.debug("Py3o PDF options ID %s converted to %s", self.id, options)
return options