7 Commits 414fa7e45f ... ce87bc330a

Author SHA1 Message Date
  AlexSidorov ce87bc330a add translated 1 year ago
  AlexSidorov e338a35a1b Merge branch 'master' of https://tj.kbsu.ru/AlexSidorov/propusk 1 year ago
  AlexSidorov 853acb5384 Merge branch 'master' of https://tj.kbsu.ru/AlexSidorov/propusk 1 year ago
  AlexSidorov 09b5a73d57 fix error db 1 year ago
  AlexSidorov 7623e9340a Удалить 'Propusk.exe' 1 year ago
  AlexSidorov 010c3525ec Загрузить файлы '' 1 year ago
  AlexSidorov f519908c25 fix bag print propusk in windows 1 year ago
54 changed files with 2113 additions and 264 deletions
  1. 2 1
      .gitignore
  2. 11 9
      docs/template_propusk.html
  3. 1 1
      init_var.py
  4. 10 2
      main.py
  5. 25 14
      module/CleanerImage.py
  6. 11 1
      module/Printer.py
  7. 8 5
      module/__init__.py
  8. 15 15
      module/wkhtmltopdf.py
  9. 5 0
      poppler/bin/AUTHORS
  10. 23 0
      poppler/bin/BINARIES
  11. 339 0
      poppler/bin/COPYING
  12. 674 0
      poppler/bin/COPYING3
  13. 39 0
      poppler/bin/README
  14. 423 0
      poppler/bin/README-XPDF
  15. BIN
      poppler/bin/freetype6.dll
  16. BIN
      poppler/bin/jpeg62.dll
  17. BIN
      poppler/bin/libcairo-2.dll
  18. BIN
      poppler/bin/libexpat-1.dll
  19. BIN
      poppler/bin/libfontconfig-1.dll
  20. BIN
      poppler/bin/libgcc_s_dw2-1.dll
  21. BIN
      poppler/bin/libpixman-1-0.dll
  22. BIN
      poppler/bin/libpng16-16.dll
  23. BIN
      poppler/bin/libpoppler-79.dll
  24. BIN
      poppler/bin/libpoppler-cpp-0.dll
  25. BIN
      poppler/bin/libstdc++-6.dll
  26. BIN
      poppler/bin/libtiff3.dll
  27. BIN
      poppler/bin/pdfdetach.exe
  28. BIN
      poppler/bin/pdffonts.exe
  29. BIN
      poppler/bin/pdfimages.exe
  30. BIN
      poppler/bin/pdfinfo.exe
  31. BIN
      poppler/bin/pdfseparate.exe
  32. BIN
      poppler/bin/pdftocairo.exe
  33. BIN
      poppler/bin/pdftohtml.exe
  34. BIN
      poppler/bin/pdftoppm.exe
  35. BIN
      poppler/bin/pdftops.exe
  36. BIN
      poppler/bin/pdftotext.exe
  37. BIN
      poppler/bin/pdfunite.exe
  38. BIN
      poppler/bin/zlib1.dll
  39. 1 0
      pyinstaller_window.spec
  40. 7 4
      window/DialogCustomVariables.py
  41. 10 6
      window/DialogHistory.py
  42. 27 23
      window/DialogSettingCam.py
  43. 14 16
      window/ListPersonal.py
  44. 53 30
      window/MainWindow.py
  45. BIN
      window/lang/propusk.ru_RU.qm
  46. 312 0
      window/lang/propusk.ru_RU.ts
  47. 2 2
      window/ui/MainWindow.ui
  48. 3 2
      window/ui_py/ui_DialogAbout.py
  49. 7 13
      window/ui_py/ui_DialogCustomVariables.py
  50. 3 5
      window/ui_py/ui_DialogHistory.py
  51. 10 19
      window/ui_py/ui_DialogListPersonal.py
  52. 8 15
      window/ui_py/ui_DialogListPlace.py
  53. 9 11
      window/ui_py/ui_DialogSettingCam.py
  54. 61 70
      window/ui_py/ui_MainWindow.py

+ 2 - 1
.gitignore

@@ -12,4 +12,5 @@ Propusk_linux/
 .vscode
 build
 .env
-logs
+logs
+pyinstall

+ 11 - 9
docs/template_propusk.html

@@ -1,8 +1,9 @@
 <!DOCTYPE html>
-<html lang="en">
+<html lang="ru">
 
 <head>
     <meta charset="UTF-8">
+    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>{{ id_propusk }}</title>
@@ -34,29 +35,30 @@
                     <b>Время выхода: __________________</b>
                 </td>
                 <td rowspan="2">
-                    <img src="{{document}}" height="650" width="500" />
+                    <img src="file:///{{document}}" height="600" width="500" />
                 </td>
             </tr>
             <tr>
-                <td>
-                    <div style="border: 1px solid #000" width="350" height="300" align="center">
+                <td style="vertical-align: bottom;">
+                    <div style="border: 1px solid #000;" width="350" height="300" align="center">
                         <b>Используйте этот <br> QR-код для прохода <br> через турникет</b>
                         <br>
-                        <img src="{{ qrcode }}" height="300" width="250">
+                        <img src="file:///{{ qrcode }}" height="235" width="250">
                     </div>
 
                 </td>
-                <td>
-                    <img src="{{ face }}"
-                        height="300" width="250">
+                <td style="vertical-align: bottom;">
+                    <img src="file:///{{ face }}" height="291" width="250">
                 </td>
             </tr>
         </tbody>
     </table>
     <br>
     <div>
-            --------------------------------------------------------------------------------------- линия разрыва ----------------------------------------------------------------------------------------
+        --------------------------------------------------------------------------- линия разрыва
+        ---------------------------------------------------------------------------
     </div>
+    <br>
     {% endfor %}
 </body>
 

+ 1 - 1
init_var.py

@@ -16,7 +16,7 @@ os.environ.update({
     'NO_MEDIA_IMAGE': no_media,
     'INDEX_PHOTO': '0',
     'INDEX_CAMERA': '1',
-    'DEFAULT_PATH': '/home/asidorov/Документы/propusk_db'
+    'DEFAULT_PATH': DEFAULT_PATH
 })
 
 def load_variables():

+ 10 - 2
main.py

@@ -1,8 +1,8 @@
 from init_var import *
-import os
-import sys
+import os, sys, locale
 from logger import create_logger
 from PySide6.QtWidgets import QApplication
+from PySide6.QtCore import QLocale, QTranslator, QCoreApplication
 # from appdirs import user_data_dir 
 
 
@@ -21,6 +21,14 @@ def main():
     CleanerImage(os.environ.get('PHOTO_DIR')) \
         .clear()
     
+    translator = QTranslator(app)
+
+    path_lang = os.path.join(os.environ.get("ABSOLUTE_PATH"), "window", "lang")
+    if translator.load(QLocale(), 'propusk', '.', path_lang):
+        app.installTranslator(translator)
+    else:
+        # 
+        print(1)
     
     window = MainWindow()
     window.show()

+ 25 - 14
module/CleanerImage.py

@@ -1,9 +1,12 @@
 from .WorkWithDB import connect, list_propusk
 from sqlalchemy import select
-from appdirs import user_data_dir
-import os
+from sqlalchemy.exc import OperationalError
+from MyMessageBox import show_dialog
+from PySide6.QtWidgets import QMessageBox
+import os, sys
 from logger import logger
 
+
 class CleanerImage:
     def __init__(self, path: str):
         self._path = path
@@ -12,23 +15,31 @@ class CleanerImage:
             self._files_in_db = self._get_list_files_from_db()
         else:
             logger.error(F"Не корректный путь: {path}")
-            raise ValueError(F"Не корректный путь: {path}")
+            sys.exit(0)
 
     def _get_list_files_from_db(self) -> list:
-        with connect() as conn:
-            list_files = select(
-                list_propusk.c.face,
-                list_propusk.c.document
-            ).select_from(list_propusk)
+        try:
+            with connect() as conn:
+                list_files = select(
+                    list_propusk.c.face,
+                    list_propusk.c.document
+                ).select_from(list_propusk)
+            
+                result = conn.execute(list_files).all()
             
-            result = conn.execute(list_files).all()
+                images = []
+                for face, document in result:
+                    images.append(face)
+                    images.append(document)
             
-            images = []
-            for face, document in result:
-                images.append(face)
-                images.append(document)
+                return images
+        except OperationalError as er:
+            logger.fatal(er)
+            show_dialog(QMessageBox.Icon.Critical,
+                        'Не обновлена БД',
+                        'Не сходятся таблицы, для исправления перенесите БД в другую директорию или удалите')
+            sys.exit(0)
             
-            return images
 
     def clear(self) -> None:
         _, _, files = os.walk(self._path).__next__()

+ 11 - 1
module/Printer.py

@@ -4,6 +4,8 @@ from PySide6.QtGui import QPainter, QPixmap, QPageSize
 from PySide6.QtCore import Qt
 from module.wkhtmltopdf import create_pdf
 from pdf2image import convert_from_path
+import time
+from platform import system
 
 
 class Print:
@@ -14,7 +16,15 @@ class Print:
         self.printer.setPageSize(QPageSize.A4)
         
         pdf = create_pdf(text)
-        image = convert_from_path(pdf.get_path_to_pdf())[0].toqimage()
+
+        time.sleep(5)
+
+        image = None
+        if system() in 'Windows':
+            image = convert_from_path(pdf, dpi=600, poppler_path=r'poppler\bin')[0].toqimage()
+        else: 
+            image = convert_from_path(pdf, dpi=600)[0].toqimage()
+
         image = QPixmap.fromImage(image)
         image = image.scaledToWidth(self.printer.width(), Qt.SmoothTransformation)
         

+ 8 - 5
module/__init__.py

@@ -1,18 +1,21 @@
 from datetime import datetime
 import os
+from PySide6.QtWidgets import QApplication
 # from PySide6.QtWidgets import QMessageBox
 
 
-
 def create_filename(prefix: str = "propusk") -> str:
-    file_name = os.path.join(os.environ.get('PHOTO_DIR'), F"{prefix}_{datetime.now().timestamp()}")
-    
+    file_name = os.path.join(os.environ.get(
+        'PHOTO_DIR'), F"{prefix}_{datetime.now().timestamp()}")
+
     match prefix:
         case 'pdf':
             file_name = F"{file_name}.pdf"
