commit
7438f7ae15
62 changed files with 20565 additions and 0 deletions
-
0README.md
-
BINbook-g19ab6d77a_640.png
-
BINpdfbooklet.xcf
-
BINpdfbooklet_3.1.2-3_all.deb
-
10pdfbooklet_3.1.2-3_all/DEBIAN/control
-
56pdfbooklet_3.1.2-3_all/md5sums
-
1pdfbooklet_3.1.2-3_all/postinst
-
33pdfbooklet_3.1.2-3_all/usr/bin/pdfbooklet
-
10pdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet-3.1.2-py3.5.egg-info
-
5pdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/__init__.py
-
BINpdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/__pycache__/__init__.cpython-35.pyc
-
BINpdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/__pycache__/_version.cpython-35.pyc
-
BINpdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/__pycache__/filters.cpython-35.pyc
-
BINpdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/__pycache__/generic.cpython-35.pyc
-
BINpdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/__pycache__/merger.cpython-35.pyc
-
BINpdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/__pycache__/pagerange.cpython-35.pyc
-
BINpdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/__pycache__/pdf.cpython-35.pyc
-
BINpdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/__pycache__/utils.cpython-35.pyc
-
BINpdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/__pycache__/xmp.cpython-35.pyc
-
1pdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/_version.py
-
362pdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/filters.py
-
1222pdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/generic.py
-
553pdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/merger.py
-
152pdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/pagerange.py
-
3099pdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/pdf.py
-
295pdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/utils.py
-
358pdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/xmp.py
-
0pdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/__init__.py
-
BINpdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/__pycache__/__init__.cpython-35.pyc
-
BINpdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/__pycache__/elib_intl3.cpython-35.pyc
-
BINpdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/__pycache__/files_chooser.cpython-35.pyc
-
BINpdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/__pycache__/pdfbooklet.cpython-35.pyc
-
BINpdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/__pycache__/pdfshuffler_g3.cpython-35.pyc
-
BINpdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/__pycache__/pdfshuffler_iconview3.cpython-35.pyc
-
527pdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/elib_intl3.py
-
183pdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/files_chooser.py
-
5076pdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/pdfbooklet.py
-
1315pdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/pdfshuffler_g3.py
-
163pdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/pdfshuffler_iconview3.py
-
10pdfbooklet_3.1.2-3_all/usr/share/applications/pdfbooklet.desktop
-
BINpdfbooklet_3.1.2-3_all/usr/share/doc/pdfbooklet/changelog.Debian.gz
-
8pdfbooklet_3.1.2-3_all/usr/share/doc/pdfbooklet/copyright
-
BINpdfbooklet_3.1.2-3_all/usr/share/locale/fr/LC_MESSAGES/pdfbooklet.mo
-
1286pdfbooklet_3.1.2-3_all/usr/share/locale/fr/LC_MESSAGES/pdfbooklet.po
-
BINpdfbooklet_3.1.2-3_all/usr/share/locale/fr/LC_MESSAGES/pdfshuffler.mo
-
281pdfbooklet_3.1.2-3_all/usr/share/locale/fr/LC_MESSAGES/pdfshuffler.po
-
299pdfbooklet_3.1.2-3_all/usr/share/pdfbooklet/data/chooser_dialog.glade
-
BINpdfbooklet_3.1.2-3_all/usr/share/pdfbooklet/data/nofile.pdf
-
10pdfbooklet_3.1.2-3_all/usr/share/pdfbooklet/data/pdfbooklet.desktop
-
BINpdfbooklet_3.1.2-3_all/usr/share/pdfbooklet/data/pdfbooklet.ico
-
BINpdfbooklet_3.1.2-3_all/usr/share/pdfbooklet/data/pdfbooklet.png
-
333pdfbooklet_3.1.2-3_all/usr/share/pdfbooklet/data/pdfbooklet.svg
-
3519pdfbooklet_3.1.2-3_all/usr/share/pdfbooklet/data/pdfbooklet3.glade
-
BINpdfbooklet_3.1.2-3_all/usr/share/pdfbooklet/data/pdfshuffler.ico
-
BINpdfbooklet_3.1.2-3_all/usr/share/pdfbooklet/data/pdfshuffler64.ico
-
BINpdfbooklet_3.1.2-3_all/usr/share/pdfbooklet/data/pdfshuffler64.png
-
968pdfbooklet_3.1.2-3_all/usr/share/pdfbooklet/data/pdfshuffler_g.glade
-
BINpdfbooklet_3.1.2-3_all/usr/share/pdfbooklet/documentation/Manuel_de_Pdf-Booklet.pdf
-
97pdfbooklet_3.1.2-3_all/usr/share/pdfbooklet/documentation/Note_for_Linux_users_3.0.6.html
-
BINpdfbooklet_3.1.2-3_all/usr/share/pdfbooklet/documentation/Pdf-Booklet_User's_Guide.pdf
-
333pdfbooklet_3.1.2-3_all/usr/share/pdfbooklet/icons/hicolor/scalable/pdfbooklet.svg
-
BINpdfbooklet_3.1.2-3_all/usr/share/pixmaps/pdfbooklet.png
After Width: 640 | Height: 408 | Size: 18 KiB |
@ -0,0 +1,10 @@ |
|||
Package: pdfbooklet |
|||
Version: 3.1.2-3 |
|||
Architecture: all |
|||
Maintainer: Travis CI User <travis@travis-job-15a6ca42-09e1-42ff-b563-bc763a340a91> |
|||
Installed-Size: 5214 |
|||
Depends: python3 (>= 3.4), python3-gi, python3-gi-cairo, python3-cairo, gir1.2-gtk-3.0, gir1.2-poppler-0.18 |
|||
Section: alien |
|||
Priority: extra |
|||
Description: Make booklets from pdfs. |
|||
Converted by ken (https://git.kjodle.net) |
@ -0,0 +1,56 @@ |
|||
ba56c5487eb08c12bb4a9b3e6a473ad5 postinst |
|||
52eff264dbe1c88e4cdae0e226a01f18 usr/bin/pdfbooklet |
|||
906b5b82769c2aa6670ad40ecde27913 usr/lib/python3/dist-packages/pdfbooklet-3.1.2-py3.5.egg-info |
|||
7c08f7a7b39e2ff0b9ec7ad59ab1b722 usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/__init__.py |
|||
bee924498685db3fa219dfc099933039 usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/__pycache__/__init__.cpython-35.pyc |
|||
daec93ab0b71a886408c2271f569d69b usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/__pycache__/_version.cpython-35.pyc |
|||
399edd643a7ebe5705761d266f89a39e usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/__pycache__/filters.cpython-35.pyc |
|||
c341762928903c2ea146bab0a98222bc usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/__pycache__/generic.cpython-35.pyc |
|||
7bcd7e5070ea7cfb0b1a1fcbd2ba4a0c usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/__pycache__/merger.cpython-35.pyc |
|||
2ff2f3bbfe9960d891ee5297d99bc18f usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/__pycache__/pagerange.cpython-35.pyc |
|||
10eeae6883876bf6d1e494fb48480d78 usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/__pycache__/pdf.cpython-35.pyc |
|||
60f85ad15bc9787fe4d9cd20dd9fcaab usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/__pycache__/utils.cpython-35.pyc |
|||
362b7ed03b0f0f02bb241cc3a5cab13e usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/__pycache__/xmp.cpython-35.pyc |
|||
7d0617c19300e959eced5ea961d7b603 usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/_version.py |
|||
3d42cf9a67139de17946475432e93a34 usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/filters.py |
|||
503d65931c283b5d3ccd52f88a365476 usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/generic.py |
|||
38408394fbf7442d4ece6d17ff6433cf usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/merger.py |
|||
a74524899783ee4b56529d0287c3d5f6 usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/pagerange.py |
|||
e6998315652813e37c44627569cd15b2 usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/pdf.py |
|||
383614f6ba70f7d5cf9ed5496c201907 usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/utils.py |
|||
e6379c525ae88b173e7b3a757e2c3063 usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/xmp.py |
|||
d41d8cd98f00b204e9800998ecf8427e usr/lib/python3/dist-packages/pdfbooklet/__init__.py |
|||
3b3d4b3ad68d0b42baa9405ffab42e37 usr/lib/python3/dist-packages/pdfbooklet/__pycache__/__init__.cpython-35.pyc |
|||
a427643aa93316c1407cbfd1327d146e usr/lib/python3/dist-packages/pdfbooklet/__pycache__/elib_intl3.cpython-35.pyc |
|||
b2a93dc73d6f8e522c9ef5aa410846ed usr/lib/python3/dist-packages/pdfbooklet/__pycache__/files_chooser.cpython-35.pyc |
|||
856537a63a5a9fd96af18dece31c782e usr/lib/python3/dist-packages/pdfbooklet/__pycache__/pdfbooklet.cpython-35.pyc |
|||
7bdc8cd69d4848eb87801f4cd1c6d53d usr/lib/python3/dist-packages/pdfbooklet/__pycache__/pdfshuffler_g3.cpython-35.pyc |
|||
f65a8a722149a8f678c3ef49a48444b3 usr/lib/python3/dist-packages/pdfbooklet/__pycache__/pdfshuffler_iconview3.cpython-35.pyc |
|||
16d5f3a8ea1c233c81ef7b30127bc310 usr/lib/python3/dist-packages/pdfbooklet/elib_intl3.py |
|||
7262bce50b0bd5db96c298743f519b6f usr/lib/python3/dist-packages/pdfbooklet/files_chooser.py |
|||
4560e948c3a9c0ba561156c89222afe9 usr/lib/python3/dist-packages/pdfbooklet/pdfbooklet.py |
|||
85ff4690d95bcf0bc5dc88dc4518edee usr/lib/python3/dist-packages/pdfbooklet/pdfshuffler_g3.py |
|||
b18a190a171e1ae57118620f27773a26 usr/lib/python3/dist-packages/pdfbooklet/pdfshuffler_iconview3.py |
|||
f2a9808fe8ae4e932d6c471cf6326cb6 usr/share/applications/pdfbooklet.desktop |
|||
1e65a1a059a7ba375e144e57bafe0e03 usr/share/doc/pdfbooklet/changelog.Debian.gz |
|||
8c836ce2f8e3261dbabc7592a7cc9b6f usr/share/doc/pdfbooklet/copyright |
|||
5495e0fdf28e395bf3229069a7c5e1af usr/share/locale/fr/LC_MESSAGES/pdfbooklet.mo |
|||
b67b9bb1ea5b769203c3e73d9ecc4771 usr/share/locale/fr/LC_MESSAGES/pdfbooklet.po |
|||
97fc5e114afab69b2dda1d9ed27732d5 usr/share/locale/fr/LC_MESSAGES/pdfshuffler.mo |
|||
0bcfbf4a7a4e98c1dbd520fcc04ad342 usr/share/locale/fr/LC_MESSAGES/pdfshuffler.po |
|||
c3bc3ac07fa1d1c6f6c95e3e9d039908 usr/share/pdfbooklet/data/chooser_dialog.glade |
|||
84ff01d09458dc41a43edbc175896dd5 usr/share/pdfbooklet/data/nofile.pdf |
|||
f2a9808fe8ae4e932d6c471cf6326cb6 usr/share/pdfbooklet/data/pdfbooklet.desktop |
|||
7ba7a6336c65f32291fa2f4f1780dd44 usr/share/pdfbooklet/data/pdfbooklet.ico |
|||
ff8b8bd0473cff3b5f2e67f087674a95 usr/share/pdfbooklet/data/pdfbooklet.png |
|||
36aaf7de5c575a414bad40039dffbd5d usr/share/pdfbooklet/data/pdfbooklet.svg |
|||
7206b41ae6a12a3e60a66255f309d3a0 usr/share/pdfbooklet/data/pdfbooklet3.glade |
|||
22cc082abf6cc863fe0575fc574bac0f usr/share/pdfbooklet/data/pdfshuffler.ico |
|||
c101a33982b86a5e4deb7b49bd6a2252 usr/share/pdfbooklet/data/pdfshuffler64.ico |
|||
e08557a923bdc9dc3cb374ee36110a5d usr/share/pdfbooklet/data/pdfshuffler64.png |
|||
1d1da34644d20ead9325f6bbf6f2d9dd usr/share/pdfbooklet/data/pdfshuffler_g.glade |
|||
3242edc53175c4d9930b8f96529514c1 usr/share/pdfbooklet/documentation/Manuel_de_Pdf-Booklet.pdf |
|||
7c1c11d075a5ac583700a173ca40f589 usr/share/pdfbooklet/documentation/Note_for_Linux_users_3.0.6.html |
|||
09a1b8a9c361be1c84b5863d63344e3b usr/share/pdfbooklet/documentation/Pdf-Booklet_User's_Guide.pdf |
|||
36aaf7de5c575a414bad40039dffbd5d usr/share/pdfbooklet/icons/hicolor/scalable/pdfbooklet.svg |
|||
ff8b8bd0473cff3b5f2e67f087674a95 usr/share/pixmaps/pdfbooklet.png |
@ -0,0 +1 @@ |
|||
chmod 777 ./usr/share/pdfbooklet/ |
@ -0,0 +1,33 @@ |
|||
#!/usr/bin/python3 |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
""" |
|||
|
|||
PdfBooklet 2.2.2 - GTK+ based utility for creating booklets |
|||
and other layouts from PDF documents. |
|||
<https://sourceforge.net/projects/pdfbooklet> |
|||
|
|||
This file is part of PdfBooklet. |
|||
|
|||
PdfBooklet 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, write to the Free Software Foundation, Inc., |
|||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
|||
|
|||
""" |
|||
|
|||
try: |
|||
from pdfbooklet.pdfbooklet import main |
|||
main() |
|||
except ImportError as e: |
|||
print('Error: Could not import pdfbooklet') |
|||
print('Cause: %s' % e) |
@ -0,0 +1,10 @@ |
|||
Metadata-Version: 1.0 |
|||
Name: pdfbooklet |
|||
Version: 3.1.2 |
|||
Summary: A simple application for creating booklets and other layouts from PDF files |
|||
Home-page: https://sourceforge.net/projects/pdfbooklet |
|||
Author: GAF Software |
|||
Author-email: Averell7 at sourceforge dot net |
|||
License: GNU GPL-3 |
|||
Description: UNKNOWN |
|||
Platform: UNKNOWN |
@ -0,0 +1,5 @@ |
|||
from .pdf import PdfFileReader, PdfFileWriter |
|||
from .merger import PdfFileMerger |
|||
from .pagerange import PageRange, parse_filename_page_ranges |
|||
from ._version import __version__ |
|||
__all__ = ["pdf", "PdfFileMerger"] |
@ -0,0 +1 @@ |
|||
__version__ = '1.25.1' |
@ -0,0 +1,362 @@ |
|||
# vim: sw=4:expandtab:foldmethod=marker |
|||
# |
|||
# Copyright (c) 2006, Mathieu Fenniak |
|||
# All rights reserved. |
|||
# |
|||
# Redistribution and use in source and binary forms, with or without |
|||
# modification, are permitted provided that the following conditions are |
|||
# met: |
|||
# |
|||
# * Redistributions of source code must retain the above copyright notice, |
|||
# this list of conditions and the following disclaimer. |
|||
# * Redistributions in binary form must reproduce the above copyright notice, |
|||
# this list of conditions and the following disclaimer in the documentation |
|||
# and/or other materials provided with the distribution. |
|||
# * The name of the author may not be used to endorse or promote products |
|||
# derived from this software without specific prior written permission. |
|||
# |
|||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
|||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
|||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
|||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
|||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
|||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
|||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
|||
# POSSIBILITY OF SUCH DAMAGE. |
|||
|
|||
|
|||
""" |
|||
Implementation of stream filters for PDF. |
|||
""" |
|||
__author__ = "Mathieu Fenniak" |
|||
__author_email__ = "biziqe@mathieu.fenniak.net" |
|||
|
|||
from .utils import PdfReadError, ord_, chr_ |
|||
from sys import version_info |
|||
if version_info < ( 3, 0 ): |
|||
from cStringIO import StringIO |
|||
else: |
|||
from io import StringIO |
|||
import struct |
|||
|
|||
try: |
|||
import zlib |
|||
|
|||
def decompress(data): |
|||
return zlib.decompress(data) |
|||
|
|||
def compress(data): |
|||
return zlib.compress(data) |
|||
|
|||
except ImportError: |
|||
# Unable to import zlib. Attempt to use the System.IO.Compression |
|||
# library from the .NET framework. (IronPython only) |
|||
import System |
|||
from System import IO, Collections, Array |
|||
|
|||
def _string_to_bytearr(buf): |
|||
retval = Array.CreateInstance(System.Byte, len(buf)) |
|||
for i in range(len(buf)): |
|||
retval[i] = ord(buf[i]) |
|||
return retval |
|||
|
|||
def _bytearr_to_string(bytes): |
|||
retval = "" |
|||
for i in range(bytes.Length): |
|||
retval += chr(bytes[i]) |
|||
return retval |
|||
|
|||
def _read_bytes(stream): |
|||
ms = IO.MemoryStream() |
|||
buf = Array.CreateInstance(System.Byte, 2048) |
|||
while True: |
|||
bytes = stream.Read(buf, 0, buf.Length) |
|||
if bytes == 0: |
|||
break |
|||
else: |
|||
ms.Write(buf, 0, bytes) |
|||
retval = ms.ToArray() |
|||
ms.Close() |
|||
return retval |
|||
|
|||
def decompress(data): |
|||
bytes = _string_to_bytearr(data) |
|||
ms = IO.MemoryStream() |
|||
ms.Write(bytes, 0, bytes.Length) |
|||
ms.Position = 0 # fseek 0 |
|||
gz = IO.Compression.DeflateStream(ms, IO.Compression.CompressionMode.Decompress) |
|||
bytes = _read_bytes(gz) |
|||
retval = _bytearr_to_string(bytes) |
|||
gz.Close() |
|||
return retval |
|||
|
|||
def compress(data): |
|||
bytes = _string_to_bytearr(data) |
|||
ms = IO.MemoryStream() |
|||
gz = IO.Compression.DeflateStream(ms, IO.Compression.CompressionMode.Compress, True) |
|||
gz.Write(bytes, 0, bytes.Length) |
|||
gz.Close() |
|||
ms.Position = 0 # fseek 0 |
|||
bytes = ms.ToArray() |
|||
retval = _bytearr_to_string(bytes) |
|||
ms.Close() |
|||
return retval |
|||
|
|||
|
|||
class FlateDecode(object): |
|||
def decode(data, decodeParms): |
|||
data = decompress(data) |
|||
predictor = 1 |
|||
if decodeParms: |
|||
try: |
|||
predictor = decodeParms.get("/Predictor", 1) |
|||
except AttributeError: |
|||
pass # usually an array with a null object was read |
|||
|
|||
# predictor 1 == no predictor |
|||
if predictor != 1: |
|||
columns = decodeParms["/Columns"] |
|||
# PNG prediction: |
|||
if predictor >= 10 and predictor <= 15: |
|||
output = StringIO() |
|||
# PNG prediction can vary from row to row |
|||
rowlength = columns + 1 |
|||
assert len(data) % rowlength == 0 |
|||
prev_rowdata = (0,) * rowlength |
|||
for row in range(len(data) // rowlength): |
|||
rowdata = [ord_(x) for x in data[(row*rowlength):((row+1)*rowlength)]] |
|||
filterByte = rowdata[0] |
|||
if filterByte == 0: |
|||
pass |
|||
elif filterByte == 1: |
|||
for i in range(2, rowlength): |
|||
rowdata[i] = (rowdata[i] + rowdata[i-1]) % 256 |
|||
elif filterByte == 2: |
|||
for i in range(1, rowlength): |
|||
rowdata[i] = (rowdata[i] + prev_rowdata[i]) % 256 |
|||
else: |
|||
# unsupported PNG filter |
|||
raise PdfReadError("Unsupported PNG filter %r" % filterByte) |
|||
prev_rowdata = rowdata |
|||
output.write(''.join([chr(x) for x in rowdata[1:]])) |
|||
data = output.getvalue() |
|||
else: |
|||
# unsupported predictor |
|||
raise PdfReadError("Unsupported flatedecode predictor %r" % predictor) |
|||
return data |
|||
decode = staticmethod(decode) |
|||
|
|||
def encode(data): |
|||
return compress(data) |
|||
encode = staticmethod(encode) |
|||
|
|||
|
|||
class ASCIIHexDecode(object): |
|||
def decode(data, decodeParms=None): |
|||
retval = "" |
|||
char = "" |
|||
x = 0 |
|||
while True: |
|||
c = data[x] |
|||
if c == ">": |
|||
break |
|||
elif c.isspace(): |
|||
x += 1 |
|||
continue |
|||
char += c |
|||
if len(char) == 2: |
|||
retval += chr(int(char, base=16)) |
|||
char = "" |
|||
x += 1 |
|||
assert char == "" |
|||
return retval |
|||
decode = staticmethod(decode) |
|||
|
|||
|
|||
class LZWDecode(object): |
|||
"""Taken from: |
|||
http://www.java2s.com/Open-Source/Java-Document/PDF/PDF-Renderer/com/sun/pdfview/decode/LZWDecode.java.htm |
|||
""" |
|||
class decoder(object): |
|||
def __init__(self, data): |
|||
self.STOP=257 |
|||
self.CLEARDICT=256 |
|||
self.data=data |
|||
self.bytepos=0 |
|||
self.bitpos=0 |
|||
self.dict=[""]*4096 |
|||
for i in range(256): |
|||
self.dict[i]=chr(i) |
|||
self.resetDict() |
|||
|
|||
def resetDict(self): |
|||
self.dictlen=258 |
|||
self.bitspercode=9 |
|||
|
|||
def nextCode(self): |
|||
fillbits=self.bitspercode |
|||
value=0 |
|||
while fillbits>0 : |
|||
if self.bytepos >= len(self.data): |
|||
return -1 |
|||
nextbits=ord(self.data[self.bytepos]) |
|||
bitsfromhere=8-self.bitpos |
|||
if bitsfromhere>fillbits: |
|||
bitsfromhere=fillbits |
|||
value |= (((nextbits >> (8-self.bitpos-bitsfromhere)) & |
|||
(0xff >> (8-bitsfromhere))) << |
|||
(fillbits-bitsfromhere)) |
|||
fillbits -= bitsfromhere |
|||
self.bitpos += bitsfromhere |
|||
if self.bitpos >=8: |
|||
self.bitpos=0 |
|||
self.bytepos = self.bytepos+1 |
|||
return value |
|||
|
|||
def decode(self): |
|||
""" algorithm derived from: |
|||
http://www.rasip.fer.hr/research/compress/algorithms/fund/lz/lzw.html |
|||
and the PDFReference |
|||
""" |
|||
cW = self.CLEARDICT; |
|||
baos="" |
|||
while True: |
|||
pW = cW; |
|||
cW = self.nextCode(); |
|||
if cW == -1: |
|||
raise PdfReadError("Missed the stop code in LZWDecode!") |
|||
if cW == self.STOP: |
|||
break; |
|||
elif cW == self.CLEARDICT: |
|||
self.resetDict(); |
|||
elif pW == self.CLEARDICT: |
|||
baos+=self.dict[cW] |
|||
else: |
|||
if cW < self.dictlen: |
|||
baos += self.dict[cW] |
|||
p=self.dict[pW]+self.dict[cW][0] |
|||
self.dict[self.dictlen]=p |
|||
self.dictlen+=1 |
|||
else: |
|||
p=self.dict[pW]+self.dict[pW][0] |
|||
baos+=p |
|||
self.dict[self.dictlen] = p; |
|||
self.dictlen+=1 |
|||
if (self.dictlen >= (1 << self.bitspercode) - 1 and |
|||
self.bitspercode < 12): |
|||
self.bitspercode+=1 |
|||
return baos |
|||
|
|||
@staticmethod |
|||
def decode(data,decodeParams=None): |
|||
return LZWDecode.decoder(data).decode() |
|||
|
|||
|
|||
class ASCII85Decode(object): |
|||
def decode(data, decodeParms=None): |
|||
if version_info < ( 3, 0 ): |
|||
retval = "" |
|||
group = [] |
|||
x = 0 |
|||
hitEod = False |
|||
# remove all whitespace from data |
|||
data = [y for y in data if not (y in ' \n\r\t')] |
|||
while not hitEod: |
|||
c = data[x] |
|||
if len(retval) == 0 and c == "<" and data[x+1] == "~": |
|||
x += 2 |
|||
continue |
|||
#elif c.isspace(): |
|||
# x += 1 |
|||
# continue |
|||
elif c == 'z': |
|||
assert len(group) == 0 |
|||
retval += '\x00\x00\x00\x00' |
|||
x += 1 |
|||
continue |
|||
elif c == "~" and data[x+1] == ">": |
|||
if len(group) != 0: |
|||
# cannot have a final group of just 1 char |
|||
assert len(group) > 1 |
|||
cnt = len(group) - 1 |
|||
group += [ 85, 85, 85 ] |
|||
hitEod = cnt |
|||
else: |
|||
break |
|||
else: |
|||
c = ord(c) - 33 |
|||
assert c >= 0 and c < 85 |
|||
group += [ c ] |
|||
if len(group) >= 5: |
|||
b = group[0] * (85**4) + \ |
|||
group[1] * (85**3) + \ |
|||
group[2] * (85**2) + \ |
|||
group[3] * 85 + \ |
|||
group[4] |
|||
assert b < (2**32 - 1) |
|||
c4 = chr((b >> 0) % 256) |
|||
c3 = chr((b >> 8) % 256) |
|||
c2 = chr((b >> 16) % 256) |
|||
c1 = chr(b >> 24) |
|||
retval += (c1 + c2 + c3 + c4) |
|||
if hitEod: |
|||
retval = retval[:-4+hitEod] |
|||
group = [] |
|||
x += 1 |
|||
return retval |
|||
else: |
|||
if isinstance(data, str): |
|||
data = data.encode('ascii') |
|||
n = b = 0 |
|||
out = bytearray() |
|||
for c in data: |
|||
if ord('!') <= c and c <= ord('u'): |
|||
n += 1 |
|||
b = b*85+(c-33) |
|||
if n == 5: |
|||
out += struct.pack(b'>L',b) |
|||
n = b = 0 |
|||
elif c == ord('z'): |
|||
assert n == 0 |
|||
out += b'\0\0\0\0' |
|||
elif c == ord('~'): |
|||
if n: |
|||
for _ in range(5-n): |
|||
b = b*85+84 |
|||
out += struct.pack(b'>L',b)[:n-1] |
|||
break |
|||
return bytes(out) |
|||
decode = staticmethod(decode) |
|||
|
|||
|
|||
def decodeStreamData(stream): |
|||
from .generic import NameObject |
|||
filters = stream.get("/Filter", ()) |
|||
if len(filters) and not isinstance(filters[0], NameObject): |
|||
# we have a single filter instance |
|||
filters = (filters,) |
|||
data = stream._data |
|||
# If there is not data to decode we should not try to decode the data. |
|||
if data: |
|||
for filterType in filters: |
|||
if filterType == "/FlateDecode" or filterType == "/Fl": |
|||
data = FlateDecode.decode(data, stream.get("/DecodeParms")) |
|||
elif filterType == "/ASCIIHexDecode" or filterType == "/AHx": |
|||
data = ASCIIHexDecode.decode(data) |
|||
elif filterType == "/LZWDecode" or filterType == "/LZW": |
|||
data = LZWDecode.decode(data, stream.get("/DecodeParms")) |
|||
elif filterType == "/ASCII85Decode" or filterType == "/A85": |
|||
data = ASCII85Decode.decode(data) |
|||
elif filterType == "/Crypt": |
|||
decodeParams = stream.get("/DecodeParams", {}) |
|||
if "/Name" not in decodeParams and "/Type" not in decodeParams: |
|||
pass |
|||
else: |
|||
raise NotImplementedError("/Crypt filter with /Name or /Type not supported yet") |
|||
else: |
|||
# unsupported filter |
|||
raise NotImplementedError("unsupported filter %s" % filterType) |
|||
return data |
1222
pdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/generic.py
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,553 @@ |
|||
# vim: sw=4:expandtab:foldmethod=marker |
|||
# |
|||
# Copyright (c) 2006, Mathieu Fenniak |
|||
# All rights reserved. |
|||
# |
|||
# Redistribution and use in source and binary forms, with or without |
|||
# modification, are permitted provided that the following conditions are |
|||
# met: |
|||
# |
|||
# * Redistributions of source code must retain the above copyright notice, |
|||
# this list of conditions and the following disclaimer. |
|||
# * Redistributions in binary form must reproduce the above copyright notice, |
|||
# this list of conditions and the following disclaimer in the documentation |
|||
# and/or other materials provided with the distribution. |
|||
# * The name of the author may not be used to endorse or promote products |
|||
# derived from this software without specific prior written permission. |
|||
# |
|||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
|||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
|||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
|||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
|||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
|||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
|||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
|||
# POSSIBILITY OF SUCH DAMAGE. |
|||
|
|||
from .generic import * |
|||
from .utils import isString, str_ |
|||
from .pdf import PdfFileReader, PdfFileWriter |
|||
from .pagerange import PageRange |
|||
from sys import version_info |
|||
if version_info < ( 3, 0 ): |
|||
from cStringIO import StringIO |
|||
StreamIO = StringIO |
|||
else: |
|||
from io import BytesIO |
|||
from io import FileIO as file |
|||
StreamIO = BytesIO |
|||
|
|||
|
|||
class _MergedPage(object): |
|||
""" |
|||
_MergedPage is used internally by PdfFileMerger to collect necessary |
|||
information on each page that is being merged. |
|||
""" |
|||
def __init__(self, pagedata, src, id): |
|||
self.src = src |
|||
self.pagedata = pagedata |
|||
self.out_pagedata = None |
|||
self.id = id |
|||
|
|||
|
|||
class PdfFileMerger(object): |
|||
""" |
|||
Initializes a PdfFileMerger object. PdfFileMerger merges multiple PDFs |
|||
into a single PDF. It can concatenate, slice, insert, or any combination |
|||
of the above. |
|||
|
|||
See the functions :meth:`merge()<merge>` (or :meth:`append()<append>`) |
|||
and :meth:`write()<write>` for usage information. |
|||
|
|||
:param bool strict: Determines whether user should be warned of all |
|||
problems and also causes some correctable problems to be fatal. |
|||
Defaults to ``True``. |
|||
""" |
|||
|
|||
def __init__(self, strict=True): |
|||
self.inputs = [] |
|||
self.pages = [] |
|||
self.output = PdfFileWriter() |
|||
self.bookmarks = [] |
|||
self.named_dests = [] |
|||
self.id_count = 0 |
|||
self.strict = strict |
|||
|
|||
def merge(self, position, fileobj, bookmark=None, pages=None, import_bookmarks=True): |
|||
""" |
|||
Merges the pages from the given file into the output file at the |
|||
specified page number. |
|||
|
|||
:param int position: The *page number* to insert this file. File will |
|||
be inserted after the given number. |
|||
|
|||
:param fileobj: A File Object or an object that supports the standard read |
|||
and seek methods similar to a File Object. Could also be a |
|||
string representing a path to a PDF file. |
|||
|
|||
:param str bookmark: Optionally, you may specify a bookmark to be applied at |
|||
the beginning of the included file by supplying the text of the bookmark. |
|||
|
|||
:param pages: can be a :ref:`Page Range <page-range>` or a ``(start, stop[, step])`` tuple |
|||
to merge only the specified range of pages from the source |
|||
document into the output document. |
|||
|
|||
:param bool import_bookmarks: You may prevent the source document's bookmarks |
|||
from being imported by specifying this as ``False``. |
|||
""" |
|||
|
|||
# This parameter is passed to self.inputs.append and means |
|||
# that the stream used was created in this method. |
|||
my_file = False |
|||
|
|||
# If the fileobj parameter is a string, assume it is a path |
|||
# and create a file object at that location. If it is a file, |
|||
# copy the file's contents into a BytesIO (or StreamIO) stream object; if |
|||
# it is a PdfFileReader, copy that reader's stream into a |
|||
# BytesIO (or StreamIO) stream. |
|||
# If fileobj is none of the above types, it is not modified |
|||
decryption_key = None |
|||
if isString(fileobj): |
|||
fileobj = file(fileobj, 'rb') |
|||
my_file = True |
|||
elif isinstance(fileobj, file): |
|||
fileobj.seek(0) |
|||
filecontent = fileobj.read() |
|||
fileobj = StreamIO(filecontent) |
|||
my_file = True |
|||
elif isinstance(fileobj, PdfFileReader): |
|||
orig_tell = fileobj.stream.tell() |
|||
fileobj.stream.seek(0) |
|||
filecontent = StreamIO(fileobj.stream.read()) |
|||
fileobj.stream.seek(orig_tell) # reset the stream to its original location |
|||
fileobj = filecontent |
|||
if hasattr(fileobj, '_decryption_key'): |
|||
decryption_key = fileobj._decryption_key |
|||
my_file = True |
|||
|
|||
# Create a new PdfFileReader instance using the stream |
|||
# (either file or BytesIO or StringIO) created above |
|||
pdfr = PdfFileReader(fileobj, strict=self.strict) |
|||
if decryption_key is not None: |
|||
pdfr._decryption_key = decryption_key |
|||
|
|||
# Find the range of pages to merge. |
|||
if pages == None: |
|||
pages = (0, pdfr.getNumPages()) |
|||
elif isinstance(pages, PageRange): |
|||
pages = pages.indices(pdfr.getNumPages()) |
|||
elif not isinstance(pages, tuple): |
|||
raise TypeError('"pages" must be a tuple of (start, stop[, step])') |
|||
|
|||
srcpages = [] |
|||
if bookmark: |
|||
bookmark = Bookmark(TextStringObject(bookmark), NumberObject(self.id_count), NameObject('/Fit')) |
|||
|
|||
outline = [] |
|||
if import_bookmarks: |
|||
outline = pdfr.getOutlines() |
|||
outline = self._trim_outline(pdfr, outline, pages) |
|||
|
|||
if bookmark: |
|||
self.bookmarks += [bookmark, outline] |
|||
else: |
|||
self.bookmarks += outline |
|||
|
|||
dests = pdfr.namedDestinations |
|||
dests = self._trim_dests(pdfr, dests, pages) |
|||
self.named_dests += dests |
|||
|
|||
# Gather all the pages that are going to be merged |
|||
for i in range(*pages): |
|||
pg = pdfr.getPage(i) |
|||
|
|||
id = self.id_count |
|||
self.id_count += 1 |
|||
|
|||
mp = _MergedPage(pg, pdfr, id) |
|||
|
|||
srcpages.append(mp) |
|||
|
|||
self._associate_dests_to_pages(srcpages) |
|||
self._associate_bookmarks_to_pages(srcpages) |
|||
|
|||
# Slice to insert the pages at the specified position |
|||
self.pages[position:position] = srcpages |
|||
|
|||
# Keep track of our input files so we can close them later |
|||
self.inputs.append((fileobj, pdfr, my_file)) |
|||
|
|||
def append(self, fileobj, bookmark=None, pages=None, import_bookmarks=True): |
|||
""" |
|||
Identical to the :meth:`merge()<merge>` method, but assumes you want to concatenate |
|||
all pages onto the end of the file instead of specifying a position. |
|||
|
|||
:param fileobj: A File Object or an object that supports the standard read |
|||
and seek methods similar to a File Object. Could also be a |
|||
string representing a path to a PDF file. |
|||
|
|||
:param str bookmark: Optionally, you may specify a bookmark to be applied at |
|||
the beginning of the included file by supplying the text of the bookmark. |
|||
|
|||
:param pages: can be a :ref:`Page Range <page-range>` or a ``(start, stop[, step])`` tuple |
|||
to merge only the specified range of pages from the source |
|||
document into the output document. |
|||
|
|||
:param bool import_bookmarks: You may prevent the source document's bookmarks |
|||
from being imported by specifying this as ``False``. |
|||
""" |
|||
|
|||
self.merge(len(self.pages), fileobj, bookmark, pages, import_bookmarks) |
|||
|
|||
def write(self, fileobj): |
|||
""" |
|||
Writes all data that has been merged to the given output file. |
|||
|
|||
:param fileobj: Output file. Can be a filename or any kind of |
|||
file-like object. |
|||
""" |
|||
my_file = False |
|||
if isString(fileobj): |
|||
fileobj = file(fileobj, 'wb') |
|||
my_file = True |
|||
|
|||
# Add pages to the PdfFileWriter |
|||
# The commented out line below was replaced with the two lines below it to allow PdfFileMerger to work with PyPdf 1.13 |
|||
for page in self.pages: |
|||
self.output.addPage(page.pagedata) |
|||
page.out_pagedata = self.output.getReference(self.output._pages.getObject()["/Kids"][-1].getObject()) |
|||
#idnum = self.output._objects.index(self.output._pages.getObject()["/Kids"][-1].getObject()) + 1 |
|||
#page.out_pagedata = IndirectObject(idnum, 0, self.output) |
|||
|
|||
# Once all pages are added, create bookmarks to point at those pages |
|||
self._write_dests() |
|||
self._write_bookmarks() |
|||
|
|||
# Write the output to the file |
|||
self.output.write(fileobj) |
|||
|
|||
if my_file: |
|||
fileobj.close() |
|||
|
|||
def close(self): |
|||
""" |
|||
Shuts all file descriptors (input and output) and clears all memory |
|||
usage. |
|||
""" |
|||
self.pages = [] |
|||
for fo, pdfr, mine in self.inputs: |
|||
if mine: |
|||
fo.close() |
|||
|
|||
self.inputs = [] |
|||
self.output = None |
|||
|
|||
def addMetadata(self, infos): |
|||
""" |
|||
Add custom metadata to the output. |
|||
|
|||
:param dict infos: a Python dictionary where each key is a field |
|||
and each value is your new metadata. |
|||
Example: ``{u'/Title': u'My title'}`` |
|||
""" |
|||
self.output.addMetadata(infos) |
|||
|
|||
def setPageLayout(self, layout): |
|||
""" |
|||
Set the page layout |
|||
|
|||
:param str layout: The page layout to be used |
|||
|
|||
Valid layouts are: |
|||
/NoLayout Layout explicitly not specified |
|||
/SinglePage Show one page at a time |
|||
/OneColumn Show one column at a time |
|||
/TwoColumnLeft Show pages in two columns, odd-numbered pages on the left |
|||
/TwoColumnRight Show pages in two columns, odd-numbered pages on the right |
|||
/TwoPageLeft Show two pages at a time, odd-numbered pages on the left |
|||
/TwoPageRight Show two pages at a time, odd-numbered pages on the right |
|||
""" |
|||
self.output.setPageLayout(layout) |
|||
|
|||
def setPageMode(self, mode): |
|||
""" |
|||
Set the page mode. |
|||
|
|||
:param str mode: The page mode to use. |
|||
|
|||
Valid modes are: |
|||
/UseNone Do not show outlines or thumbnails panels |
|||
/UseOutlines Show outlines (aka bookmarks) panel |
|||
/UseThumbs Show page thumbnails panel |
|||
/FullScreen Fullscreen view |
|||
/UseOC Show Optional Content Group (OCG) panel |
|||
/UseAttachments Show attachments panel |
|||
""" |
|||
self.output.setPageMode(mode) |
|||
|
|||
def _trim_dests(self, pdf, dests, pages): |
|||
""" |
|||
Removes any named destinations that are not a part of the specified |
|||
page set. |
|||
""" |
|||
new_dests = [] |
|||
prev_header_added = True |
|||
for k, o in list(dests.items()): |
|||
for j in range(*pages): |
|||
if pdf.getPage(j).getObject() == o['/Page'].getObject(): |
|||
o[NameObject('/Page')] = o['/Page'].getObject() |
|||
assert str_(k) == str_(o['/Title']) |
|||
new_dests.append(o) |
|||
break |
|||
return new_dests |
|||
|
|||
def _trim_outline(self, pdf, outline, pages): |
|||
""" |
|||
Removes any outline/bookmark entries that are not a part of the |
|||
specified page set. |
|||
""" |
|||
new_outline = [] |
|||
prev_header_added = True |
|||
for i, o in enumerate(outline): |
|||
if isinstance(o, list): |
|||
sub = self._trim_outline(pdf, o, pages) |
|||
if sub: |
|||
if not prev_header_added: |
|||
new_outline.append(outline[i-1]) |
|||
new_outline.append(sub) |
|||
else: |
|||
prev_header_added = False |
|||
for j in range(*pages): |
|||
if pdf.getPage(j).getObject() == o['/Page'].getObject(): |
|||
o[NameObject('/Page')] = o['/Page'].getObject() |
|||
new_outline.append(o) |
|||
prev_header_added = True |
|||
break |
|||
return new_outline |
|||
|
|||
def _write_dests(self): |
|||
dests = self.named_dests |
|||
|
|||
for v in dests: |
|||
pageno = None |
|||
pdf = None |
|||
if '/Page' in v: |
|||
for i, p in enumerate(self.pages): |
|||
if p.id == v['/Page']: |
|||
v[NameObject('/Page')] = p.out_pagedata |
|||
pageno = i |
|||
pdf = p.src |
|||
break |
|||
if pageno != None: |
|||
self.output.addNamedDestinationObject(v) |
|||
|
|||
def _write_bookmarks(self, bookmarks=None, parent=None): |
|||
|
|||
if bookmarks == None: |
|||
bookmarks = self.bookmarks |
|||
|
|||
last_added = None |
|||
for b in bookmarks: |
|||
if isinstance(b, list): |
|||
self._write_bookmarks(b, last_added) |
|||
continue |
|||
|
|||
pageno = None |
|||
pdf = None |
|||
if '/Page' in b: |
|||
for i, p in enumerate(self.pages): |
|||
if p.id == b['/Page']: |
|||
#b[NameObject('/Page')] = p.out_pagedata |
|||
args = [NumberObject(p.id), NameObject(b['/Type'])] |
|||
#nothing more to add |
|||
#if b['/Type'] == '/Fit' or b['/Type'] == '/FitB' |
|||
if b['/Type'] == '/FitH' or b['/Type'] == '/FitBH': |
|||
if '/Top' in b and not isinstance(b['/Top'], NullObject): |
|||
args.append(FloatObject(b['/Top'])) |
|||
else: |
|||
args.append(FloatObject(0)) |
|||
del b['/Top'] |
|||
elif b['/Type'] == '/FitV' or b['/Type'] == '/FitBV': |
|||
if '/Left' in b and not isinstance(b['/Left'], NullObject): |
|||
args.append(FloatObject(b['/Left'])) |
|||
else: |
|||
args.append(FloatObject(0)) |
|||
del b['/Left'] |
|||
elif b['/Type'] == '/XYZ': |
|||
if '/Left' in b and not isinstance(b['/Left'], NullObject): |
|||
args.append(FloatObject(b['/Left'])) |
|||
else: |
|||
args.append(FloatObject(0)) |
|||
if '/Top' in b and not isinstance(b['/Top'], NullObject): |
|||
args.append(FloatObject(b['/Top'])) |
|||
else: |
|||
args.append(FloatObject(0)) |
|||
if '/Zoom' in b and not isinstance(b['/Zoom'], NullObject): |
|||
args.append(FloatObject(b['/Zoom'])) |
|||
else: |
|||
args.append(FloatObject(0)) |
|||
del b['/Top'], b['/Zoom'], b['/Left'] |
|||
elif b['/Type'] == '/FitR': |
|||
if '/Left' in b and not isinstance(b['/Left'], NullObject): |
|||
args.append(FloatObject(b['/Left'])) |
|||
else: |
|||
args.append(FloatObject(0)) |
|||
if '/Bottom' in b and not isinstance(b['/Bottom'], NullObject): |
|||
args.append(FloatObject(b['/Bottom'])) |
|||
else: |
|||
args.append(FloatObject(0)) |
|||
if '/Right' in b and not isinstance(b['/Right'], NullObject): |
|||
args.append(FloatObject(b['/Right'])) |
|||
else: |
|||
args.append(FloatObject(0)) |
|||
if '/Top' in b and not isinstance(b['/Top'], NullObject): |
|||
args.append(FloatObject(b['/Top'])) |
|||
else: |
|||
args.append(FloatObject(0)) |
|||
del b['/Left'], b['/Right'], b['/Bottom'], b['/Top'] |
|||
|
|||
b[NameObject('/A')] = DictionaryObject({NameObject('/S'): NameObject('/GoTo'), NameObject('/D'): ArrayObject(args)}) |
|||
|
|||
pageno = i |
|||
pdf = p.src |
|||
break |
|||
if pageno != None: |
|||
del b['/Page'], b['/Type'] |
|||
last_added = self.output.addBookmarkDict(b, parent) |
|||
|
|||
def _associate_dests_to_pages(self, pages): |
|||
for nd in self.named_dests: |
|||
pageno = None |
|||
np = nd['/Page'] |
|||
|
|||
if isinstance(np, NumberObject): |
|||
continue |
|||
|
|||
for p in pages: |
|||
if np.getObject() == p.pagedata.getObject(): |
|||
pageno = p.id |
|||
|
|||
if pageno != None: |
|||
nd[NameObject('/Page')] = NumberObject(pageno) |
|||
else: |
|||
raise ValueError("Unresolved named destination '%s'" % (nd['/Title'],)) |
|||
|
|||
def _associate_bookmarks_to_pages(self, pages, bookmarks=None): |
|||
if bookmarks == None: |
|||
bookmarks = self.bookmarks |
|||
|
|||
for b in bookmarks: |
|||
if isinstance(b, list): |
|||
self._associate_bookmarks_to_pages(pages, b) |
|||
continue |
|||
|
|||
pageno = None |
|||
bp = b['/Page'] |
|||
|
|||
if isinstance(bp, NumberObject): |
|||
continue |
|||
|
|||
for p in pages: |
|||
if bp.getObject() == p.pagedata.getObject(): |
|||
pageno = p.id |
|||
|
|||
if pageno != None: |
|||
b[NameObject('/Page')] = NumberObject(pageno) |
|||
else: |
|||
raise ValueError("Unresolved bookmark '%s'" % (b['/Title'],)) |
|||
|
|||
def findBookmark(self, bookmark, root=None): |
|||
if root == None: |
|||
root = self.bookmarks |
|||
|
|||
for i, b in enumerate(root): |
|||
if isinstance(b, list): |
|||
res = self.findBookmark(bookmark, b) |
|||
if res: |
|||
return [i] + res |
|||
elif b == bookmark or b['/Title'] == bookmark: |
|||
return [i] |
|||
|
|||
return None |
|||
|
|||
def addBookmark(self, title, pagenum, parent=None): |
|||
""" |
|||
Add a bookmark to this PDF file. |
|||
|
|||
:param str title: Title to use for this bookmark. |
|||
:param int pagenum: Page number this bookmark will point to. |
|||
:param parent: A reference to a parent bookmark to create nested |
|||
bookmarks. |
|||
""" |
|||
if parent == None: |
|||
iloc = [len(self.bookmarks)-1] |
|||
elif isinstance(parent, list): |
|||
iloc = parent |
|||
else: |
|||
iloc = self.findBookmark(parent) |
|||
|
|||
dest = Bookmark(TextStringObject(title), NumberObject(pagenum), NameObject('/FitH'), NumberObject(826)) |
|||
|
|||
if parent == None: |
|||
self.bookmarks.append(dest) |
|||
else: |
|||
bmparent = self.bookmarks |
|||
for i in iloc[:-1]: |
|||
bmparent = bmparent[i] |
|||
npos = iloc[-1]+1 |
|||
if npos < len(bmparent) and isinstance(bmparent[npos], list): |
|||
bmparent[npos].append(dest) |
|||
else: |
|||
bmparent.insert(npos, [dest]) |
|||
return dest |
|||
|
|||
def addNamedDestination(self, title, pagenum): |
|||
""" |
|||
Add a destination to the output. |
|||
|
|||
:param str title: Title to use |
|||
:param int pagenum: Page number this destination points at. |
|||
""" |
|||
|
|||
dest = Destination(TextStringObject(title), NumberObject(pagenum), NameObject('/FitH'), NumberObject(826)) |
|||
self.named_dests.append(dest) |
|||
|
|||
|
|||
class OutlinesObject(list): |
|||
def __init__(self, pdf, tree, parent=None): |
|||
list.__init__(self) |
|||
self.tree = tree |
|||
self.pdf = pdf |
|||
self.parent = parent |
|||
|
|||
def remove(self, index): |
|||
obj = self[index] |
|||
del self[index] |
|||
self.tree.removeChild(obj) |
|||
|
|||
def add(self, title, pagenum): |
|||
pageRef = self.pdf.getObject(self.pdf._pages)['/Kids'][pagenum] |
|||
action = DictionaryObject() |
|||
action.update({ |
|||
NameObject('/D') : ArrayObject([pageRef, NameObject('/FitH'), NumberObject(826)]), |
|||
NameObject('/S') : NameObject('/GoTo') |
|||
}) |
|||
actionRef = self.pdf._addObject(action) |
|||
bookmark = TreeObject() |
|||
|
|||
bookmark.update({ |
|||
NameObject('/A'): actionRef, |
|||
NameObject('/Title'): createStringObject(title), |
|||
}) |
|||
|
|||
self.pdf._addObject(bookmark) |
|||
|
|||
self.tree.addChild(bookmark) |
|||
|
|||
def removeAll(self): |
|||
for child in [x for x in self.tree.children()]: |
|||
self.tree.removeChild(child) |
|||
self.pop() |
@ -0,0 +1,152 @@ |
|||
#!/usr/bin/env python |
|||
""" |
|||
Representation and utils for ranges of PDF file pages. |
|||
|
|||
Copyright (c) 2014, Steve Witham <switham_github@mac-guyver.com>. |
|||
All rights reserved. This software is available under a BSD license; |
|||
see https://github.com/mstamy2/PyPDF2/blob/master/LICENSE |
|||
""" |
|||
|
|||
import re |
|||
from .utils import isString |
|||
|
|||
_INT_RE = r"(0|-?[1-9]\d*)" # A decimal int, don't allow "-0". |
|||
PAGE_RANGE_RE = "^({int}|({int}?(:{int}?(:{int}?)?)))$".format(int=_INT_RE) |
|||
# groups: 12 34 5 6 7 8 |
|||
|
|||
|
|||
class ParseError(Exception): |
|||
pass |
|||
|
|||
|
|||
PAGE_RANGE_HELP = """Remember, page indices start with zero. |
|||
Page range expression examples: |
|||
: all pages. -1 last page. |
|||
22 just the 23rd page. :-1 all but the last page. |
|||
0:3 the first three pages. -2 second-to-last page. |
|||
:3 the first three pages. -2: last two pages. |
|||
5: from the sixth page onward. -3:-1 third & second to last. |
|||
The third, "stride" or "step" number is also recognized. |
|||
::2 0 2 4 ... to the end. 3:0:-1 3 2 1 but not 0. |
|||
1:10:2 1 3 5 7 9 2::-1 2 1 0. |
|||
::-1 all pages in reverse order. |
|||
""" |
|||
|
|||
|
|||
class PageRange(object): |
|||
""" |
|||
A slice-like representation of a range of page indices, |
|||
i.e. page numbers, only starting at zero. |
|||
The syntax is like what you would put between brackets [ ]. |
|||
The slice is one of the few Python types that can't be subclassed, |
|||
but this class converts to and from slices, and allows similar use. |
|||
o PageRange(str) parses a string representing a page range. |
|||
o PageRange(slice) directly "imports" a slice. |
|||
o to_slice() gives the equivalent slice. |
|||
o str() and repr() allow printing. |
|||
o indices(n) is like slice.indices(n). |
|||
""" |
|||
|
|||
def __init__(self, arg): |
|||
""" |
|||
Initialize with either a slice -- giving the equivalent page range, |
|||
or a PageRange object -- making a copy, |
|||
or a string like |
|||
"int", "[int]:[int]" or "[int]:[int]:[int]", |
|||
where the brackets indicate optional ints. |
|||
{page_range_help} |
|||
Note the difference between this notation and arguments to slice(): |
|||
slice(3) means the first three pages; |
|||
PageRange("3") means the range of only the fourth page. |
|||
However PageRange(slice(3)) means the first three pages. |
|||
""" |
|||
if isinstance(arg, slice): |
|||
self._slice = arg |
|||
return |
|||
|
|||
if isinstance(arg, PageRange): |
|||
self._slice = arg.to_slice() |
|||
return |
|||
|
|||
m = isString(arg) and re.match(PAGE_RANGE_RE, arg) |
|||
if not m: |
|||
raise ParseError(arg) |
|||
elif m.group(2): |
|||
# Special case: just an int means a range of one page. |
|||
start = int(m.group(2)) |
|||
stop = start + 1 if start != -1 else None |
|||
self._slice = slice(start, stop) |
|||
else: |
|||
self._slice = slice(*[int(g) if g else None |
|||
for g in m.group(4, 6, 8)]) |
|||
|
|||
# Just formatting this when there is __doc__ for __init__ |
|||
if __init__.__doc__: |
|||
__init__.__doc__ = __init__.__doc__.format(page_range_help=PAGE_RANGE_HELP) |
|||
|
|||
@staticmethod |
|||
def valid(input): |
|||
""" True if input is a valid initializer for a PageRange. """ |
|||
return isinstance(input, slice) or \ |
|||
isinstance(input, PageRange) or \ |
|||
(isString(input) |
|||
and bool(re.match(PAGE_RANGE_RE, input))) |
|||
|
|||
def to_slice(self): |
|||
""" Return the slice equivalent of this page range. """ |
|||
return self._slice |
|||
|
|||
def __str__(self): |
|||
""" A string like "1:2:3". """ |
|||
s = self._slice |
|||
if s.step == None: |
|||
if s.start != None and s.stop == s.start + 1: |
|||
return str(s.start) |
|||
|
|||
indices = s.start, s.stop |
|||
else: |
|||
indices = s.start, s.stop, s.step |
|||
return ':'.join("" if i == None else str(i) for i in indices) |
|||
|
|||
def __repr__(self): |
|||
""" A string like "PageRange('1:2:3')". """ |
|||
return "PageRange(" + repr(str(self)) + ")" |
|||
|
|||
def indices(self, n): |
|||
""" |
|||
n is the length of the list of pages to choose from. |
|||
Returns arguments for range(). See help(slice.indices). |
|||
""" |
|||
return self._slice.indices(n) |
|||
|
|||
|
|||
PAGE_RANGE_ALL = PageRange(":") # The range of all pages. |
|||
|
|||
|
|||
def parse_filename_page_ranges(args): |
|||
""" |
|||
Given a list of filenames and page ranges, return a list of |
|||
(filename, page_range) pairs. |
|||
First arg must be a filename; other ags are filenames, page-range |
|||
expressions, slice objects, or PageRange objects. |
|||
A filename not followed by a page range indicates all pages of the file. |
|||
""" |
|||
pairs = [] |
|||
pdf_filename = None |
|||
did_page_range = False |
|||
for arg in args + [None]: |
|||
if PageRange.valid(arg): |
|||
if not pdf_filename: |
|||
raise ValueError("The first argument must be a filename, " \ |
|||
"not a page range.") |
|||
|
|||
pairs.append( (pdf_filename, PageRange(arg)) ) |
|||
did_page_range = True |
|||
else: |
|||
# New filename or end of list--do all of the previous file? |
|||
if pdf_filename and not did_page_range: |
|||
pairs.append( (pdf_filename, PAGE_RANGE_ALL) ) |
|||
|
|||
pdf_filename = arg |
|||
did_page_range = False |
|||
return pairs |
3099
pdfbooklet_3.1.2-3_all/usr/lib/python3/dist-packages/pdfbooklet/PyPDF2_G/pdf.py
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,295 @@ |
|||
# Copyright (c) 2006, Mathieu Fenniak |
|||
# All rights reserved. |
|||
# |
|||
# Redistribution and use in source and binary forms, with or without |
|||
# modification, are permitted provided that the following conditions are |
|||
# met: |
|||
# |
|||
# * Redistributions of source code must retain the above copyright notice, |
|||
# this list of conditions and the following disclaimer. |
|||
# * Redistributions in binary form must reproduce the above copyright notice, |
|||
# this list of conditions and the following disclaimer in the documentation |
|||
# and/or other materials provided with the distribution. |
|||
# * The name of the author may not be used to endorse or promote products |
|||
# derived from this software without specific prior written permission. |
|||
# |
|||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
|||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
|||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
|||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
|||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
|||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
|||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
|||
# POSSIBILITY OF SUCH DAMAGE. |
|||
|
|||
""" |
|||
Utility functions for PDF library. |
|||
""" |
|||
__author__ = "Mathieu Fenniak" |
|||
__author_email__ = "biziqe@mathieu.fenniak.net" |
|||
|
|||
|
|||
import sys |
|||
|
|||
try: |
|||
import __builtin__ as builtins |
|||
except ImportError: # Py3 |
|||
import builtins |
|||
|
|||
|
|||
xrange_fn = getattr(builtins, "xrange", range) |
|||
_basestring = getattr(builtins, "basestring", str) |
|||
|
|||
bytes_type = type(bytes()) # Works the same in Python 2.X and 3.X |
|||
string_type = getattr(builtins, "unicode", str) |
|||
int_types = (int, long) if sys.version_info[0] < 3 else (int,) |
|||
|
|||
|
|||
# Make basic type tests more consistent |
|||
def isString(s): |
|||
"""Test if arg is a string. Compatible with Python 2 and 3.""" |
|||
return isinstance(s, _basestring) |
|||
|
|||
|
|||
def isInt(n): |
|||
"""Test if arg is an int. Compatible with Python 2 and 3.""" |
|||
return isinstance(n, int_types) |
|||
|
|||
|
|||
def isBytes(b): |
|||
"""Test if arg is a bytes instance. Compatible with Python 2 and 3.""" |
|||
return isinstance(b, bytes_type) |
|||
|
|||
|
|||
#custom implementation of warnings.formatwarning |
|||
def formatWarning(message, category, filename, lineno, line=None): |
|||
file = filename.replace("/", "\\").rsplit("\\", 1)[1] # find the file name |
|||
return "%s: %s [%s:%s]\n" % (category.__name__, message, file, lineno) |
|||
|
|||
|
|||
def readUntilWhitespace(stream, maxchars=None): |
|||
""" |
|||
Reads non-whitespace characters and returns them. |
|||
Stops upon encountering whitespace or when maxchars is reached. |
|||
""" |
|||
txt = b_("") |
|||
while True: |
|||
tok = stream.read(1) |
|||
if tok.isspace() or not tok: |
|||
break |
|||
txt += tok |
|||
if len(txt) == maxchars: |
|||
break |
|||
return txt |
|||
|
|||
|
|||
def readNonWhitespace(stream): |
|||
""" |
|||
Finds and reads the next non-whitespace character (ignores whitespace). |
|||
""" |
|||
tok = WHITESPACES[0] |
|||
while tok in WHITESPACES: |
|||
tok = stream.read(1) |
|||
return tok |
|||
|
|||
|
|||
def skipOverWhitespace(stream): |
|||
""" |
|||
Similar to readNonWhitespace, but returns a Boolean if more than |
|||
one whitespace character was read. |
|||
""" |
|||
tok = WHITESPACES[0] |
|||
cnt = 0; |
|||
while tok in WHITESPACES: |
|||
tok = stream.read(1) |
|||
cnt+=1 |
|||
return (cnt > 1) |
|||
|
|||
|
|||
def skipOverComment(stream): |
|||
tok = stream.read(1) |
|||
stream.seek(-1, 1) |
|||
if tok == b_('%'): |
|||
while tok not in (b_('\n'), b_('\r')): |
|||
tok = stream.read(1) |
|||
|
|||
|
|||
def readUntilRegex(stream, regex, ignore_eof=False): |
|||
""" |
|||
Reads until the regular expression pattern matched (ignore the match) |
|||
Raise PdfStreamError on premature end-of-file. |
|||
:param bool ignore_eof: If true, ignore end-of-line and return immediately |
|||
""" |
|||
name = b_('') |
|||
while True: |
|||
tok = stream.read(16) |
|||
if not tok: |
|||
# stream has truncated prematurely |
|||
if ignore_eof == True: |
|||
return name |
|||
else: |
|||
raise PdfStreamError("Stream has ended unexpectedly") |
|||
m = regex.search(tok) |
|||
if m is not None: |
|||
name += tok[:m.start()] |
|||
stream.seek(m.start()-len(tok), 1) |
|||
break |
|||
name += tok |
|||
return name |
|||
|
|||
|
|||
class ConvertFunctionsToVirtualList(object): |
|||
def __init__(self, lengthFunction, getFunction): |
|||
self.lengthFunction = lengthFunction |
|||
self.getFunction = getFunction |
|||
|
|||
def __len__(self): |
|||
return self.lengthFunction() |
|||
|
|||
def __getitem__(self, index): |
|||
if isinstance(index, slice): |
|||
indices = xrange_fn(*index.indices(len(self))) |
|||
cls = type(self) |
|||
return cls(indices.__len__, lambda idx: self[indices[idx]]) |
|||
if not isInt(index): |
|||
raise TypeError("sequence indices must be integers") |
|||
len_self = len(self) |
|||
if index < 0: |
|||
# support negative indexes |
|||
index = len_self + index |
|||
if index < 0 or index >= len_self: |
|||
raise IndexError("sequence index out of range") |
|||
return self.getFunction(index) |
|||
|
|||
|
|||
def RC4_encrypt(key, plaintext): |
|||
S = [i for i in range(256)] |
|||
j = 0 |
|||
for i in range(256): |
|||
j = (j + S[i] + ord_(key[i % len(key)])) % 256 |
|||
S[i], S[j] = S[j], S[i] |
|||
i, j = 0, 0 |
|||
retval = b_("") |
|||
for x in range(len(plaintext)): |
|||
i = (i + 1) % 256 |
|||
j = (j + S[i]) % 256 |
|||
S[i], S[j] = S[j], S[i] |
|||
t = S[(S[i] + S[j]) % 256] |
|||
retval += b_(chr(ord_(plaintext[x]) ^ t)) |
|||
return retval |
|||
|
|||
|
|||
def matrixMultiply(a, b): |
|||
return [[sum([float(i)*float(j) |
|||
for i, j in zip(row, col)] |
|||
) for col in zip(*b)] |
|||
for row in a] |
|||
|
|||
|
|||
def markLocation(stream): |
|||
"""Creates text file showing current location in context.""" |
|||
# Mainly for debugging |
|||
RADIUS = 5000 |
|||
stream.seek(-RADIUS, 1) |
|||
outputDoc = open('PyPDF2_pdfLocation.txt', 'w') |
|||
outputDoc.write(stream.read(RADIUS)) |
|||
outputDoc.write('HERE') |
|||
outputDoc.write(stream.read(RADIUS)) |
|||
outputDoc.close() |
|||
stream.seek(-RADIUS, 1) |
|||
|
|||
|
|||
class PyPdfError(Exception): |
|||
pass |
|||
|
|||
|
|||
class PdfReadError(PyPdfError): |
|||
pass |
|||
|
|||
|
|||
class PageSizeNotDefinedError(PyPdfError): |
|||
pass |
|||
|
|||
|
|||
class PdfReadWarning(UserWarning): |
|||
pass |
|||
|
|||
|
|||
class PdfStreamError(PdfReadError): |
|||
pass |
|||
|
|||
|
|||
if sys.version_info[0] < 3: |
|||
def b_(s): |
|||
return s |
|||
else: |
|||
B_CACHE = {} |
|||
|
|||
def b_(s): |
|||
bc = B_CACHE |
|||
if s in bc: |
|||
return bc[s] |
|||
if type(s) == bytes: |
|||
return s |
|||
else: |
|||
r = s.encode('latin-1') |
|||
if len(s) < 2: |
|||
bc[s] = r |
|||
return r |
|||
|
|||
|
|||
def u_(s): |
|||
if sys.version_info[0] < 3: |
|||
return unicode(s, 'unicode_escape') |
|||
else: |
|||
return s |
|||
|
|||
|
|||
def str_(b): |
|||
if sys.version_info[0] < 3: |
|||
return b |
|||
else: |
|||
if type(b) == bytes: |
|||
return b.decode('latin-1') |
|||
else: |
|||
return b |
|||
|
|||
|
|||
def ord_(b): |
|||
if sys.version_info[0] < 3 or type(b) == str: |
|||
return ord(b) |
|||
else: |
|||
return b |
|||
|
|||
|
|||
def chr_(c): |
|||
if sys.version_info[0] < 3: |
|||
return c |
|||
else: |
|||
return chr(c) |
|||
|
|||
|
|||
def barray(b): |
|||
if sys.version_info[0] < 3: |
|||
return b |
|||
else: |
|||
return bytearray(b) |
|||
|
|||
|
|||
def |