-        case _ :
+        case _:
             file_name = F"{file_name}.jpg"
-        
+
     return file_name
 
 
+def translate(string: str) -> str:
+    return QApplication.translate('propusk', string)

+ 15 - 15
module/wkhtmltopdf.py

@@ -1,35 +1,35 @@
 import platform
 import os
 from module import create_filename
-from module.MyMessageBox import show_dialog
-from PySide6.QtWidgets import QMessageBox
 import subprocess
 import appdirs
+from logger import logger
 
 def get_path_wkhtmltopdf() -> str:
     match platform.system():
         case 'Linux':
             result = subprocess.Popen(['whereis wkhtmltopdf'], shell=True, stdout=subprocess.PIPE).stdout.read()
-            return str(result).split(' ')[1]
+            path_programm = str(result).split(' ')[1]
         case 'Windows':
-            path_window_programm = "C:\\Program\ Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe"
-            if os.path.exists(path_window_programm):
-                return path_window_programm
-            else:
-                show_dialog(QMessageBox.Icon.Critical, 
-                            "Не найдено ПО",
-                            "Не установлена программа wkhtmltopdf")
-        case _: ...
-        
+            path_programm = os.path.join("C:\\", "Program Files", "wkhtmltopdf", "bin", "wkhtmltopdf.exe")
+        case _: 
+            return None
+    
+    if os.path.isfile(path_programm) and "wkhtmltopdf" in path_programm:
+        logger.info(F"Find programm: {path_programm}")
+        return path_programm
+    else:
+        return None
+    
 def create_pdf(html_text) -> str:
     path_to = create_filename('pdf')
     
     path_temp_html = os.path.join(appdirs.user_cache_dir(), 'simple.html')
-    with open(path_temp_html, 'w') as file:
+    with open(path_temp_html, 'w', encoding='utf-8') as file:
         file.write(html_text)
     
-    print(F"{get_path_wkhtmltopdf()} {path_temp_html} {path_to}")
-    subprocess.Popen([get_path_wkhtmltopdf(), path_temp_html, path_to])
+    logger.info(F"{get_path_wkhtmltopdf()} --enable-local-file-access {path_temp_html} {path_to}")
+    subprocess.Popen([get_path_wkhtmltopdf(), "--enable-local-file-access", path_temp_html, path_to])
     return path_to
     
     

+ 5 - 0
poppler/bin/AUTHORS

@@ -0,0 +1,5 @@
+xpdf is written by Derek Noonburg <derekn@foolabs.com>
+
+libpoppler is a fork of xpdf-3.00
+
+Current Maintainer: Albert Astals Cid <aacid@kde.org>

+ 23 - 0
poppler/bin/BINARIES

@@ -0,0 +1,23 @@
+Version 0.33.0
+
+Compiled by Alivate Australia 2015
+
+Unless otherwise stated, the software on this site is distributed in the hope 
+that it will be useful, but WITHOUT ANY WARRANTY; without even the implied 
+warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. THERE IS NO 
+WARRANTY FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT 
+WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS PROVIDE THE SOFTWARE 
+"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, 
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
+A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF 
+THE SOFTWARE IS WITH YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE 
+COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. IN NO EVENT UNLESS 
+REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, 
+BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR 
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE SOFTWARE
+(INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE
+OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE SOFTWARE TO 
+OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER HAS BEEN ADVISED OF 
+THE POSSIBILITY OF SUCH DAMAGES. 
+
+http://blog.alivate.com.au/poppler-windows

+ 339 - 0
poppler/bin/COPYING

@@ -0,0 +1,339 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.

+ 674 - 0
poppler/bin/COPYING3

@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.

+ 39 - 0
poppler/bin/README

@@ -0,0 +1,39 @@
+This is poppler, a PDF rendering library.
+
+Poppler is a fork of the xpdf PDF viewer developed by Derek Noonburg
+of Glyph and Cog, LLC.  The purpose of forking xpdf is twofold.
+First, we want to provide PDF rendering functionality as a shared
+library, to centralize the maintenance effort.  Today a number of
+applications incorporate the xpdf code base, and whenever a security
+issue is discovered, all these applications exchange patches and put
+out new releases.  In turn, all distributions must package and release
+new version of these xpdf based viewers.  It's safe to say that
+there's a lot of duplicated effort with the current situation.  Even if
+poppler in the short term introduces yet another xpdf derived code
+base to the world, we hope that over time these applications will
+adopt poppler.  After all, we only need one application to use poppler
+to break even.
+
+Second, we would like to move libpoppler forward in a number of areas
+that don't fit within the goals of xpdf.  By design, xpdf depends on
+very few libraries and runs a wide range of X based platforms.  This
+is a strong feature and reasonable design goal.  However, with poppler
+we would like to replace parts of xpdf that are now available as
+standard components of modern Unix desktop environments.  One such
+example is fontconfig, which solves the problem of matching and
+locating fonts on the system, in a standardized and well understood
+way.  Another example is cairo, which provides high quality 2D
+rendering.  See the file TODO for a list of planned changes.
+
+Please note that xpdf, and thus poppler, is licensed under the GPL,
+not the LGPL.  Consequently, any application using poppler must also
+be licensed under the GPL.  If you want to incorporate Xpdf based PDF
+rendering in a closed source product, please contact Glyph & Cog
+(www.glyphandcog.com) for commercial licensing options. Note that
+this only allows you to use xpdf in a closed source product,
+not poppler itself.
+
+	Kristian Høgsberg, Feb. 27, 2005
+
+
+See the README-XPDF for the original xpdf-3.03 README.

+ 423 - 0
poppler/bin/README-XPDF

@@ -0,0 +1,423 @@
+Xpdf
+====
+
+version 3.03
+2011-aug-15
+
+The Xpdf software and documentation are
+copyright 1996-2011 Glyph & Cog, LLC.
+
+Email: derekn@foolabs.com
+WWW: http://www.foolabs.com/xpdf/
+
+The PDF data structures, operators, and specification are
+copyright 1985-2006 Adobe Systems Inc.
+
+
+What is Xpdf?
+-------------
+
+Xpdf is an open source viewer for Portable Document Format (PDF)
+files.  (These are also sometimes also called 'Acrobat' files, from
+the name of Adobe's PDF software.)  The Xpdf project also includes a
+PDF text extractor, PDF-to-PostScript converter, and various other
+utilities.
+
+Xpdf runs under the X Window System on UNIX, VMS, and OS/2.  The non-X
+components (pdftops, pdftotext, etc.) also run on Windows and Mac OSX
+systems and should run on pretty much any system with a decent C++
+compiler.  Xpdf will run on 32-bit and 64-bit machines.
+
+
+License & Distribution
+----------------------
+
+Xpdf is licensed under the GNU General Pulbic License (GPL), version 2
+or 3.  This means that you can distribute derivatives of Xpdf under
+any of the following:
+  - GPL v2 only
+  - GPL v3 only
+  - GPL v2 or v3
+
+The Xpdf source package includes the text of both GPL versions:
+COPYING for GPL v2, COPYING3 for GPL v3.
+
+Please note that Xpdf is NOT licensed under "any later version" of the
+GPL, as I have no idea what those versions will look like.
+
+If you are redistributing unmodified copies of Xpdf (or any of the
+Xpdf tools) in binary form, you need to include all of the
+documentation: README, man pages (or help files), COPYING, and
+COPYING3.
+
+If you want to incorporate the Xpdf source code into another program
+(or create a modified version of Xpdf), and you are distributing that
+program, you have two options: release your program under the GPL (v2
+and/or v3), or purchase a commercial Xpdf source license.
+
+If you're interested in commercial licensing, please see the Glyph &
+Cog web site:
+
+    http://www.glyphandcog.com/
+
+
+Compatibility
+-------------
+
+Xpdf is developed and tested on Linux.
+
+In addition, it has been compiled by others on Solaris, AIX, HP-UX,
+Digital Unix, Irix, and numerous other Unix implementations, as well
+as VMS and OS/2.  It should work on pretty much any system which runs
+X11 and has Unix-like libraries.  You'll need ANSI C++ and C compilers
+to compile it.
+
+The non-X components of Xpdf (pdftops, pdftotext, pdfinfo, pdffonts,
+pdfdetach, pdftoppm, and pdfimages) can also be compiled on Windows
+and Mac OSX systems.  See the Xpdf web page for details.
+
+If you compile Xpdf for a system not listed on the web page, please
+let me know.  If you're willing to make your binary available by ftp
+or on the web, I'll be happy to add a link from the Xpdf web page.  I
+have decided not to host any binaries I didn't compile myself (for
+disk space and support reasons).
+
+If you can't get Xpdf to compile on your system, send me email and
+I'll try to help.
+
+Xpdf has been ported to the Acorn, Amiga, BeOS, and EPOC.  See the
+Xpdf web page for links.
+
+
+Getting Xpdf
+------------
+
+The latest version is available from:
+
+  http://www.foolabs.com/xpdf/
+
+or:
+
+  ftp://ftp.foolabs.com/pub/xpdf/
+
+Source code and several precompiled executables are available.
+
+Announcements of new versions are posted to comp.text.pdf and emailed
+to a list of people.  If you'd like to receive email notification of
+new versions, just let me know.
+
+
+Running Xpdf
+------------
+
+To run xpdf, simply type:
+
+  xpdf file.pdf
+
+To generate a PostScript file, hit the "print" button in xpdf, or run
+pdftops:
+
+  pdftops file.pdf
+
+To generate a plain text file, run pdftotext:
+
+  pdftotext file.pdf
+
+There are five additional utilities (which are fully described in
+their man pages):
+
+  pdfinfo -- dumps a PDF file's Info dictionary (plus some other
+             useful information)
+  pdffonts -- lists the fonts used in a PDF file along with various
+              information for each font
+  pdfdetach -- lists or extracts embedded files (attachments) from a
+               PDF file
+  pdftoppm -- converts a PDF file to a series of PPM/PGM/PBM-format
+              bitmaps
+  pdfimages -- extracts the images from a PDF file
+
+Command line options and many other details are described in the man
+pages (xpdf(1), etc.) and the VMS help files (xpdf.hlp, etc.).
+
+All of these utilities read an optional configuration file: see the
+xpdfrc(5) man page.
+
+
+Upgrading from Xpdf 3.02 (and earlier)
+--------------------------------------
+
+The font configuration system has been changed.  Previous versions
+used mostly separate commands to configure fonts for display and for
+PostScript output.  As of 3.03, configuration options that make sense
+for both display and PS output have been unified.
+
+The following xpdfrc commands have been removed:
+* displayFontT1, displayFontTT: replaced with fontFile
+* displayNamedCIDFontT1, displayNamedCIDFontTT: replaced with fontFile
+* displayCIDFontT1, displayCIDFontTT: replaced with fontFileCC
+* psFont: replaced with psResidentFont
+* psNamedFont16: replaced with psResidentFont16
+* psFont16: replaced with psResidentFontCC
+
+See the xpdfrc(5) man page for more information on the new commands.
+
+Pdftops will now embed external 16-bit fonts (configured with the
+fontFileCC command) when the PDF file refers to a non-embedded font.
+It does not do any subsetting (yet), so the resulting PS files will be
+large.
+
+
+Compiling Xpdf
+--------------
+
+See the separate file, INSTALL.
+
+
+Bugs
+----
+
+If you find a bug in Xpdf, i.e., if it prints an error message,
+crashes, or incorrectly displays a document, and you don't see that
+bug listed here, please send me email, with a pointer (URL, ftp site,
+etc.) to the PDF file.
+
+
+Acknowledgments
+---------------
+
+Thanks to:
+
+* Patrick Voigt for help with the remote server code.
+* Patrick Moreau, Martin P.J. Zinser, and David Mathog for the VMS
+  port.
+* David Boldt and Rick Rodgers for sample man pages.
+* Brendan Miller for the icon idea.
+* Olly Betts for help testing pdftotext.
+* Peter Ganten for the OS/2 port.
+* Michael Richmond for the Win32 port of pdftops and pdftotext and the
+  xpdf/cygwin/XFree86 build instructions.
+* Frank M. Siegert for improvements in the PostScript code.
+* Leo Smiers for the decryption patches.
+* Rainer Menzner for creating t1lib, and for helping me adapt it to
+  xpdf.
+* Pine Tree Systems A/S for funding the OPI and EPS support in
+  pdftops.
+* Easy Software Products for funding several improvements to the
+  PostScript output code.
+* Tom Kacvinsky for help with FreeType and for being my interface to
+  the FreeType team.
+* Theppitak Karoonboonyanan for help with Thai support.
+* Leonard Rosenthol for help and contributions on a bunch of things.
+* Alexandros Diamantidis and Maria Adaloglou for help with Greek
+  support.
+* Lawrence Lai for help with the CJK Unicode maps.
+
+Various people have contributed modifications made for use by the
+pdftex project:
+
+* Han The Thanh
+* Martin Schröder of ArtCom GmbH
+
+
+References
+----------
+
+Adobe Systems Inc., _PDF Reference, sixth edition: Adobe Portable
+Document Format version 1.7_.
+http://www.adobe.com/devnet/pdf/pdf_reference.html
+[The manual for PDF version 1.7.]
+
+Adobe Systems Inc., "Errata for the PDF Reference, sixth edition,
+version 1.7", October 16, 2006.
+http://www.adobe.com/devnet/pdf/pdf_reference.html
+[The errata for the PDF 1.7 spec.]
+
+Adobe Systems Inc., _PostScript Language Reference_, 3rd ed.
+Addison-Wesley, 1999, ISBN 0-201-37922-8.
+[The official PostScript manual.]
+
+Adobe Systems, Inc., _The Type 42 Font Format Specification_,
+Adobe Developer Support Technical Specification #5012.  1998.
+http://partners.adobe.com/asn/developer/pdfs/tn/5012.Type42_Spec.pdf
+[Type 42 is the format used to embed TrueType fonts in PostScript
+files.]
+
+Adobe Systems, Inc., _Adobe CMap and CIDFont Files Specification_,
+Adobe Developer Support Technical Specification #5014.  1995.
+http://www.adobe.com/supportservice/devrelations/PDFS/TN/5014.CIDFont_Spec.pdf
+[CMap file format needed for Japanese and Chinese font support.]
+
+Adobe Systems, Inc., _Adobe-Japan1-4 Character Collection for
+CID-Keyed Fonts_, Adobe Developer Support Technical Note #5078.
+2000.
+http://partners.adobe.com/asn/developer/PDFS/TN/5078.CID_Glyph.pdf
+[The Adobe Japanese character set.]
+
+Adobe Systems, Inc., _Adobe-GB1-4 Character Collection for
+CID-Keyed Fonts_, Adobe Developer Support Technical Note #5079.
+2000.
+http://partners.adobe.com/asn/developer/pdfs/tn/5079.Adobe-GB1-4.pdf
+[The Adobe Chinese GB (simplified) character set.]
+
+Adobe Systems, Inc., _Adobe-CNS1-3 Character Collection for
+CID-Keyed Fonts_, Adobe Developer Support Technical Note #5080.
+2000.
+http://partners.adobe.com/asn/developer/PDFS/TN/5080.CNS_CharColl.pdf
+[The Adobe Chinese CNS (traditional) character set.]
+
+Adobe Systems Inc., _Supporting the DCT Filters in PostScript Level
+2_, Adobe Developer Support Technical Note #5116.  1992.
+http://www.adobe.com/supportservice/devrelations/PDFS/TN/5116.PS2_DCT.PDF
+[Description of the DCTDecode filter parameters.]
+
+Adobe Systems Inc., _Open Prepress Interface (OPI) Specification -
+Version 2.0_, Adobe Developer Support Technical Note #5660.  2000.
+http://partners.adobe.com/asn/developer/PDFS/TN/5660.OPI_2.0.pdf
+
+Adobe Systems Inc., CMap files.
+ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/adobe/
+[The actual CMap files for the 16-bit CJK encodings.]
+
+Adobe Systems Inc., Unicode glyph lists.
+http://partners.adobe.com/asn/developer/type/unicodegn.html
+http://partners.adobe.com/asn/developer/type/glyphlist.txt
+http://partners.adobe.com/asn/developer/type/corporateuse.txt
+http://partners.adobe.com/asn/developer/type/zapfdingbats.txt
+[Mappings between character names to Unicode.]
+
+Adobe Systems Inc., OpenType Specification v. 1.4.
+http://partners.adobe.com/public/developer/opentype/index_spec.html
+[The OpenType font format spec.]
+
+Aldus Corp., _OPI: Open Prepress Interface Specification 1.3_.  1993.
+http://partners.adobe.com/asn/developer/PDFS/TN/OPI_13.pdf
+
+Anonymous, RC4 source code.
+ftp://ftp.ox.ac.uk/pub/crypto/misc/rc4.tar.gz
+ftp://idea.sec.dsi.unimi.it/pub/crypt/code/rc4.tar.gz
+[This is the algorithm used to encrypt PDF files.]
+
+T. Boutell, et al., "PNG (Portable Network Graphics) Specification,
+Version 1.0".  RFC 2083.
+[PDF uses the PNG filter algorithms.]
+
+CCITT, "Information Technology - Digital Compression and Coding of
+Continuous-tone Still Images - Requirements and Guidelines", CCITT
+Recommendation T.81.
+http://www.w3.org/Graphics/JPEG/
+[The official JPEG spec.]
+
+A. Chernov, "Registration of a Cyrillic Character Set".  RFC 1489.
+[Documentation for the KOI8-R Cyrillic encoding.]
+
+Roman Czyborra, "The ISO 8859 Alphabet Soup".
+http://czyborra.com/charsets/iso8859.html
+[Documentation on the various ISO 859 encodings.]
+
+L. Peter Deutsch, "ZLIB Compressed Data Format Specification version
+3.3".  RFC 1950.
+[Information on the general format used in FlateDecode streams.]
+
+L. Peter Deutsch, "DEFLATE Compressed Data Format Specification
+version 1.3".  RFC 1951.
+[The definition of the compression algorithm used in FlateDecode
+streams.]
+
+Morris Dworkin, "Recommendation for Block Cipher Modes of Operation",
+National Institute of Standards, NIST Special Publication 800-38A,
+2001.
+[The cipher block chaining (CBC) mode used with AES in PDF files.]
+
+Federal Information Processing Standards Publication 197 (FIPS PUBS
+197), "Advanced Encryption Standard (AES)", November 26, 2001.
+[AES encryption, used in PDF 1.6.]
+
+Jim Flowers, "X Logical Font Description Conventions", Version 1.5, X
+Consortium Standard, X Version 11, Release 6.1.
+ftp://ftp.x.org/pub/R6.1/xc/doc/hardcopy/XLFD/xlfd.PS.Z
+[The official specification of X font descriptors, including font
+transformation matrices.]
+
+Foley, van Dam, Feiner, and Hughes, _Computer Graphics: Principles and
+Practice_, 2nd ed.  Addison-Wesley, 1990, ISBN 0-201-12110-7.
+[Colorspace conversion functions, Bezier spline math.]
+
+Robert L. Hummel, _Programmer's Technical Reference: Data and Fax
+Communications_.  Ziff-Davis Press, 1993, ISBN 1-56276-077-7.
+[CCITT Group 3 and 4 fax decoding.]
+
+ISO/IEC, _Information technology -- Lossy/lossless coding of bi-level
+images_.  ISO/IEC 14492, First edition (2001-12-15).
+http://webstore.ansi.org/
+[The official JBIG2 standard.  The final draft of this spec is
+available from http://www.jpeg.org/jbighomepage.html.]
+
+ISO/IEC, _Information technology -- JPEG 2000 image coding system --
+Part 1: Core coding system_.  ISO/IEC 15444-1, First edition
+(2000-12-15).
+http://webstore.ansi.org/
+[The official JPEG 2000 standard.  The final committee draft of this
+spec is available from http://www.jpeg.org/JPEG2000.html, but there
+were changes made to the bitstream format between that draft and the
+published spec.]
+
+ITU, "Standardization of Group 3 facsimile terminals for document
+transmission", ITU-T Recommendation T.4, 1999.
+ITU, "Facsimile coding schemes and coding control functions for Group 4
+facsimile apparatus", ITU-T Recommendation T.6, 1993.
+http://www.itu.int/
+[The official Group 3 and 4 fax standards - used by the CCITTFaxDecode
+stream, as well as the JBIG2Decode stream.]
+
+B. Kaliski, "PKCS #5: Password-Based Cryptography Specification,
+Version 2.0".  RFC 2898.
+[Defines the padding scheme used with AES encryption in PDF files.]
+
+Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz, "Practical
+Fast 1-D DCT Algorithms with 11 Multiplications".  IEEE Intl. Conf. on
+Acoustics, Speech & Signal Processing, 1989, 988-991.
+[The fast IDCT algorithm used in the DCTDecode filter.]
+
+Microsoft, _TrueType 1.0 Font Files_, rev. 1.66.  1995.
+http://www.microsoft.com/typography/tt/tt.htm
+[The TrueType font spec (in MS Word format, naturally).]
+
+V. Ostromoukhov, R.D. Hersch, "Stochastic Clustered-Dot Dithering",
+Conf. Color Imaging: Device-Independent Color, Color Hardcopy, and
+Graphic Arts IV, 1999, SPIE Vol. 3648, 496-505.
+http://diwww.epfl.ch/w3lsp/publications/colour/scd.html
+[The stochastic dithering algorithm used in Xpdf.]
+
+P. Peterlin, "ISO 8859-2 (Latin 2) Resources".
+http://sizif.mf.uni-lj.si/linux/cee/iso8859-2.html
+[This is a web page with all sorts of useful Latin-2 character set and
+font information.]
+
+Charles Poynton, "Color FAQ".
+http://www.inforamp.net/~poynton/ColorFAQ.html
+[The mapping from the CIE 1931 (XYZ) color space to RGB.]
+
+R. Rivest, "The MD5 Message-Digest Algorithm".  RFC 1321.
+[MD5 is used in PDF document encryption.]
+
+Thai Industrial Standard, "Standard for Thai Character Codes for
+Computers", TIS-620-2533 (1990).
+http://www.nectec.or.th/it-standards/std620/std620.htm
+[The TIS-620 Thai encoding.]
+
+Unicode Consortium, "Unicode Home Page".
+http://www.unicode.org/
+[Online copy of the Unicode spec.]
+
+W3C Recommendation, "PNG (Portable Network Graphics) Specification
+Version 1.0".
+http://www.w3.org/Graphics/PNG/
+[Defines the PNG image predictor.]
+
+Gregory K. Wallace, "The JPEG Still Picture Compression Standard".
+ftp://ftp.uu.net/graphics/jpeg/wallace.ps.gz
+[Good description of the JPEG standard.  Also published in CACM, April
+1991, and submitted to IEEE Transactions on Consumer Electronics.]
+
+F. Yergeau, "UTF-8, a transformation format of ISO 10646".  RFC 2279.
+[A commonly used Unicode encoding.]

BIN
poppler/bin/freetype6.dll


BIN
poppler/bin/jpeg62.dll


BIN
poppler/bin/libcairo-2.dll


BIN
poppler/bin/libexpat-1.dll


BIN
poppler/bin/libfontconfig-1.dll


BIN
poppler/bin/libgcc_s_dw2-1.dll


BIN
poppler/bin/libpixman-1-0.dll


BIN
poppler/bin/libpng16-16.dll


BIN
poppler/bin/libpoppler-79.dll


BIN
poppler/bin/libpoppler-cpp-0.dll


BIN
poppler/bin/libstdc++-6.dll


BIN
poppler/bin/libtiff3.dll


BIN
poppler/bin/pdfdetach.exe


BIN
poppler/bin/pdffonts.exe


BIN
poppler/bin/pdfimages.exe


BIN
poppler/bin/pdfinfo.exe


BIN
poppler/bin/pdfseparate.exe


BIN
poppler/bin/pdftocairo.exe


BIN
poppler/bin/pdftohtml.exe


BIN
poppler/bin/pdftoppm.exe


BIN
poppler/bin/pdftops.exe


BIN
poppler/bin/pdftotext.exe


BIN
poppler/bin/pdfunite.exe


BIN
poppler/bin/zlib1.dll


+ 1 - 0
pyinstaller_window.spec

@@ -12,6 +12,7 @@ a = Analysis(
          'C:/Users/user/AppData/Local/Programs/Python/Python311/Lib/site-packages/PySide6/plugins',
          './PySide6/plugins'
         ),
+        ('poppler', './poppler')
         ('./win_sub_lib/api-ms-win-core-path-l1-1-0.dll', '.'),
         ('./win_sub_lib/api-ms-win-shcore-scaling-l1-1-1.dll', '.'),
         ('./docs', './docs'),

+ 7 - 4
window/DialogCustomVariables.py

@@ -1,6 +1,7 @@
 from .ui_py.ui_DialogCustomVariables import Ui_DialogCustomVariables
 from PySide6.QtWidgets import QDialog, QFileDialog, QMessageBox
 from PySide6.QtCore import Qt
+from module import translate
 from module.MyMessageBox import show_dialog
 
 
@@ -24,11 +25,13 @@ class DialogCustomVariables(Ui_DialogCustomVariables, QDialog):
         )
 
     def _show_path_photo(self) -> None:
-        dir = str(QFileDialog.getExistingDirectory(None, "Выбрать директорию где будут храниться фоотографии"))
+        dir = str(QFileDialog.getExistingDirectory(None, translate(
+            'Photo directory')))
         self.path_photo.setText(dir)
 
     def _show_path_database(self) -> None:
-        dir = str(QFileDialog.getExistingDirectory(None, "Выбрать директорию где будет храниться база данных"))
+        dir = str(QFileDialog.getExistingDirectory(None, translate(
+            'Database directory')))
         self.path_db.setText(dir)
 
     def _save(self) -> None:
@@ -37,6 +40,6 @@ class DialogCustomVariables(Ui_DialogCustomVariables, QDialog):
             file.write(F"PHOTO_DIR={self.path_photo.text()} \n")
 
         show_dialog(QMessageBox.Icon.Information,
-                    "Успешно!",
-                    "Сохранения произошло успешно!")
+                    translate('Success'),
+                    translate('Save success'))
         self.close()

+ 10 - 6
window/DialogHistory.py

@@ -2,7 +2,7 @@ import os
 
 # from module.ImageTool import rotate_image
 from pdf2image import convert_from_path
-from PySide6.QtCore import Slot
+from PySide6.QtCore import Slot, QUrl
 from PySide6.QtGui import QPixmap
 from PySide6.QtWidgets import QDialog
 from sqlalchemy import func, select
@@ -16,6 +16,7 @@ from module.TemplatePropusk import TemplatePropusk
 from module.WorkWithDB import connect, list_personal, list_place, list_propusk
 
 from .ui_py.ui_DialogHistory import Ui_DialogHistory
+from time import sleep
 
 
 class DialogHistory(Ui_DialogHistory, QDialog):
@@ -102,9 +103,12 @@ class DialogHistory(Ui_DialogHistory, QDialog):
             # print(render_text)
             
             # Print(render_text)
-            pdf = create_pdf(render_text)
-            image  = convert_from_path(pdf)[0]
-            image_path = create_filename()
-            QPixmap.fromImage(image.toqimage()).save(image_path, 'jpg')
+            # pdf = create_pdf(render_text)
+            # sleep(3)
+            # print(F"file://{pdf}")
+            self.browser.setHtml(render_text)
+            # image  = convert_from_path(pdf)[0]
+            # image_path = create_filename()
+            # QPixmap.fromImage(image.toqimage()).save(image_path, 'jpg')
             
-            self.browser.setText(F"<img src='file:{image_path}'>")
+            # self.browser.setText(F"<img src='file:{image_path}'>")

+ 27 - 23
window/DialogSettingCam.py

@@ -9,15 +9,16 @@ from logger import logger
 
 
 
-class SettingCam(QDialog, Ui_DialogSettingCam):
+class DialogSettingCam(QDialog, Ui_DialogSettingCam):
     def __init__(self, parent=None) -> None:
-        super(SettingCam, self).__init__(parent)
+        super(DialogSettingCam, self).__init__(parent)
         self.setAttribute(Qt.WA_DeleteOnClose)
         self.setupUi(self)
 
         self.widget = None
 
         self.__mode = self.mode_list.currentData()
+        self.tabWidget.setCurrentIndex(0)
         self.__load_cams_from_db()
 
         self.save_setting_cam.clicked.connect(self.__save_cams)
@@ -29,8 +30,8 @@ class SettingCam(QDialog, Ui_DialogSettingCam):
     def __change_type(self) -> None:
         if self.tabWidget.currentIndex() == 1:
             self.__mode = 'document'
-        # else:
-        #     self.__mode = 'video'     
+        else:
+            self.__mode = 'video'     
 
         self.__load_cams_from_db()
 
@@ -43,7 +44,8 @@ class SettingCam(QDialog, Ui_DialogSettingCam):
     def __recreate_widget(self, select_mode: str = 'video') -> None:            
         self.__del_widget()
         if self.tabWidget.currentIndex() == 0:
-            self.widget = create_widget_cam_shecked(mode=select_mode,
+            self.widget = create_widget_cam_shecked(
+                mode=select_mode,
                 name_object=u'widget',
                 obj=self.tab,
                 layout=self.verticalLayout)
@@ -55,17 +57,18 @@ class SettingCam(QDialog, Ui_DialogSettingCam):
 
 
     def __del_widget(self) -> None:
-        try:
-            self.widget.stop_cam()
-        except AttributeError as er:
-            logger.error(er)
-            
         if self.widget is not None:
+            try:
+                self.widget.stop_cam()
+            except AttributeError as er:
+                logger.error(er)
+            
             self.verticalLayout.removeWidget(self.widget)
             self.verticalLayout_3.removeWidget(self.widget)
         
         self.widget = None
 
+    @check_error_sql
     def __load_cams_from_db(self):
         with connect() as conn:
             result = conn.execute(cam_setting.select().where(
@@ -74,11 +77,13 @@ class SettingCam(QDialog, Ui_DialogSettingCam):
             if result:
                 self.__mode = result.mode
                 self.__recreate_widget(self.__mode)
+                logger.info(F'select mode cam {self.__mode}')
                 match self.__mode:
                     case 'video':
                         self.mode_list.setCurrentIndex(0)
                         self.widget.line_cam.setCurrentText(
                             result.selected_cam)
+
                     case 'snapshot':
                         self.mode_list.setCurrentIndex(1)
                         self.widget.line_cam.setText(result.selected_cam)
@@ -86,27 +91,26 @@ class SettingCam(QDialog, Ui_DialogSettingCam):
                         self.widget.line_cam.setCurrentText(
                             result.selected_cam)
                     case _: ...
+                
             else: self.__recreate_widget()
 
+    @check_error_sql
     def __save_cams(self) -> None:
         query = None
         with connect() as conn:
-            try:
-                result = conn.execute(cam_setting.select().where(
+            result = conn.execute(cam_setting.select().where(
                     cam_setting.c.type == self.tabWidget.currentIndex()
-                )).fetchone()
-                if result is None:
-                    query = cam_setting.insert().values(
+            )).fetchone()
+            if result is None:
+                query = cam_setting.insert().values(
                         type=self.tabWidget.currentIndex(),
                         mode=self.__mode,
                         selected_cam=self.widget.get_value())
-                else:
-                    query = cam_setting.update().where(
+            else:
+                query = cam_setting.update().where(
                         cam_setting.c.type == self.tabWidget.currentIndex()
                     ).values(mode=self.__mode, selected_cam=self.widget.get_value())
-                result = conn.execute(query)
-                show_dialog(QMessageBox.Icon.Information, '', 'Сохранено')
-                logger.info('Камера сохранена')
-            except OperationalError as er:
-                logger.error(er)
-                show_dialog(QMessageBox.Icon.Critical, 'Ошибка', 'Произошла ошибка! \nОбратитеcь к администратору')
+            result = conn.execute(query)
+            show_dialog(QMessageBox.Icon.Information, '', 'Сохранено')
+            logger.info(F'Камера сохранена {self.widget.get_value()}')
+            

+ 14 - 16
window/ListPersonal.py

@@ -1,4 +1,5 @@
 from .ui_py.ui_DialogListPersonal import Ui_DialogListPersonal
+from module import translate
 from module.WorkWithDB import connect, list_personal
 from module.MyMessageBox import show_dialog
 
@@ -6,7 +7,6 @@ from PySide6.QtWidgets import QDialog, QListWidgetItem, QMessageBox
 from PySide6.QtCore import Qt, Slot
 
 
-
 class ListPersonal(QDialog, Ui_DialogListPersonal):
     def __init__(self, update_listbox_func, parent=None) -> None:
         super(ListPersonal, self).__init__(parent)
@@ -20,19 +20,18 @@ class ListPersonal(QDialog, Ui_DialogListPersonal):
         self.list_personal_widget.itemSelectionChanged.connect(
             self._selected_item)
         self._load_data()
-        
 
     @Slot()
     def _save(self) -> None:
         if any([
-            self.lastname.text(),
-            self.firstname.text(),
-            self.middlename.text()]):
+                self.lastname.text(),
+                self.firstname.text(),
+                self.middlename.text()]):
             with connect() as conn:
                 insert_personal = list_personal.insert().values(
-                 lastname=self.lastname.text(),
-                 firstname=self.firstname.text(),
-                 middlename=self.middlename.text()
+                    lastname=self.lastname.text(),
+                    firstname=self.firstname.text(),
+                    middlename=self.middlename.text()
                 )
                 conn.execute(insert_personal)
 
@@ -40,11 +39,11 @@ class ListPersonal(QDialog, Ui_DialogListPersonal):
             self._load_data()
         else:
             show_dialog(
-                    QMessageBox.Warning,
-                    title="Пустые поля",
-                    massage="Заполните все поля!"
-                )
-            
+                QMessageBox.Warning,
+                title=translate('Empty fields'),
+                massage=translate('Fill in all fields!')
+            )
+
     def _clean_line_edit(self):
         self.lastname.clear()
         self.firstname.clear()
@@ -76,8 +75,8 @@ class ListPersonal(QDialog, Ui_DialogListPersonal):
             else:
                 show_dialog(
                     QMessageBox.Warning,
-                    title="Не выбран элемент списка",
-                    massage="Выбирите элемент списка перед тем как удалять!"
+                    title=translate('List item not selected'),
+                    massage=translate('Select a list item before deleting!')
                 )
 
         self._clean_line_edit()
@@ -115,4 +114,3 @@ class ListPersonal(QDialog, Ui_DialogListPersonal):
         item = QListWidgetItem(F"{lastname} {firstname} {middlename}")
         item.id = id
         return item
-    

+ 53 - 30
window/MainWindow.py

@@ -7,19 +7,21 @@ from PySide6.QtWidgets import QMainWindow, QMessageBox
 from sqlalchemy.exc import OperationalError
 
 from logger import logger
-from module import create_filename
-from module.cam import IPCam, USBCam, load_image
-from module.lang.ru import *
+from module import create_filename, translate
+from module.cam import IPCam, USBCam
 from module.MyMessageBox import show_dialog
 from module.Printer import Print
 from module.QRCode import make as make_qr
 from module.TemplatePropusk import TemplatePropusk
 from module.WorkWithDB import *
+from module.wkhtmltopdf import get_path_wkhtmltopdf
+from module.ImageTool import rotate_image
 from widgets import PStackedWidget, create_widget_stacked
+from module.cam.USBCam import get_first_cam
 
 from .DialogAbout import DialogAbout
 from .DialogHistory import DialogHistory
-from .DialogSettingCam import SettingCam
+from .DialogSettingCam import DialogSettingCam
 from .ListPersonal import ListPersonal
 from .ListPlace import ListPlace
 from .ui_py.ui_MainWindow import Ui_MainWindow
@@ -28,17 +30,24 @@ vecrot_cam_from_db = [str, str, str]
 
 
 class MainWindow(QMainWindow, Ui_MainWindow):
+    __wwc: IPCam | USBCam = None
+    data_propusk: dict = None
+    stacked_face: PStackedWidget = None
+    __file_name_document: str = None
+    __file_name_face: str = None
+    __mode: str = 'video'
+    __cam_face: str = get_first_cam()
+    __cam_document: str = get_first_cam()
+
     def __init__(self, parent=None) -> None:
 
         super(MainWindow, self).__init__(parent)
         self.setupUi(self)
-        self.__wwc = None
-        self.data_propusk = None
-        self.stacked_face = None
 
         self.date_from.setDateTime(QDateTime().currentDateTime())
         self.date_to.setDateTime(QDateTime().currentDateTime())
 
+        self.__check_wkhtmltopdf()
         self.__init_menu_action()
         self.__init_btn_action()
         self.__update_list_combobox()
@@ -94,7 +103,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
 
     def __show_setting_cam_window(self) -> None:
         self.__stop_cam()
-        SettingCam(self).exec_()
+        DialogSettingCam(self).exec_()
         self.__check_setting_cam()
         self.__create_widget_face_cam()
 
@@ -107,22 +116,33 @@ class MainWindow(QMainWindow, Ui_MainWindow):
         if self.tabWidget.currentIndex() == 1:
             self.__mode = 'video'
 
+    def __checked_rotate_document(self) -> bool:
+        return self.rotate_image_document.isChecked()
+
     def __check_setting_cam(self) -> None:
         try:
             self.__mode, self.__cam_face, self.__cam_document = self.__get_selected_cam()
         except ValueError:
-            logger.warning(warring_cams.get("title"))
+            logger.warning(translate('Cameras not configured'))
             if show_dialog(
                 QMessageBox.Warning,
-                warring_cams.get("title"),
-                warring_cams.get("body")
+                translate('Cameras not configured'),
+                translate('Set up the camera \nSettings -> Camera settings')
             ):
                 self.__show_setting_cam_window()
                 self.__check_setting_cam()
             else:
                 self.close()
         except TypeError:
-            logger.warning(warring_cams.get("title"))
+            logger.warning(translate('Cameras not configured'))
+
+    def __check_wkhtmltopdf(self) -> None:
+        if get_path_wkhtmltopdf() is None:
+            logger.critical(translate('wkhtmltopdf not installed'))
+            show_dialog(QMessageBox.Icon.Critical,
+                        translate("Not found wkhtmltopdf"),
+                        translate("wkhtmltopdf not installed"))
+            sys.exit(0)
 
     def __update_list_combobox(self) -> None:
         self.__load_personal()
@@ -168,11 +188,11 @@ class MainWindow(QMainWindow, Ui_MainWindow):
             try:
                 return cam[0].mode, cam[0].selected_cam, cam[1].selected_cam
             except:
-                logger.error('Нет записи о камерах')
+                logger.error(translate('Missing camera records'))
                 if show_dialog(
                     QMessageBox.Icon.Critical,
-                    'Камера',
-                    'Отсутствуют записи о камерах'
+                    translate('Camera'),
+                    translate('Missing camera records')
                 ):
                     self.__show_setting_cam_window()
                     self.__check_setting_cam()
@@ -188,12 +208,12 @@ class MainWindow(QMainWindow, Ui_MainWindow):
         if self.__wwc is None:
             widget.to_video()
             self.__create_wwc(widget, cam)
-            self.btn_start_cam.setText(stop_cam)
+            self.btn_start_cam.setText(translate('Launch сamera'))
 
         else:
             self.__stop_cam()
             widget.to_image()
-            self.btn_start_cam.setText(start_cam)
+            self.btn_start_cam.setText(translate('Stop camera'))
 
     def __create_wwc(self, widget: PStackedWidget, cam: str) -> None:
         if self.__mode in 'snapshot':
@@ -201,9 +221,11 @@ class MainWindow(QMainWindow, Ui_MainWindow):
             self.__wwc.qLabel = widget.video
             self.__wwc.lnk_connect = cam
             self.__wwc.start()
-        else:
+        elif self.__mode in ('video', 'document'):
             self.__wwc = USBCam(widget.video, cam)
             self.__wwc.start_cam()
+        else:
+            logger.error(F"{translate('No corrected')}: {self.__mode}")
 
     def __take_image(self) -> None:
         if self.tabWidget.currentIndex() == 1:
@@ -215,7 +237,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
                 self.stacked_face.image)
             self.stacked_face.to_image()
 
-        self.btn_start_cam.setText(start_cam)
+        self.btn_start_cam.setText(translate('Launch сamera'))
 
         # self.__stop_cam()
 
@@ -225,6 +247,8 @@ class MainWindow(QMainWindow, Ui_MainWindow):
 
         propusk_data = self.data_propusk.copy()
 
+        if self.__checked_rotate_document():
+            self.__file_name_document = rotate_image(self.__file_name_document)
 
         propusk_data.update({
             "personal": self.personal_combobox.currentText(),
@@ -272,11 +296,11 @@ class MainWindow(QMainWindow, Ui_MainWindow):
                     list_propusk.insert().values(**self.data_propusk)
                 )
 
-                show_dialog(QMessageBox.Icon.Information, '', 'Сохранено')
+                show_dialog(QMessageBox.Icon.Information, '', translate('Save success'))
             except OperationalError as er:
                 logger.error(er)
-                show_dialog(QMessageBox.Icon.Critical, 'Ошибка',
-                            'Произошла ошибка при сохранении! \n Обратитесь к администратору')
+                show_dialog(QMessageBox.Icon.Critical, translate('Error'),
+                            'An error occurred while saving! \n Please contact your administrator')
 
     def __set_default_data(self) -> None:
         self.number_propusk.clear()
@@ -286,10 +310,8 @@ class MainWindow(QMainWindow, Ui_MainWindow):
         if self.__wwc is not None:
             self.__stop_cam()
 
-        self.stacked_document.to_image()
-        self.stacked_face.to_image()
-        load_image(self.stacked_document, os.environ.get('NO_MEDIA_IMAGE'))
-        load_image(self.stacked_face, os.environ.get('NO_MEDIA_IMAGE'))
+        self.stacked_document.set_default_image()
+        self.stacked_face.set_default_image()
 
         self.receiving_man.clear()
         self.purpose_visite.clear()
@@ -299,10 +321,11 @@ class MainWindow(QMainWindow, Ui_MainWindow):
             self.__wwc.stop_cam()
             self.__wwc = None
 
-        self.btn_start_cam.setText(start_cam)
+        self.btn_start_cam.setText(translate('Launch сamera'))
 
     def __create_widget_face_cam(self) -> None:
-        self.gridLayout.removeWidget(self.stacked_face)
+        if self.stacked_face is not None:
+            self.gridLayout.removeWidget(self.stacked_face)
 
         self.stacked_face = create_widget_stacked(
             name_object=u'stacked_face',
@@ -316,6 +339,6 @@ class MainWindow(QMainWindow, Ui_MainWindow):
 
     def __change_text_btn(self) -> None:
         if self.stacked_face.currentIndex() == 0:
-            self.btn_start_cam.setText(stop_cam)
+            self.btn_start_cam.setText(translate('Stop camera'))
         else:
-            self.btn_start_cam.setText(start_cam)
+            self.btn_start_cam.setText(translate('Launch сamera'))

BIN
window/lang/propusk.ru_RU.qm


+ 312 - 0
window/lang/propusk.ru_RU.ts

@@ -0,0 +1,312 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="ru_RU" sourcelanguage="en_US">
+<context>
+    <name>propusk</name>
+    <message>
+        <source>File</source>
+        <translation>Файл</translation>
+    </message>
+
+    <message>
+        <source>Settings</source>
+        <translation>Настройки</translation>
+    </message>
+
+    <message>
+        <source>About</source>
+        <translation>О программе</translation>
+    </message>
+
+    <message>
+        <source>Exit</source>
+        <translation>Выход</translation>
+    </message>
+
+    <message>
+        <source>History</source>
+        <translation>История</translation>
+    </message>
+
+    <message>
+        <source>Pass history</source>
+        <translation>История пропусков</translation>
+    </message>
+
+    <message>
+        <source>Camera settings</source>
+        <translation>Настройки камеры</translation>
+    </message>
+
+    <message>
+        <source>Lists</source>
+        <translation>Списки</translation>
+    </message>
+
+    <message>
+        <source>List</source>
+        <translation>Список</translation>
+    </message>
+
+    <message>
+        <source>Employees</source>
+        <translation>Сотрудники</translation>
+    </message>
+
+    <message>
+        <source>Place of issue</source>
+        <translation>Место выдачи</translation>
+    </message>
+
+    <message>
+        <source>Name of place of issue</source>
+        <translation>Наименование места выдачи</translation>
+    </message>
+
+    <message>
+        <source>List of places of issue</source>
+        <translation>Список мест выдачи</translation>
+    </message>
+
+    <message>
+        <source>Update lists</source>
+        <translation>Обновить списки</translation>
+    </message>
+
+    <message>
+        <source>Flip document</source>
+        <translation>Переворачивать документ</translation>
+    </message>
+
+    <message>
+        <source>Do not flip the document</source>
+        <translation>Не переворачивать документ</translation>
+    </message>
+
+    <message>
+        <source>Information</source>
+        <translation>Информация</translation>
+    </message>
+
+    <message>
+        <source>Temporary pass</source>
+        <translation>Временный пропуск</translation>
+    </message>
+
+    <message>
+        <source>Date and time of issue</source>
+        <translation>Дата и время выдачи</translation>
+    </message>
+
+    <message>
+        <source>Valid until</source>
+        <translation>Действителен до</translation>
+    </message>
+
+    <message>
+        <source>Who issued</source>
+        <translation>Кто выдал</translation>
+    </message>
+
+    <message>
+        <source>Receiving</source>
+        <translation>Принимающий</translation>
+    </message>
+
+    <message>
+        <source>Purpose of the visit</source>
+        <translation>Цель визита</translation>
+    </message>
+
+    <message>
+        <source>Launch сamera</source>
+        <translation>Запустить камеру</translation>
+    </message>
+
+    <message>
+        <source>Stop camera</source>
+        <translation>Остановить камеру</translation>
+    </message>
+
+    <message>
+        <source>Take photo</source>
+        <translation>Сфотографировать</translation>
+    </message>
+
+    <message>
+        <source>Clear</source>
+        <translation>Отчистить</translation>
+    </message>
+
+    <message>
+        <source>Save</source>
+        <translation>Сохранить</translation>
+    </message>
+
+    <message>
+        <source>Save settings</source>
+        <translation>Сохранить настройки</translation>
+    </message>
+
+    <message>
+        <source>Load</source>
+        <translation>Загрузить</translation>
+    </message>
+
+    <message>
+        <source>Print</source>
+        <translation>Печать</translation>
+    </message>
+
+    <message>
+        <source>Face camera</source>
+        <translation>Камера для лица</translation>
+    </message>
+
+    <message>
+        <source>Document camera</source>
+        <translation>Камера для документа</translation>
+    </message>
+
+    <message>
+        <source>Control</source>
+        <translation>Управление</translation>
+    </message>
+
+    <message>
+        <source>Last name</source>
+        <translation>Фамилия</translation>
+    </message>
+
+    <message>
+        <source>First name</source>
+        <translation>Имя</translation>
+    </message>
+
+    <message>
+        <source>Middle name</source>
+        <translation>Отчество</translation>
+    </message>
+
+    <message>
+        <source>Update</source>
+        <translation>Обновить</translation>
+    </message>
+
+    <message>
+        <source>Delete</source>
+        <translation>Удалить</translation>
+    </message>
+
+    <message>
+        <source>List employees</source>
+        <translation>Список сотрудников</translation>
+    </message>
+
+    <message>
+        <source>USB Camera</source>
+        <translation>USB камера</translation>
+    </message>
+
+    <message>
+        <source>IP Camera</source>
+        <translation>IP камера</translation>
+    </message>
+
+    <message>
+        <source>Cameras not configured</source>
+        <translation>Камеры не настроины</translation>
+    </message>
+
+    <message>
+        <source>Set up the camera \nSettings -> Camera settings</source>
+        <translation>Настройте камеры \nНастройки -> Настройки камеры</translation>
+    </message>
+
+    <message>
+        <source>wkhtmltopdf not installed</source>
+        <translation>Не установлена программа wkhtmltopdf</translation>
+    </message>
+
+    <message>
+        <source>Not found wkhtmltopdf</source>
+        <translation>Не найден wkhtmltopdf</translation>
+    </message>
+
+    <message>
+        <source>Save success</source>
+        <translation>Сохранено</translation>
+    </message>
+
+    <message>
+        <source>Success</source>
+        <translation>Успешно</translation>
+    </message>
+
+    <message>
+        <source>Error</source>
+        <translation>Ошибка</translation>
+    </message>
+
+    <message>
+        <source>An error occurred while saving! \n Please contact your administrator</source>
+        <translation>Произошла ошибка при сохранении! \n Обратитесь к администратору</translation>
+    </message>
+
+    <message>
+        <source>No corrected</source>
+        <translation>Не корректный</translation>
+    </message>
+
+    <message>
+        <source>Missing camera records</source>
+        <translation>Отсутствуют записи о камерах</translation>
+    </message>
+
+    <message>
+        <source>Camera</source>
+        <translation>Камера</translation>
+    </message>
+
+    <message>
+        <source>Empty fields</source>
+        <translation>Пустые поля</translation>
+    </message>
+
+    <message>
+        <source>Fill in all fields!</source>
+        <translation>Заполните все поля!</translation>
+    </message>
+
+    <message>
+        <source>List item not selected</source>
+        <translation>Не выбран элемент списка</translation>
+    </message>
+
+    <message>
+        <source>Select a list item before deleting!</source>
+        <translation>Выберите элемент списка перед тем как удалять!</translation>
+    </message>
+
+    <message>
+        <source>Open directory</source>
+        <translation>Открыть директорию</translation>
+    </message>
+
+    <message>
+        <source>Photo directory</source>
+        <translation>Директория с фотографиями</translation>
+    </message>
+
+    <message>
+        <source>Database directory</source>
+        <translation>Директория с базой данных</translation>
+    </message>
+
+    <message>
+        <source>Initial settings</source>
+        <translation>Изначальные настройки</translation>
+    </message>
+
+</context>
+</TS>

+ 2 - 2
window/ui/MainWindow.ui

@@ -120,7 +120,7 @@
             <widget class="QDateTimeEdit" name="date_from">
              <property name="dateTime">
               <datetime>
-               <hour>9</hour>
+               <hour>6</hour>
                <minute>0</minute>
                <second>0</second>
                <year>1999</year>
@@ -396,7 +396,7 @@
      <x>0</x>
      <y>0</y>
      <width>1095</width>
-     <height>28</height>
+     <height>22</height>
     </rect>
    </property>
    <property name="mouseTracking">

+ 3 - 2
window/ui_py/ui_DialogAbout.py

@@ -10,6 +10,7 @@
 
 from PySide6.QtCore import (QCoreApplication, QMetaObject, QSize, Qt)
 from PySide6.QtWidgets import (QHBoxLayout, QLabel, QSizePolicy, QSpacerItem, QVBoxLayout)
+from module import translate
 
 class Ui_DialogAbout(object):
     def setupUi(self, DialogAbout):
@@ -71,8 +72,8 @@ class Ui_DialogAbout(object):
     # setupUi
 
     def retranslateUi(self, DialogAbout):
-        DialogAbout.setWindowTitle(QCoreApplication.translate("DialogAbout", u"\u041e \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435", None))
-        self.label.setText(QCoreApplication.translate("DialogAbout", u"Propusk", None))
+        DialogAbout.setWindowTitle(translate('About'))
+        self.label.setText(translate('Temporary pass'))
         self.version.setText(QCoreApplication.translate("DialogAbout", u"TextLabel", None))
         self.label_3.setText(QCoreApplication.translate("DialogAbout", u"Git:", None))
         self.label_4.setText(QCoreApplication.translate("DialogAbout", u"<a href=\"https://tj.kbsu.ru/AlexSidorov/propusk\">https://tj.kbsu.ru/AlexSidorov/propusk</a>", None))

+ 7 - 13
window/ui_py/ui_DialogCustomVariables.py

@@ -13,7 +13,7 @@ from PySide6.QtCore import (QCoreApplication, QMetaObject, QSize)
 from PySide6.QtWidgets import (QGroupBox, QHBoxLayout,
                                QLineEdit, QPushButton, QSizePolicy, QSpacerItem,
                                QVBoxLayout)
-
+from module import translate
 
 class Ui_DialogCustomVariables(object):
     def setupUi(self, DialogCustomVariables):
@@ -77,16 +77,10 @@ class Ui_DialogCustomVariables(object):
     # setupUi
 
     def retranslateUi(self, DialogCustomVariables):
-        DialogCustomVariables.setWindowTitle(QCoreApplication.translate(
-            "DialogCustomVariables", u"\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438", None))
-        self.groupBox.setTitle(QCoreApplication.translate(
-            "DialogCustomVariables", u"\u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0441 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f\u043c\u0438", None))
-        self.btn_show_path_photo.setText(QCoreApplication.translate(
-            "DialogCustomVariables", u"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u043f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438", None))
-        self.groupBox_2.setTitle(QCoreApplication.translate(
-            "DialogCustomVariables", u"\u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445", None))
-        self.btn_show_path_database.setText(QCoreApplication.translate(
-            "DialogCustomVariables", u"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u043f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438", None))
-        self.btn_save.setText(QCoreApplication.translate(
-            "DialogCustomVariables", u"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c", None))
+        DialogCustomVariables.setWindowTitle(translate('Initial settings'))
+        self.groupBox.setTitle(translate('Photo directory'))
+        self.btn_show_path_photo.setText(translate('Open directory'))
+        self.groupBox_2.setTitle(translate('Database directory'))
+        self.btn_show_path_database.setText(translate('Open directory'))
+        self.btn_save.setText(translate('Save'))
     # retranslateUi

+ 3 - 5
window/ui_py/ui_DialogHistory.py

@@ -11,7 +11,7 @@
 from PySide6.QtCore import (QCoreApplication, QMetaObject)
 from PySide6.QtWidgets import (QGroupBox, QHBoxLayout,
                                QLineEdit, QListWidget, QTextBrowser, QVBoxLayout)
-
+from module import translate
 
 class Ui_DialogHistory(object):
     def setupUi(self, DialogHistory):
@@ -47,8 +47,6 @@ class Ui_DialogHistory(object):
     # setupUi
 
     def retranslateUi(self, DialogHistory):
-        DialogHistory.setWindowTitle(QCoreApplication.translate(
-            "DialogHistory", u"История пропусков", None))
-        self.groupBox.setTitle(QCoreApplication.translate(
-            "DialogHistory", u"\u0421\u043f\u0438\u0441\u043e\u043a", None))
+        DialogHistory.setWindowTitle(translate('Pass history'))
+        self.groupBox.setTitle(translate('List'))
     # retranslateUi

+ 10 - 19
window/ui_py/ui_DialogListPersonal.py

@@ -12,7 +12,7 @@ from PySide6.QtCore import (QCoreApplication, QMetaObject, QSize)
 from PySide6.QtWidgets import (QGridLayout, QGroupBox,
                                QHBoxLayout, QLabel, QLineEdit, QListWidget, QPushButton, QSizePolicy, QSpacerItem,
                                QVBoxLayout)
-
+from module import translate
 
 class Ui_DialogListPersonal(object):
     def setupUi(self, DialogListPersonal):
@@ -137,22 +137,13 @@ class Ui_DialogListPersonal(object):
     # setupUi
 
     def retranslateUi(self, DialogListPersonal):
-        DialogListPersonal.setWindowTitle(QCoreApplication.translate(
-            "DialogListPersonal", u"Список сотрудников", None))
-        self.groupBox.setTitle(QCoreApplication.translate(
-            "DialogListPersonal", u"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432", None))
-        self.groupBox_2.setTitle(QCoreApplication.translate(
-            "DialogListPersonal", u"\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435", None))
-        self.label.setText(QCoreApplication.translate(
-            "DialogListPersonal", u"\u0424\u0430\u043c\u0438\u043b\u0438\u044f", None))
-        self.label_2.setText(QCoreApplication.translate(
-            "DialogListPersonal", u"\u0418\u043c\u044f", None))
-        self.label_3.setText(QCoreApplication.translate(
-            "DialogListPersonal", u"\u041e\u0442\u0447\u0435\u0442\u0432\u043e", None))
-        self.btn_save_personal.setText(QCoreApplication.translate(
-            "DialogListPersonal", u"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c", None))
-        self.btn_update_personal.setText(QCoreApplication.translate(
-            "DialogListPersonal", u"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c", None))
-        self.btn_delete_personal.setText(QCoreApplication.translate(
-            "DialogListPersonal", u"\u0423\u0434\u0430\u043b\u0438\u0442\u044c", None))
+        DialogListPersonal.setWindowTitle(translate('List employees'))
+        self.groupBox.setTitle(translate('List employees'))
+        self.groupBox_2.setTitle(translate('Control'))
+        self.label.setText(translate('Last name'))
+        self.label_2.setText(translate('First name'))
+        self.label_3.setText(translate('Middle name'))
+        self.btn_save_personal.setText(translate('Save'))
+        self.btn_update_personal.setText(translate('Update'))
+        self.btn_delete_personal.setText(translate('Delete'))
     # retranslateUi

+ 8 - 15
window/ui_py/ui_DialogListPlace.py

@@ -12,7 +12,7 @@ from PySide6.QtCore import (QCoreApplication, QMetaObject, QSize)
 from PySide6.QtWidgets import (QGridLayout, QGroupBox,
                                QHBoxLayout, QLabel, QLineEdit, QListWidget, QPushButton, QSizePolicy, QSpacerItem,
                                QVBoxLayout)
-
+from module import translate
 
 class Ui_DialogListPlace(object):
     def setupUi(self, DialogListPlace):
@@ -92,18 +92,11 @@ class Ui_DialogListPlace(object):
     # setupUi
 
     def retranslateUi(self, DialogListPlace):
-        DialogListPlace.setWindowTitle(QCoreApplication.translate(
-            "DialogListPlace", u"Список мест выдачи", None))
-        self.groupBox.setTitle(QCoreApplication.translate(
-            "DialogListPlace", u"\u0421\u043f\u0438\u0441\u043e\u043a \u043c\u0435\u0441\u0442 \u0432\u044b\u0434\u0430\u0447\u0438", None))
-        self.groupBox_2.setTitle(QCoreApplication.translate(
-            "DialogListPlace", u"\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435", None))
-        self.label.setText(QCoreApplication.translate(
-            "DialogListPlace", u"\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0435\u0441\u0442\u0430 \u0432\u044b\u0434\u0430\u0447\u0438:", None))
-        self.btn_save_place.setText(QCoreApplication.translate(
-            "DialogListPlace", u"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c", None))
-        self.btn_update_place.setText(QCoreApplication.translate(
-            "DialogListPlace", u"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c", None))
-        self.btn_delete_place.setText(QCoreApplication.translate(
-            "DialogListPlace", u"\u0423\u0434\u0430\u043b\u0438\u0442\u044c", None))
+        DialogListPlace.setWindowTitle(translate('List of places of issue'))
+        self.groupBox.setTitle(translate('List of places of issue'))
+        self.groupBox_2.setTitle(translate('Control'))
+        self.label.setText(translate('Name of place of issue'))
+        self.btn_save_place.setText(translate('Save'))
+        self.btn_update_place.setText(translate('Update'))
+        self.btn_delete_place.setText(translate('Delete'))
     # retranslateUi

+ 9 - 11
window/ui_py/ui_DialogSettingCam.py

@@ -11,6 +11,7 @@
 from PySide6.QtCore import (QCoreApplication, QMetaObject)
 from PySide6.QtWidgets import (
     QComboBox, QPushButton, QTabWidget, QVBoxLayout, QWidget)
+from module import translate
 
 
 class Ui_DialogSettingCam(object):
@@ -53,22 +54,19 @@ class Ui_DialogSettingCam(object):
 
         self.retranslateUi(DialogSettingCam)
 
-        self.tabWidget.setCurrentIndex(0)
+        
 
         QMetaObject.connectSlotsByName(DialogSettingCam)
     # setupUi
 
     def retranslateUi(self, DialogSettingCam):
-        DialogSettingCam.setWindowTitle(QCoreApplication.translate(
-            "DialogSettingCam", u"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043a\u0430\u043c\u0435\u0440\u044b", None))
+        DialogSettingCam.setWindowTitle(translate('Camera settings'))
 
-        self.mode_list.addItem('USB Camera', userData='video')
-        self.mode_list.addItem('IP Camera', userData='snapshot')
+        self.mode_list.addItem(translate('USB Camera'), userData='video')
+        self.mode_list.addItem(translate('IP Camera'), userData='snapshot')
+        self.mode_list.setCurrentIndex(0)
         
-        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), QCoreApplication.translate(
-            "DialogSettingCam", u"\u041A\u0430\u043C\u0435\u0440\u0430 \u0434\u043B\u044F \u043B\u0438\u0446\u0430", None))
-        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), QCoreApplication.translate(
-            "DialogSettingCam", u"\u041A\u0430\u043C\u0435\u0440\u0430 \u0434\u043B\u044F \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430", None))
-        self.save_setting_cam.setText(QCoreApplication.translate(
-            "DialogSettingCam", u"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438", None))
+        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), translate('Face camera'))
+        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), translate('Document camera'))
+        self.save_setting_cam.setText(translate('Save settings'))
     # retranslateUi

+ 61 - 70
window/ui_py/ui_MainWindow.py

@@ -10,12 +10,8 @@
 
 from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
                             QMetaObject, QObject, QPoint, QRect,
-                            QSize, QTime, QUrl, Qt)
-from PySide6.QtGui import (QAction, QBrush, QColor, QConicalGradient,
-                           QCursor, QFont, QFontDatabase, QGradient,
-                           QIcon, QImage, QKeySequence, QLinearGradient,
-                           QPainter, QPalette, QPixmap, QRadialGradient,
-                           QTransform)
+                            QSize, QTime, Qt)
+from PySide6.QtGui import (QAction, QActionGroup)
 from PySide6.QtMultimediaWidgets import QVideoWidget
 from PySide6.QtWidgets import (QApplication, QComboBox, QDateTimeEdit, QFrame,
                                QGridLayout, QGroupBox, QHBoxLayout, QLabel,
@@ -25,6 +21,7 @@ from PySide6.QtWidgets import (QApplication, QComboBox, QDateTimeEdit, QFrame,
                                QWidget)
 
 from widgets import PLineEdit, PStackedWidget
+from module import translate
 
 
 class Ui_MainWindow(object):
@@ -264,6 +261,20 @@ class Ui_MainWindow(object):
 
         self.verticalLayout_6.addLayout(self.horizontalLayout_8)
 
+        self.rotate_image_document = QAction(MainWindow)
+        self.rotate_image_document.setObjectName(u"rotate_image_document")
+        self.rotate_image_document.setCheckable(True)
+        self.rotate_image_document.setChecked(True)
+        self.no_rotate_image_document = QAction(MainWindow)
+        self.no_rotate_image_document.setObjectName(
+            u"no_rotate_image_document")
+        self.no_rotate_image_document.setCheckable(True)
+
+        self.check_rotate = QActionGroup(MainWindow)
+        self.check_rotate.setObjectName(u"check_rotate")
+        self.check_rotate.addAction(self.rotate_image_document)
+        self.check_rotate.addAction(self.no_rotate_image_document)
+
         MainWindow.setCentralWidget(self.centralwidget)
         self.menubar = QMenuBar(MainWindow)
         self.menubar.setObjectName(u"menubar")
@@ -295,13 +306,18 @@ class Ui_MainWindow(object):
         self.menuFile.addAction(self.exit)
         self.menu.addAction(self.setting_cam)
         self.menu.addAction(self.menu_3.menuAction())
+        self.menu.addSeparator()
+        self.menu.addAction(self.rotate_image_document)
+        self.menu.addAction(self.no_rotate_image_document)
         self.menu_3.addSeparator()
         self.menu_3.addSeparator()
         self.menu_3.addAction(self.btn_show_personal_window)
         self.menu_3.addAction(self.btn_show_place_window)
         self.menu_3.addSeparator()
+
         self.menu_3.addAction(self.update_list)
         self.menu_2.addAction(self.action_open_history)
+        # self.menu_3.addActions(self.check_rotate)
 
         self.retranslateUi(MainWindow)
 
@@ -309,68 +325,43 @@ class Ui_MainWindow(object):
     # setupUi
 
     def retranslateUi(self, MainWindow):
-        MainWindow.setWindowTitle(QCoreApplication.translate(
-            "MainWindow", u"\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u043f\u0443\u0441\u043a", None))
-        self.actionExit.setText(
-            QCoreApplication.translate("MainWindow", u"Exit", None))
-        self.actionSave.setText(
-            QCoreApplication.translate("MainWindow", u"Save", None))
-        self.actionLoad.setText(
-            QCoreApplication.translate("MainWindow", u"Load", None))
-        self.actionExit_2.setText(
-            QCoreApplication.translate("MainWindow", u"Exit", None))
-        self.setting_cam.setText(QCoreApplication.translate(
-            "MainWindow", u"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u0430\u043c\u0435\u0440\u044b", None))
-        self.btn_show_personal_window.setText(QCoreApplication.translate(
-            "MainWindow", u"\u0421\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0438", None))
-        self.btn_show_place_window.setText(QCoreApplication.translate(
-            "MainWindow", u"\u041c\u0435\u0441\u0442\u043e \u0432\u044b\u0434\u0430\u0447\u0438", None))
-        self.update_list.setText(QCoreApplication.translate(
-            "MainWindow", u"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0438", None))
-        self.btn_show_about.setText(QCoreApplication.translate(
-            "MainWindow", u"\u041e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435", None))
-        self.exit.setText(QCoreApplication.translate(
-            "MainWindow", u"Exit", None))
-        self.action_open_history.setText(QCoreApplication.translate(
-            "MainWindow", u"\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043e\u0432", None))
-        self.groupBox.setTitle(QCoreApplication.translate(
-            "MainWindow", u"\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f:", None))
-        self.label.setText(QCoreApplication.translate(
-            "MainWindow", u"\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u043f\u0443\u0441\u043a \u2116:", None))
-
-        self.label_2.setText(QCoreApplication.translate(
-            "MainWindow", u"\u0414\u0430\u0442\u0430 \u0438 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0434\u0430\u0447\u0438:", None))
-        self.label_4.setText(QCoreApplication.translate(
-            "MainWindow", u"\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u0435\u043d\u0435 \u0434\u043e:", None))
-        self.label_3.setText(QCoreApplication.translate(
-            "MainWindow", u"\u0412\u044b\u0434\u0430\u043b:", None))
-        self.label_5.setText(QCoreApplication.translate(
-            "MainWindow", u"\u041c\u0435\u0441\u0442\u043e \u0432\u044b\u0434\u0430\u0447\u0438:", None))
-        self.label_6.setText(QCoreApplication.translate(
-            "MainWindow", u"\u041f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439:", None))
-        self.label_7.setText(QCoreApplication.translate(
-            "MainWindow", u"\u0426\u0435\u043b\u044c \u0432\u0438\u0437\u0438\u0442\u0430:", None))
-
-        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), QCoreApplication.translate(
-            "MainWindow", u"\u041A\u0430\u043C\u0435\u0440\u0430 \u0434\u043B\u044F \u043B\u0438\u0446\u0430", None))
-        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), QCoreApplication.translate(
-            "MainWindow", u"\u041A\u0430\u043C\u0435\u0440\u0430 \u0434\u043B\u044F \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430", None))
-        self.btn_start_cam.setText(QCoreApplication.translate(
-            "MainWindow", u"\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u0443", None))
-        self.capturePhoto.setText(QCoreApplication.translate(
-            "MainWindow", u"\u0421\u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0440\u043e\u0432\u0430\u0442\u044c", None))
-        self.btn_clear.setText(QCoreApplication.translate(
-            "MainWindow", u"\u041e\u0442\u0447\u0438\u0441\u0442\u0438\u0442\u044c", None))
-        self.btn_save.setText(QCoreApplication.translate(
-            "MainWindow", u"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c", None))
-        self.btn_print.setText(QCoreApplication.translate(
-            "MainWindow", u"\u041f\u0435\u0447\u0430\u0442\u044c", None))
-        self.menuFile.setTitle(
-            QCoreApplication.translate("MainWindow", u"File", None))
-        self.menu.setTitle(QCoreApplication.translate(
-            "MainWindow", u"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438", None))
-        self.menu_3.setTitle(QCoreApplication.translate(
-            "MainWindow", u"\u0421\u043f\u0438\u0441\u043a\u0438", None))
-        self.menu_2.setTitle(QCoreApplication.translate(
-            "MainWindow", u"\u0418\u0441\u0442\u043e\u0440\u0438\u044f", None))
+
+        MainWindow.setWindowTitle(translate('Temporary pass'))
+        self.actionExit.setText(translate('Exit'))
+        self.actionSave.setText(translate('Save'))
+        self.actionLoad.setText(translate('Load'))
+        self.actionExit_2.setText(translate('Exit'))
+        self.setting_cam.setText(translate('Camera settings'))
+        self.rotate_image_document.setText(translate('Flip document'))
+        self.no_rotate_image_document.setText(
+            translate('Do not flip the document'))
+        self.btn_show_personal_window.setText(translate('Employees'))
+        self.btn_show_place_window.setText(translate('Place of issue'))
+        self.update_list.setText(translate('Update lists'))
+        self.btn_show_about.setText(translate('About'))
+        self.exit.setText(translate('Exit'))
+        self.action_open_history.setText(translate('Pass history'))
+        self.groupBox.setTitle(F"{translate('Information')}:")
+        self.label.setText(F"{translate('Temporary pass')} №:")
+
+        self.label_2.setText(F"{translate('Date and time of issue')}:")
+        self.label_4.setText(F"{translate('Valid until')}:")
+        self.label_3.setText(F"{translate('Who issued')}:")
+        self.label_5.setText(F"{translate('Place of issue')}:")
+        self.label_6.setText(F"{translate('Receiving')}:")
+        self.label_7.setText(F"{translate('Purpose of the visit')}")
+
+        self.tabWidget.setTabText(self.tabWidget.indexOf(
+            self.tab), translate('Face camera'))
+        self.tabWidget.setTabText(self.tabWidget.indexOf(
+            self.tab_2), translate('Document camera'))
+        self.btn_start_cam.setText(translate('Launch сamera'))
+        self.capturePhoto.setText(translate('Take photo'))
+        self.btn_clear.setText(translate('Clear'))
+        self.btn_save.setText(translate('Save'))
+        self.btn_print.setText(translate('Print'))
+        self.menuFile.setTitle(translate('File'))
+        self.menu.setTitle(translate('Settings'))
+        self.menu_3.setTitle(translate('Lists'))
+        self.menu_2.setTitle(translate('History'))
     # retranslateUi