pax_global_header00006660000000000000000000000064146350406450014521gustar00rootroot0000000000000052 comment=446b498c569df0d65bf553d2012c3bc798f6ad1d pdfarranger-1.11.0/000077500000000000000000000000001463504064500140745ustar00rootroot00000000000000pdfarranger-1.11.0/.coveragerc000066400000000000000000000001241463504064500162120ustar00rootroot00000000000000# Empty file just to avoid a crash in coverage with # --concurrency=multiprocessing pdfarranger-1.11.0/.github/000077500000000000000000000000001463504064500154345ustar00rootroot00000000000000pdfarranger-1.11.0/.github/ISSUE_TEMPLATE/000077500000000000000000000000001463504064500176175ustar00rootroot00000000000000pdfarranger-1.11.0/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000016551463504064500223200ustar00rootroot00000000000000--- name: Bug report about: Create a report to help us improve title: '' labels: '' assignees: '' --- Describe the bug ---------------- A clear and concise description of what the bug is. To Reproduce ------------ Steps to reproduce the behavior: 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error Expected behavior ----------------- A clear and concise description of what you expected to happen. Input files ----------- Check if the bug appear only with some PDF or image files. If the bug is specific to some files please attach one to the issue. Screenshots ----------- If applicable, add screenshots to help explain your problem. System and Versions ------------------- - PDF Arranger version and where you get it (distro package, flatpak, pip, git, download, ...) - pikepdf version and where you get it (distro package, pip, git, ...) - OS name and version (e.g.: Windows 10, Fedora 33, ...) pdfarranger-1.11.0/.github/dependabot.yml000066400000000000000000000001671463504064500202700ustar00rootroot00000000000000version: 2 updates: - package-ecosystem: "github-actions" directory: "/" schedule: interval: "monthly" pdfarranger-1.11.0/.github/workflows/000077500000000000000000000000001463504064500174715ustar00rootroot00000000000000pdfarranger-1.11.0/.github/workflows/codeql.yml000066400000000000000000000015011463504064500214600ustar00rootroot00000000000000name: "CodeQL" on: push: branches: [ "main" ] pull_request: branches: [ "main" ] schedule: - cron: "16 9 * * 2" jobs: analyze: name: Analyze runs-on: ubuntu-latest permissions: actions: read contents: read security-events: write strategy: fail-fast: false matrix: language: [ python ] steps: - name: Checkout uses: actions/checkout@v4 - name: Initialize CodeQL uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} queries: +security-and-quality - name: Autobuild uses: github/codeql-action/autobuild@v3 - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v3 with: category: "/language:${{ matrix.language }}" pdfarranger-1.11.0/.github/workflows/install.yml000066400000000000000000000073261463504064500216720ustar00rootroot00000000000000name: pdfarranger on: push: branches: [ main ] pull_request: jobs: build: runs-on: ubuntu-latest env: PDFARRANGER_COVERAGE: 1 steps: - run: sudo apt-get update - name: Install APT packages run: sudo apt-get -y install gettext appstream python3-dogtail desktop-file-utils xvfb gir1.2-poppler-0.18 - uses: actions/checkout@v4 - name: Upgrade pip run: pip install --upgrade pip - name: Install run: pip3 install -v --upgrade .[image] coverage - name: AppStream run: appstreamcli validate $HOME/.local/share/metainfo/com.github.jeromerobert.pdfarranger.metainfo.xml - name: Validate Desktop File run: desktop-file-validate $HOME/.local/share/applications/com.github.jeromerobert.pdfarranger.desktop - name: Dogtail Tests and Coverage run: python3 -X tracemalloc -u -m unittest -v -f tests.test - name: Exporter Tests and Coverage run: python3 -m coverage run --data-file=.coverage.exporter -m unittest -v -f tests.test_exporter - name: Core Tests and Coverage run: python3 -m coverage run --data-file=.coverage.core -m unittest -v -f tests.test_core # Convert to lcov because it's compatible with codecov AND can be combine - name: Convert to lcov run: python3 -m coverage combine && python3 -m coverage lcov # Upload for later use (see upload-to-codecov job) - uses: actions/upload-artifact@v4 with: name: ppp-lcov path: coverage.lcov build-pikepdf-6: runs-on: ubuntu-latest # PikePDF 6.0.1 container: jeromerobert/pdfarranger-docker-ci:1.5.0 env: PDFARRANGER_COVERAGE: 1 steps: - uses: actions/checkout@v4 - name: Install run: pip3 install -v .[image] - name: Dogtail Tests and Coverage run: python3 -X tracemalloc -u -m unittest -v -f tests.test - name: Exporter Tests and Coverage run: python3 -m coverage run --data-file=.coverage.exporter -m unittest -v -f tests.test_exporter - name: Core Tests and Coverage run: python3 -m coverage run --data-file=.coverage.core -m unittest -v -f tests.test_core - name: Convert to lcov run: python3 -m coverage combine && python3 -m coverage lcov - uses: actions/upload-artifact@v4 with: name: pp6-lcov path: coverage.lcov upload-to-codecov: # Upload to a codecov in a dedicated job to avoid races needs: [build, build-pikepdf-6] runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Install lcov run: sudo apt-get -y install lcov - name: Download Artifacts uses: actions/download-artifact@v4 - name: Combine Coverage run: lcov -a ppp-lcov/coverage.lcov -a pp6-lcov/coverage.lcov -o lcov.info - name: Upload to Codecov uses: codecov/codecov-action@v4 with: token: ${{ secrets.CODECOV_TOKEN }} build-win32: runs-on: ubuntu-latest container: image: jeromerobert/wine-mingw64:1.9.0 options: --user root steps: - uses: actions/checkout@v4 - run: ./setup.py build -v - run: HOME=/root wine python setup_win32.py bdist_msi - run: HOME=/root wine python setup_win32.py bdist_zip - uses: actions/upload-artifact@v4 with: name: pdfarranger-windows-installer-msi path: dist/*.msi - uses: actions/upload-artifact@v4 with: name: pdfarranger-windows-portable-zip path: dist/*.zip rpmbuild: runs-on: ubuntu-latest container: dreua/pdfarranger-docker-rpm steps: - name: RPM Build run: /pdfarranger/pdfarranger-build - uses: actions/upload-artifact@v4 with: name: pdfarranger-fedora-testbuild path: /github/home/rpmbuild/**/*.rpm pdfarranger-1.11.0/.github/workflows/snap.yml000066400000000000000000000013161463504064500211560ustar00rootroot00000000000000on: push: branches: [ "main" ] pull_request: workflow_dispatch: name: Snap permissions: id-token: write contents: read jobs: snap: name: "Test if the Snap can be built from the latest commit in the branch" runs-on: ubuntu-latest strategy: matrix: arch: [x86_64] fail-fast: false steps: - name: Checkout Git repository uses: actions/checkout@v4 - name: Build Snap uses: snapcore/action-build@v1 id: snapcraft-build with: snapcraft-args: "-v" - uses: actions/upload-artifact@v4 with: name: ${{ steps.snapcraft-build.outputs.snap }} path: ${{ steps.snapcraft-build.outputs.snap }} pdfarranger-1.11.0/.gitignore000066400000000000000000000000511463504064500160600ustar00rootroot00000000000000__pycache__ venv/ tests/exporter/out.pdf pdfarranger-1.11.0/COPYING000066400000000000000000001045141463504064500151340ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. 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. Copyright (C) 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 . 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: Copyright (C) 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 . 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 . pdfarranger-1.11.0/README.md000066400000000000000000000126361463504064500153630ustar00rootroot00000000000000## About [![CodeQL](https://github.com/pdfarranger/pdfarranger/workflows/CodeQL/badge.svg)](https://github.com/pdfarranger/pdfarranger/actions?query=workflow%3ACodeQL "Code quality workflow status") [![Codacy Badge](https://app.codacy.com/project/badge/Grade/1be9c9a69f3a44b79612cc5b2887c0f7)](https://www.codacy.com/gh/pdfarranger/pdfarranger/dashboard?utm_source=github.com&utm_medium=referral&utm_content=pdfarranger/pdfarranger&utm_campaign=Badge_Grade) [![pdfarranger](https://github.com/pdfarranger/pdfarranger/workflows/pdfarranger/badge.svg)](https://github.com/pdfarranger/pdfarranger/actions?query=workflow%3Apdfarranger+branch%3Amain) [![codecov](https://codecov.io/gh/pdfarranger/pdfarranger/branch/main/graph/badge.svg)](https://codecov.io/gh/pdfarranger/pdfarranger) *PDF Arranger* is a small python-gtk application, which helps the user to merge or split PDF documents and rotate, crop and rearrange their pages using an interactive and intuitive graphical interface. It is a front end for [pikepdf](https://github.com/pikepdf/pikepdf). *PDF Arranger* is a fork of Konstantinos Poulios’s PDF-Shuffler (see [Savannah](https://savannah.nongnu.org/projects/pdfshuffler) or [Sourceforge](http://sourceforge.net/projects/pdfshuffler)). It’s a humble attempt to make the project a bit more active. For more info see [User Manual](https://github.com/pdfarranger/pdfarranger/wiki/User-Manual). ![screenshot of PDF Arranger](https://github.com/pdfarranger/pdfarranger/raw/main/data/screenshot.png) ## Downloads | [PDF Arranger for Windows](https://github.com/pdfarranger/pdfarranger/releases) | Download on Flathub | Get it from the Snap Store | [More…](https://github.com/pdfarranger/pdfarranger/wiki/Binary-packages) | | --------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ### Linux and BSD packages [![Linux packages](https://repology.org/badge/vertical-allrepos/pdfarranger.svg?columns=4&exclude_unsupported=1)](https://repology.org/project/pdfarranger/versions) ## Install from source *PDF Arranger* requires [pikepdf](https://github.com/pikepdf/pikepdf) >= 6. Pip will automatically install the latest pikepdf if there is no pikepdf installed on the system. **On Debian-based distributions** ``` sudo apt-get install python3-pip python3-wheel python3-gi python3-gi-cairo \ gir1.2-gtk-3.0 gir1.2-poppler-0.18 gir1.2-handy-1 python3-setuptools ``` **On Arch Linux** ``` sudo pacman -S poppler-glib python-pip python-gobject gtk3 python-cairo libhandy ``` **On Fedora** ``` sudo dnf install poppler-glib python3-pip python3-gobject gtk3 python3-cairo \ python3-wheel python3-pikepdf python3-img2pdf python3-dateutil libhandy ``` **On FreeBSD** ``` sudo pkg install devel/gettext devel/py-gobject3 devel/py-pip \ graphics/poppler-glib textproc/py-pikepdf x11-toolkits/gtk30 \ x11-toolkits/libhandy ``` **Then** ``` pip3 install --user --upgrade https://github.com/pdfarranger/pdfarranger/zipball/main ``` In addition, *PDF Arranger* supports image file import if [img2pdf](https://gitlab.mister-muffin.de/josch/img2pdf) is installed. ## For developers ``` git clone https://github.com/pdfarranger/pdfarranger.git cd pdfarranger ./setup.py build python3 -m pdfarranger ``` For Windows see [Win32.md](Win32.md). ## For translators * Download the main branch (see [For developers](#for-developers)) * Run `po/genpot.sh`. The `pot` is an automatically generated file and as such should not be in the repository. It is to make life of some translators easier, but it might be out of sync with the source code. If you can regenerate it before adding or updating a translation, then do it. * Translations are in the following files: * [`po`](po)`/*.po` * [data/com.github.jeromerobert.pdfarranger.metainfo.xml](data/com.github.jeromerobert.pdfarranger.metainfo.xml) * [data/com.github.jeromerobert.pdfarranger.desktop](data/com.github.jeromerobert.pdfarranger.desktop) * For mnemonics accelerators (letters preceded by an underscore) try to follow those rules by priority order: * be consistent with other GTK/GNOME software * pick a unique letter **within that given menu** if possible * pick the same letter as the original string if available * pick a strong letter (e.g. in "Search and replace" rather pick `s`, `r` or `p` than `a`) * If possible, test your translation to see it in context (see [For developers](#for-developers)) * Do not include `pdfarranger.pot` (or any `*.po` file which was just automatically regenerated) in your pull request. Submit only the translations you actually updated or added. * If you don’t want or can’t use the developers tooling (`git`, `po/genpot.sh`, `python`, …) you can edit, download or upload the `*.po` files from the GitHub web pages. pdfarranger-1.11.0/TESTING.md000066400000000000000000000037731463504064500155450ustar00rootroot00000000000000This file aims at listing all GUI operation one should do to test the whole PDF Arranger source code. Those tests must currently be done manually. May one day, they'll be done with [Dogtail](https://gitlab.com/dogtail/dogtail) or another GUI testing framework. As testing is done manually this list should remain as short as possible. Duplicate tests should be avoided and each step should test as many features as possible. This list was created using [Coverage.py](https://coverage.readthedocs.io). - Run `python3 -m pdfarranger mypdf.pdf` - Crop and rotate one page - Rotate a page 4 time - Split a page - Crop white border on another page - Edit PDF properties, change some properties, set multiple creators using json syntax then validate the dialog with cursor still in the text field. - Delete one page - Undo delete, redo delete - Zoom / unzoom - Move one page using drag and drop - Cut / paste within same PDF Arranger instance - Save As - Import an image - Import a PDF file - Copy (`ctrl+c` / `ctrl+v`) a PDF file from a file explorer - Drag a PDF file from a file explorer - Copy a PDF file from another PDF Arranger instance and paste it interleaved - Select all pages, copy then paste odd - Select even page, then invert selection - Drag a PDF file from a PDF Arranger to a other PDF Arranger instance - Duplicate a page - Reverse order - Rubberband selection with scrolling - Open the about dialog - Quit, cancel - Quit without saving ## Dogtail Running Dogtail tests and coverage in Docker: ``` docker run -w /src -v $PWD:/src jeromerobert/pdfarranger-docker-ci sh -c "pip install .[image] ; python3 -X tracemalloc -u -m unittest discover -s tests -v -f ; python3 -m coverage combine ; python3 -m coverage html" ``` Running Dogtail tests with the legacy PikePDF in Podman: ``` podman run -w /src -v $PWD:/src docker.io/jeromerobert/pdfarranger-docker-ci:1.3.1 sh -c "pip install .[image] ; python3 -u -m unittest discover -s tests -v" ``` pdfarranger-1.11.0/Win32.md000066400000000000000000000044251463504064500153250ustar00rootroot00000000000000# PDF Arranger on Windows ## Prerequisites Install [MSYS2](http://www.msys2.org). Once installed start `MSYS2 MSYS` shell. Update all packages: ``` pacman -Syu ``` You might need to run it again (it tells you to): ``` pacman -Su ``` Install the required dependencies: ``` pacman -S mingw-w64-x86_64-gtk3 mingw-w64-x86_64-python-gobject \ mingw-w64-x86_64-python-cairo mingw-w64-x86_64-poppler mingw-w64-x86_64-gcc \ mingw-w64-x86_64-python-lxml mingw-w64-x86_64-qpdf mingw-w64-x86_64-pybind11 \ mingw-w64-x86_64-gettext mingw-w64-x86_64-gnutls mingw-w64-x86_64-python-pillow \ mingw-w64-x86_64-python-dateutil mingw-w64-x86_64-python-pip mingw-w64-x86_64-libhandy \ mingw-w64-x86_64-python-cx_Freeze git python-pip ``` ``` export PATH=$PATH:/mingw64/bin SETUPTOOLS_USE_DISTUTILS=stdlib \ /mingw64/bin/python3.exe -m pip install --user keyboard darkdetect pikepdf img2pdf ``` ## Building PDF Arranger Get the PDF Arranger sources: ``` git clone https://github.com/pdfarranger/pdfarranger.git ``` Then ``` cd pdfarranger /mingw64/bin/python3.exe ./setup.py build /mingw64/bin/python3.exe setup_win32.py bdist_msi /mingw64/bin/python3.exe setup_win32.py bdist_zip ``` ## Debug / hacking After running `setup.py build` it's possible to run PDF Arranger without creating the installer: ``` cd pdfarranger /mingw64/bin/python3.exe ./setup.py build /mingw64/bin/python3.exe -m pdfarranger ``` ## Wine MSYS2 no longer work in Wine (see ). To create a pdfarranger installer in Wine you must first install the required mingw-w64 packages on a real Windows box. Then copy the MSYS2 `/mingw64` to Linux and run installation process with `wine /path/to/mingw64/bin/python3` instead of `/mingw64/bin/python3`. To run the PDF Arranger in Wine you may have to: ``` unset $(env |grep ^XDG_ | cut -d= -f1) ``` ## Docker / Podman ```bash #! /bin/sh -ex mydocker() { # You may switch to docker and adapt image name & tag if needed podman run -v local:/root/.wine/drive_c/users/root/.local \ -v $PWD:/pdfarranger -w /pdfarranger -it docker.io/jeromerobert/wine-mingw64:1.8.1 "$@" } pythonwin32() { mydocker wine cmd /c z:/mingw64/bin/python "$@" } mydocker ./setup.py build pythonwin32 setup_win32.py bdist_msi pythonwin32 setup_win32.py bdist_zip ``` pdfarranger-1.11.0/data/000077500000000000000000000000001463504064500150055ustar00rootroot00000000000000pdfarranger-1.11.0/data/com.github.jeromerobert.pdfarranger.desktop000066400000000000000000000062171463504064500254350ustar00rootroot00000000000000[Desktop Entry] Version=1.0 Name=PDF Arranger Name[ca]=Arranjador de PDF Name[de]=PDF Arranger Name[hr]=PDF uređivač Name[hu]=PDF-rendező Name[id]=Penyusun PDF Name[ko]=PDF 편집기 Name[nl]=PDF Arranger Name[pt]=PDF Arranger Name[tr]=PDF Düzenleyici Name[zh_TW]=PDF Arranger Comment=Merge, shuffle, and crop PDFs Comment[ca]=Fusionador, arranjador, divisor, rotador i retallador de PDF Comment[cs]=Program pro sloučení, přeuspořádání, rozdělení, otočení a oříznutí PDF Comment[da]=Sammensæt, omarranger, opdel, roter og beskær PDF-filer Comment[de]=PDFs umsortieren und zuschneiden Comment[el]=Συγχώνευση, αναδιάταξη, διαχωρισμός, περιστροφή και περικοπή αρχειων PDF Comment[es]=Fusionar, mezclar y recortar archivos PDF Comment[fi]=Yhdistä, järjestele, jaa, käännä ja rajaa PDF-tiedostoja Comment[fr]=Fusionner, réorganiser et recadrer des PDFs Comment[he]=מיזוג, סידור מחדש, פיצול, הטיה וחיתוך PDF Comment[hr]=Sjedinjavanje, preraspoređivanje, rastavljanje, okretanje i obrezivanje PDF dokumenata Comment[hu]=PDF egyesítése, átrendezése, felosztása, elforgatása és körülvágása Comment[id]=Menggabungkan, Mengatur ulang, Memisahkan, Memutar, dan Memangkas file PDF. Comment[is]=Forrit til að sameina, endurraða, skipta upp, snúa og skera utan af síðum í PDF-skjölum Comment[it]=Unione, riorganizzazione, divisione, rotazione e ritaglio di PDF Comment[ko]=PDF 합치기, 재정렬, 나누기, 회전 및 잘라내기 Comment[nl]=Een klein programma voor het samenvoegen, herordenen, opsplitsen, draaien en bijsnijden van pdf-bestanden Comment[pt]=Aplicação para juntar, organizar, separar, rodar e recortar ficheiros PDF Comment[ru]=Приложение для объединения, изменения порядка страниц, разделения, вращение и обрезки документов PDF Comment[sk]=Grafický nástroj na manipuláciu s PDF Comment[sv]=Slå samman, arrangera om, dela, rotera och beskär PDF filer Comment[tr]=PDF Birleştirme, Yeniden Düzenleme, Bölme, Döndürme ve Kırpma Comment[uk]=Додаток для об'єднання, зміни порядку сторінок, розділу, обертання та обрізання PDF документів Comment[zh_TW]=合併、重新排列及裁切 PDF Type=Application Exec=pdfarranger %U Icon=com.github.jeromerobert.pdfarranger MimeType=application/pdf;application/postscript;application/x-ext-pdf;image/x-bmp;image/bmp;image/gif;image/tiff;image/jp2;image/jpeg;image/jpg;image/png;image/x-icon;image/x-portable-pixmap;image/x-gray;image/x-ico;image/x-png;image/vnd.zbrush.pcx;image/x-pcx; Categories=Office; Terminal=false StartupNotify=false Keywords=pdfarranger;pdfshuffler;PDF Shuffler; Actions=new-window; [Desktop Action new-window] Name=New Window Name[ca]=Finestra nova Name[de]=Neues Fenster Name[es]=Ventana nueva Name[fr]=Nouvelle fenêtre Name[hr]=Novi prozor Name[hu]=Új ablak Name[id]=Jendela Baru Name[is]=Nýr gluggi Name[it]=Nuova finestra Name[nl]=Nieuw venster Name[pt]=Nova janela Name[uk]=Нове вікно Name[zh_TW]=新視窗 Exec=pdfarranger pdfarranger-1.11.0/data/com.github.jeromerobert.pdfarranger.metainfo.xml000066400000000000000000000260261463504064500263650ustar00rootroot00000000000000 com.github.jeromerobert.pdfarranger PDF Arranger PDF 편집기 PDF uređivač PDF-rendező Penyusun PDF PDF Düzenleyici Arranjador de PDF PDF Arranger Merge, shuffle, and crop PDFs Fusionador, arranjador, divisor, rotador i retallador de PDF Program pro sloučení, přeuspořádání, rozdělení, otočení a oříznutí PDF PDFs umsortieren und zuschneiden Συγχώνευση, αναδιάταξη, διαχωρισμός, περιστροφή και περικοπή αρχείων PDF Fusionar, mezclar y recortar archivos PDF Yhdistä, järjestele, jaa, käännä ja rajaa PDF-tiedostoja Fusionner, réorganiser et recadrer des PDFs Sjedinjavanje, preraspoređivanje, rastavljanje, okretanje i obrezivanje PDF dokumenata PDF egyesítése, átrendezése, felosztása, elforgatása és körülvágása Menggabungkan, Mengatur ulang, Memisahkan, Memutar, dan Memangkas file PDF Een programma voor het samenvoegen, herordenen, opsplitsen, draaien en bijsnijden van pdf-bestanden Forrit til að sameina, endurraða, skipta upp, snúa og skera utan af síðum í PDF-skjölum Aplicação para juntar, organizar, separar, rodar e recortar ficheiros PDF Приложение для объединения, изменения порядка страниц, разделения, вращение и обрезки документов PDF Grafický nástroj na manipuláciu s PDF Slå samman, arrangera om, dela, rotera och beskär PDF filer PDF를 합치기, 재정렬, 나누기, 회전하거나 잘라내기 PDF Birleştirme, Yeniden Düzenleme, Bölme, Döndürme ve Kırpma Додаток для об'єднання, зміни порядку сторінок, розділу, обертання та обрізання PDF документів 合併、重新排列及裁切 PDF com.github.jeromerobert.pdfarranger.desktop CC0-1.0 Office

PDF Arranger is a small application, which helps the user to merge or split pdf documents and rotate, crop and rearrange their pages using an interactive and intuitive graphical interface.

It is a frontend for pikepdf.

El PDF Arranger és una aplicació petita, que ajuda l'usuari a fusionar o dividir els documents PDF i girar, escapçar i reorganitza les seves pàgines utilitzant una interfície interactiva, gràfica i intuïtiva.

És una interfície per pikepdf.

Το PDF Arranger είναι μια μικρή εφαρμογή, που βοηθά τον χρήστη να συγχωνεύσει η να διαχωρίσει αρχεία τύπου PDF και να περιστρέψει, περικόψει η αναδιατάξει τις σελίδες τους χρησιμοποιώντας ένα διαδραστικό και διαισθητικό γραφικό περιβάλλον.

Είναι ένα γραφικό περιβάλλον για το pikepdf.

PDF Arranger es una pequeña aplicación que ayuda al usuario a fusionar o dividir documentos pdf y rotar, recortar y reorganizar sus páginas usando una interfaz gráfica interactiva e intuitiva.

Es una interfaz para pikepdf.

PDF Arranger est une petite application qui aide l’utilisateur à fusionner ou découper des documents PDF et pivoter, recadrer et réarranger leurs pages en utilisant une interface graphique intuitive.

Il s’agit d’une interface pour pikepdf.

PDF uređivač je mali program koja pomaže korisniku sjediniti ili rastaviti pdf dokumente te okretati, obrezati i preurediti stranice tih dokumenata pomoću interaktivnog i intuitivnog grafičkog sučelja.

Radi se o sučelju za pikepdf.

A PDF-rendező egy kis alkalmazás, amely egy interaktív és intuitív grafikus felület segítségével segíti a felhasználót a pdf dokumentumok egyesítésében vagy felosztásában, valamint az oldalak elforgatásában, kivágásában és átrendezésében.

Ez a pikepdf kezelőfelülete.

PDF Arranger adalah aplikasi kecil yang membantu pengguna untuk menggabungkan atau memisahkan dokumen PDF serta memutar, mencrop, dan mengatur ulang halaman-halaman menggunakan antarmuka grafis yang interaktif dan intuitif.

Ini adalah antarmuka pengguna (frontend) untuk pikepdf.

PDF Arranger er lítið forrit sem hjálpar notendum að sameina eða skipta upp PDF-skjölum, auk þess að hægt er að endurraða, skera utan af eða snúa stökum síðum í þeim með einföldu gagnvirku viðmóti.

Þetta er viðmót fyrir pikepdf.

PDF 편집기는 사용자가 PDF 문서를 합치거나 나누고 페이지를 재정렬할 수 있는 다기능 그래픽 인터페이스를 사용하는 간단한 프로그램입니다.

pikepdf를 기반으로 합니다.

O PDF Arranger é uma pequena aplicação, que ajuda o utilizador a juntar ou dividir documentos pdf e a rodar, recortar e reorganizar as suas páginas usando uma interface gráfica interativa e intuitiva.

É uma interface gráfica para o pikepdf.

PDF Arranger is een klein programma waarmee pdf-bestanden kunnen worden gedraaid, bijgesneden, opgesplitst en pagina's worden herordend, allemaal vanuit een intuïtief, grafisch venster.

Het is een frontend voor pikepdf.

PDF Arranger - это небольшое python-gtk приложение, которое помогает пользователю объединять или разделять документы PDF, а также вращать, обрезать и изменять порядок страниц с помощью интерактивного и интуитивно понятного графического интерфейса.

Это клиентский интерфейс для pikepdf.

PDF Arranger, kullanıcının etkileşimli ve sezgisel bir grafiksel arayüz kullanarak PDF belgelerini birleştirmesine veya bölmesine ve sayfalarını döndürmesine, kırpmasına ve yeniden düzenlemesine yardımcı olan küçük bir uygulamadır.

pikepdf için bir önyüzdür.

PDF Arranger це маленький python-gtk додаток, який допоможе користувачу зливати разом або розділяти pdf документи і перегортати, обрізати і переставляти місцями сторінки за допомогою інтерактивного і інтуітивного графічного інтерфейсу.

Це графічна оболонка для pikepdf.

PDF Arranger 是一個用 python-gtk 寫的小程式,讓使用者能透過直覺的互動式圖形介面, 合併、分割 PDF 文件並裁切及重新排列頁面。

它是 pikepdf 的前端之一。

The PDF Arranger team https://github.com/pdfarranger/pdfarranger/raw/main/data/screenshot.png GPL-3.0-or-later https://github.com/pdfarranger/pdfarranger https://github.com/pdfarranger/pdfarranger/issues https://github.com/pdfarranger/pdfarranger/discussions https://github.com/pdfarranger/pdfarranger#for-translators pointing keyboard touch 520
pdfarranger-1.11.0/data/icons/000077500000000000000000000000001463504064500161205ustar00rootroot00000000000000pdfarranger-1.11.0/data/icons/hicolor/000077500000000000000000000000001463504064500175575ustar00rootroot00000000000000pdfarranger-1.11.0/data/icons/hicolor/16x16/000077500000000000000000000000001463504064500203445ustar00rootroot00000000000000pdfarranger-1.11.0/data/icons/hicolor/16x16/apps/000077500000000000000000000000001463504064500213075ustar00rootroot00000000000000pdfarranger-1.11.0/data/icons/hicolor/16x16/apps/com.github.jeromerobert.pdfarranger.png000066400000000000000000000014671463504064500310540ustar00rootroot00000000000000PNG  IHDRa pHYs\rtEXtSoftwarewww.inkscape.org<IDATxu3-G؊m.cWImKWŶm^8+̳+?㾏e-C'=V0x4rZޜw=nNk&65/d ]Ƕnu[ѓObr ۭP޼rQR̟DnW6\ ScLBFUqBPؠIa+&ɂI[f<#)ަsȢ R"lNr[-nϠqR(E9K:U $} ͟Wl)+.]Ae]]`\#AJG0Yq)oE+b[a~yq~E6 1Yp,슛m7lI (t6{Q-xY2BbՋ5&Ss6$IG_*Qs1PA (#EL} pV+g,~m1a)џ>/W~ nD<~0=Tf"iy+xП8k=,żjl E,UQbP) 1>pAGhv7Q<i{gA9gD~OY8puCr;G^(Br 7v3'#XAc%NRnl$'Are-~WM*K0 17#PWڠT<2JDkVu{xWܖvI]]ugU=taFfLgPөʂTyB ^m]۝󈩾n:Vk{O]vpǚ-fTƮܑj$ ^L3mj;-fTьGznqTe*S9hh[Q~ >sv_15vqd\Vj0*fTk(4i춂ڮ3{﮾]SR *qz05\=z6k/uyn;Εg ~pSGFFAKD8tx\K .wm@^mn#z׋%vDW<, s7 d\cF.Ād܃ٲ8= " !Ⱥka$53=bwWa!/g^S~r_S6U^-mX OCZ22 ~i֡zqtHn/QiBU]/wz@Q@R`& ~!WuV_@ؖ@}Ӏ Km'yO&ܤ5 i̐ko<$b]ؙD}NfR[@mxg, n!pSǺbc ܛocΚM1tOMkior"7e4滸1w9+3sEIcG54S{28WhnAr):ن@Ic΍+L>~ ]G`>n4NWfӀs 7i r[RV]7\-{gt姙]عK4Wi*f\k+L; ]0h`isw{9zE_/ ޞƍ _L2?fY X 0 ;Aul\{r ~V ?A2-vVnCi0!#A*?G߭ ᆳkvk+m ;F oF?P>2hϢP)"sG>sPG X[o8l sm|ː`}MHYksp<φ7,:Ɓ=rӟLIGa(O]"\7>Ǎz39h MF?" Na$~€@H%6*}Q ?]19}Fﶯo6l ;iZk9rР3g B2(+GT 3I aU,BӶi`j-TS&p~`i}gu{Uv0)~?4P &h9]YB ro+nT`R8yˎ,ypg{vVҠ[C/j-wwQHAŴSyHC. OǍzd€rgNW ^aT \7QJPgyȕWJr[ 1"ʅ\pv?O}NdRϠ)AgBU>4 =&>Tt >7ۤ\<Ŧ  DXN6ư34H+dW; $UzǍ+I Syw)~?\ȂL (^;En|<]y`>y}7p`Qrx R(Zu8pW@% 0t@ѕ]N偮ߟhnULw+/,o7q}ɖ qǍq16te33UyZ DTy{΀URtmBbrbte)<ȍzrj!OAGY@Y@zdmLΫ#:6&g- |>PeԷ-qN/ sf.ETV‹;'wX To3yPҫ+ uK)u]){>7M;Xb>m3頜|<]= 9h1u]4o<>I <6vU4z^n){XsJM%e9nV|s> M} ^QDQ#>W_3/u@uzuY2jPS wMl0`ȫF+s?dVǣe6;๦MԎѥs#du:މ |{5m.6sGO{ԷMqLGP]KC %?O`W;Y 'G[HGȝyBKFZU=iAD6>\1"c0f;7oWU@,%b;x0|v N]4q[xqV*s+ĥ#TUBWR`xEfob+v& ɴ]Կ޵K\KqxBmB=,@ټJO[A{WC3!|P5n>SM=Y,MJ_qY5-wR٬:[\@4,O^Yѕ:s0 pqqu$QwIT8ѡ֠K<mᜮioX u|Eu<0H|\ys:<me V+~Tmd宛rg;vI ]@p57{G!Xq[w T5tt*[8;'D]`']@D<o:tpp/=N@]v-@{yЭJ-gazJ WC @:?xg j(gZu?Iv < (K9pAP- Aa{WӞ/оuG+o,ݸϚo;zRU*%9w9]'1@-X|fdշ`j\Nl.unvQ#݅L;Tc>1}=ъ0g‘j\#)-w8f;\YM:b̏k ͷѩV Mwg"r#!;C:wrܽq)Ǥ[v`-3gNg㲪$#I|G1rs)@#騁.`\9LZi_WL3΅rlu:W *1 Ĩ\?4HG-d!`N 7pM;z2foh{APE&8d˃p[,L gK\q-4(wր %h@\~r;%(.H?xԆKG:5b?:*^rXHCO7492Kc5(\Ղەlt fԅsm?Ѕ-A<Ǫҕ:nr,b)?rG :,<^ek|خc<ק9r<]>.!k7eF,a_nvHCj6Zt3:.JIxݫۼ9-A21O `'22 vt<jM۞79Pm1[nu߹Oݸ1B/KbL8p0oS졅n2K#w8 qR=ĻvE4/zK x:p0C%gWYVLuiuvs KUKUWbIiMK>p=.`tD| 4m)ڲttKlQu?ק)6fbi]R8p}@i:x|DM«FSP[z}%RXY} g鲡) p wS 7ݮ(*@[@jE,m{߆;J}֚ ?K\M!Prqcj^ }Zu·+1Jw5L]ܽ{lI`YAuN2«ξ>},3M.kf [x?w3#ߞ=~dr0 5ZS0\ vnvSx3 53,俕*b5үBP~oo7q}uv K|=mt/7jJiA |H[d y{U3mvgWX gie k6fկ¯'j&?n~šh$y yRnUHz:9~s1PlÏeoU) S<▍@M&qsFԠf87Z/U Lr- 8}B2M2`@Y?fJj9MO02%Rl Rzxyl'XP`(Ho|rʔ{?/Jq\v0U)~fd$Cwu.9a" 0 'ó,³߭ >m5x&c_$z~O\M/@=L3DW߮J6um K5 쿾 'ufdz9[if(ċL+L23io|" 4-Q0b9RY)^/| @BPЈ (DZrD]ULA("LV RoBPu5(,P]K57p]lCx#n4F]9 ;E@6kuY<~R=0u! .KMdYyH_>&MzFjpĎ@!W73V׃KVULE<|MŖrv:B*Ի: ۂ5LNNYFGjd؆M Nڥ'Qg\ 1"v Jh v{ ϥ. ; i*h^ua!@_ק[8%sY4IhRX S<ܩ#63JAs<BNO{PD'ېtobvV}硻xpÝ JV?QP^^=%~_[l ڍzCkp2 w]Կ=IYkr ׵, Uz 2B5ԏ{Y/v7ЂS@+YkQ`WOTS{OGB"YziJnCO.v8ȜϠTdr"TڇXU4o覯 U_]n~gP]HCsg:AS,p[7Nyb{cӀLdqxoc! 4ZU olܕL\"26d$PwI 7]_ğp0Sy`g8&g*j}K ՚IqߢW T b.B鯭'ԺsRS!q/}z@(#~&#5,gCMIJR3=yMՀAM(/㛻l`q4v:z7+B"NyNfP*2Rc`୊!,TKAGԖB\C5{lAn ɹVl_6g`8?bgRni!^a&|5 h'P@CHmӳ7w俛b@]e@hu0ɮ~>h>g `ۓ{5(Fy=[LmPg/;ax /ORmxo^{0k%R.<mWPA\ة!vtDqϽ2uJò ڳ0z::PbgY^[I bhHb:Νƶpwݨs 1@M+ <N!6篟iZ]sN͆&1w?nDo ݌ Ux_~n=k"˨J<72h F{6HA*ţ6{U܁OT\K:,  =]J `"7bcoew ՠGlq @rsWtO9!V x3o,GI/`sS`ʹf]6<x}v"i~f2-q;斟$:% ~9mf?P> ^aed.M";&r10j0za~Go o޷n蔭RY =)#iLFi#6b~X??;jjBO +ƢocEF,yxl?4Bz@C1(F%=c|@*9 oEi gҀ^hxo">w!H ZIRkFppoFYs`c;F`f9VM{@/H3}Xٷz+/7dHMEknԻ^yko2p{DNA:T rM*$SLW 58z'/Ǜ(!}0F2H%xt@}(p7F6"AV#\ BH`kDnj80zd"X)߰i7@Z}c'Bnׯ"r}ĝ@Ll/;.,ci(қ+:^[9͢үAP%lI:G؅ZTk@`eS4>-~N 'Bp,7*d>;>`׈ Feu"n`Z>IP{5sG0I1*"[\R,Ч93^Fex. hu _PQWγ_aJ֌/о'LR1,ka#0 Rȫҷf\kV&}*F^zƍ(8#R"S0+t"-x_ǬeRTB 9]@2 uBDZ5=lק`ɦJXvKGJ`n+/pT0sQ0 -@'VΦ^DF?=EY|JD8xu!a&Quu41}ᖻs"#piWU_|&Aja2 owJ?~hG8yKBW 7Kʃo 2.=ˆl鍊CX`ON)CahVpp\YKbٻT;e U4uTK+R* ;˝f/$ܬcA,ѹ OGƗYTY3r[3_zh=07q5]F?7 mv?Fr5:?^-o)[z+& \a\6p=u{ s9` Ya/q HaVz].|(nd4w;j4SǴs 3K/-wC_J_ g!ak[xͣ\%NI'jd9`K<vQO@ɚRǛf`wVi\e܍P$xcsr[];7qeUBa{ΎFh`Qpߤ'los`>@_bR5o5sXqP D~N@L <<'CPZ\cbe$h.vSY< V:ACZ9ԥiפ{9hhƸQ!&VRr4@c|zuШո0[Vͣ'Ҫy[~!*iI)dQ2g3Hp_I;5wٳӱc4Y]Af=Eyly!9>asWPF"?z5\1]K;?I"%qoBŜwZYJRlwVnag04S_v:r\A68}'`X&Uv6^E߷ٔqdx6`6@س jR%I5 {ZL_"dA/#3Ï$? &m ;-[w]7N ,Pv*c<`e4'и2NE8EX[T ? O;stw{4[1 d}\I6PJIKe(B '] 32Vh=/̹UoHݎ@V ,aFIENDB`pdfarranger-1.11.0/data/icons/hicolor/32x32/000077500000000000000000000000001463504064500203405ustar00rootroot00000000000000pdfarranger-1.11.0/data/icons/hicolor/32x32/apps/000077500000000000000000000000001463504064500213035ustar00rootroot00000000000000pdfarranger-1.11.0/data/icons/hicolor/32x32/apps/com.github.jeromerobert.pdfarranger.png000066400000000000000000000035261463504064500310460ustar00rootroot00000000000000PNG  IHDR szz pHYs'tEXtSoftwarewww.inkscape.org<IDATxVdA=Y'mm6ֶm۶m6{Ϩb93*2+$w#NvST4N]i78B#y$T4dQ 8 .AcH/aE&~yC:+&E{UpGp ^Q;@&L=%긌Zaؓi=Df:d[|tiAV~)R6' %]΃lF(h_E@1 g:>@K ɿHVir[0A1n7ý!V跧AI`5H~(IvS 7ӈ|G``n>MvC:)ʠyIb ˂vs S%G&& 3 Pq ϳбDs Gi;\ɪDY%8 '4#괝ǭG3l0C0oӿT+XɠoP$M $3e72=ݧ _͚[9>wqPwHw2aEQmp S@l9pk@^$/˭&ªepsr(ϪsB,0";63/Sn.hWv(J@jԠוg[M_?'EADLT2\k&•$,sl8}wycImKsPr&329Vu0q~PtgA|/w6+B`(µJ@.0k!?jϙPM'@m?)ӃHq 5,etTq]M}BS[,Ogas x߅D_a* |=$hi"HgrP\z] a]A9eח*M}d,0{ToCNn+7]%"$HH,s D (o4-,~p&$ .0f݋v9=VXD5vL!6e@Nwp٘ c54"$\b"$D'|:U60ZyKsLu[VШ01:{":GUH5>ȳf)/5t $k"bIkã14::ϫY+(,a3&ǪS D(`WQ8\<pD %iGRNi oy|+4{2qK,0mW;M#bYx`A"jJp߭ YZ_# x$NK;_F'΋M%Qs,&p^;iqjp q!/U!$@9H/S?Vh Iz9 JH^ʗ=?G*AyFŪ$Px8A| Fm aYtILPη~zBnNיTEDaT?US:<:<:CooWN&X?u?Y# |M  .\ jq;j]L My*SAlE6G&?WM.H@1H2"74RT"=QwEa eMkTHM(dSz`"d>ܺ"OHAMz\(u։s|`iqTsGۓIIǚQb0i.lxe xc`,i t&oh̰0w_'\^0oZB{w}$A܏-Rp G։-"dlIgF- Vde| ok"C^6O U՗!1^M9CU T&X<&3AJn32㶘 9}p{Ivc*I \pEݼ8>~A-ULsjjSgb)t WƁ; <,/ oM+WoC3oŘ|6T8<ˉQpq`߱9A߳_lD}DUةzX<6"p1#z~9@]Ia¥; vm  U5 =o$:; 7xm Vw#Pk1CcC)a']K2[mI8zin4&A. R.`p&5u@.'dm 4^L]NKH|b0<0 7fmt :"6G"%CP^ivH¥%W(usގd]\ـ4e*^4QD5 fqh=遛״>煆_ n.J5PUW7sCz2*И & nNmj7&p2$8Я 9! giw&MfG`N;M`Rީ_׼T?s6C[r*Ynk % Kr >bTefBvh+UXM>HS8vo|kϮl b5cWOkEEksK 눧|d-լޏ }%kf^=J=ڿ4xi }iv&fK3׻Z%]*\'\ |AOXg$Cr}qX.4op1H2EY28l1J |HĀ M_(Oׂ7SO|KHz'Iw5ND9 7)cIENDB`pdfarranger-1.11.0/data/icons/hicolor/scalable/000077500000000000000000000000001463504064500213255ustar00rootroot00000000000000pdfarranger-1.11.0/data/icons/hicolor/scalable/apps/000077500000000000000000000000001463504064500222705ustar00rootroot00000000000000pdfarranger-1.11.0/data/icons/hicolor/scalable/apps/com.github.jeromerobert.pdfarranger.svg000066400000000000000000000370651463504064500320530ustar00rootroot00000000000000 pdfarranger-1.11.0/data/icons/hicolor/symbolic/000077500000000000000000000000001463504064500214005ustar00rootroot00000000000000pdfarranger-1.11.0/data/icons/hicolor/symbolic/apps/000077500000000000000000000000001463504064500223435ustar00rootroot00000000000000pdfarranger-1.11.0/data/icons/hicolor/symbolic/apps/com.github.jeromerobert.pdfarranger-symbolic.svg000066400000000000000000000020551463504064500337340ustar00rootroot00000000000000 pdfarranger-1.11.0/data/menu.ui000066400000000000000000000463471463504064500163260ustar00rootroot00000000000000
_Open win.open
_Import win.import
_New Window win.new
_Save win.save document-save-symbolic Save _As… win.save-as document-save-as-symbolic E_xport
E_xport Selection to a Single File… win.export-selection 2 Export Selection to _Individual Files… win.export-selection 3 Export _All Pages to Individual Files… win.export-all
_Print… win.print document-print-symbolic
_Undo win.undo _Redo win.redo
_Edit
_Delete win.delete Cu_t win.cut _Copy win.copy Paste _After win.paste 0 Past_e Special Paste _Before win.paste 1 Paste As _Odd Pages win.paste 2 Paste As _Even Pages win.paste 3 Paste As O_verlay… win.paste 4 Paste As _Underlay… win.paste 5 _Extract _Explode into Images win.explode-images Copy _Image win.extract 0 Copy _Text win.extract 1 Rotate _Left win.rotate -90 _Rotate Right win.rotate 90 _Page Size… win.page-size _Crop Margins… win.crop _Hide Margins… win.hide Crop White Borders win.crop-white-borders Dupl_icate win.duplicate Re_verse Order win.reverse-order _Split Pages… win.split _Merge Pages… win.merge Insert Blan_k Page… win.insert-blank-page Generate Booklet win.generate-booklet
_Select
Select _All win.select 0 _Deselect All win.select 1 Select _Odd Pages win.select 2 Select _Even Pages win.select 3 All From _Same File win.select-same-file 4 Same Page _Format win.select-same-format 5 _Invert Selection win.select 6
_View
Zoom _In win.zoom-in Zoom _Out win.zoom-out Zoom _Fit win.zoom-fit Full_screen win.fullscreen
Edit _Properties win.metadata
Pre_ferences win.preferences
_About win.about
_Close win.close
_Quit win.quit
_Delete win.delete Cu_t win.cut _Copy win.copy Paste _After win.paste 0 Past_e Special
Paste _Before win.paste 1 Paste As _Odd Pages win.paste 2 Paste As _Even Pages win.paste 3 Paste As O_verlay… win.paste 4 Paste As _Underlay… win.paste 5
_Extract
_Explode into Images win.explode-images Copy _Image win.extract 0 Copy _Text win.extract 1
_Select
Select _All win.select 0 _Deselect All win.select 1 Select _Odd Pages win.select 2 Select _Even Pages win.select 3 All From _Same File win.select-same-file 4 Same Page _Format win.select-same-format 5 _Invert Selection win.select 6
Rotate _Left win.rotate -90 _Rotate Right win.rotate 90 _Page Size… win.page-size _Crop Margins… win.crop _Hide Margins… win.hide Crop White Borders win.crop-white-borders Dupl_icate win.duplicate Re_verse Order win.reverse-order _Split Pages… win.split _Merge Pages… win.merge Insert Blan_k Page… win.insert-blank-page Generate Booklet win.generate-booklet
E_xport
E_xport Selection to a Single File… win.export-selection 2 Export Selection to _Individual Files… win.export-selection 3 Export _All Pages to Individual Files… win.export-all
pdfarranger-1.11.0/data/pdfarranger.ico000066400000000000000000002040761463504064500200050ustar00rootroot00000000000000 (( o,r-ro,h)c&^#]$Mb' N' S!MT!\&c'k+o-qd,@g(m+s.m+g(a%\#\#\#\#ß\"\#:@@@@T#:U ~T!T!T!T!Z$a'i+p.i+b&@@Ud&i)o,q-k*e(`%\#\#\#\#\#\#\"[#\"wZ#3S"U!fT!T!T!T!T!T!T!T!X#_&g*n-k,d(\%@@_#e'j*p-p,k+e'^$\#\#\#\#\#\#\#\#\#\#\#\#]#f[$U$T!US!T!T!T!T!T!T!T!T!T!T!T!V"^%e*l,m-f)^&X"\`%f(s-}2233|1s,h(_$\#\#\#\#\#\#\#\#\#\#\#\$О]#\#Hf M S GT!U!T!T!T!T!T!T!T!T!T!T!T!V"`&i+r0x3x3w2v1m-`'Y#U \#ue'|0333333332y/o+f']#\#\#\#\#\#\#\#\#\#\#\#]#\$z["5UUR"5T"yU"T!T!T!T!T!T!T!T!T!T!T!U!]&g*q/x2x3x3x3x3x3x3x3x3r0]&T!tb&}133333333333333w/m*b&]#\#\#\#\#\#\#\#\#\#\#\#[#\"wZ#3S"U!fT!T!T!T!T!T!T!T!T!T!T!T!T![$d)n.w2x3x3x3x3x3x3x3x3x3x3x3x3x3s1Y#f v.3333333333333333332v.k)a%\#\#\#\#\#\#\#\#\#\#\#\#[#]$U^(N' S"DT!T!T!T!T!T!T!T!T!T!T!T!T!W#`'j,t1x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3m-] k)i33333333333333333333333|1q,h(^$\#\#\#\#\#\#\#\#\#\#\#]#̞\$a$G^$9T wU!T!T!T!T!T!T!T!T!T!T!T!V"_'i+s0x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3c(gw-33336mI_QVSWTWTWTWTWTWTWTWTWTWTWTWTWTWTWTWTWTWTVTRRNPINELELELELELELELOFwc;gx/W#T!T!T!T!T!T!T!T!T!T!U!]%f*o/w3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3k,}1334b^?63w0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p{9hqPVejAX*T!T!T!T!T!T!T!T!T!T!T!Y$b(l-u2x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3s1n.,33~6Lq=:63w0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p~4lsJ[hcF\~0T!T!T!T!T!T!T!T!T!T!T!W"`'j,s1x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3d,.r,33Mh9=:63w0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p1owCak^K`w6U#T!T!T!T!T!T!T!T!T!T!V"^&g*q0x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3i-x/3hH69=;<>>>>>>>>>>>>>>>>I_covFY'T!T!T!T!T!T!T!T!T!T!T"[$e*n.w3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3n/}23Fe6:AEEEEEEEEEEEEEEL^v|sT_/T!T!T!T!T!T!T!T!T!T!T!Y$b(l-v1x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3t2t,K353v7CEEEEEEEEEEEHZm]h:U"T!T!T!T!T!T!T!T!T!T!V"`'j,s0x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3g)Ju.3w;3vBEEEEEEEEFTieo|CW$T!T!T!T!T!T!T!T!T!T!U!\%g*q0x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3k-{13t=9EEEEEEQdltzJZ(T!T!T!T!T!T!T!T!T!T!T!Y$b(l-v2x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3j-W$Ctg+x3x3x3x3x3x3x3x3x3x3x3x3x3o.`@23t=@EEEFjsl;T!T!T!T!T!T!T!T!T!T!T!X#`'j,u1x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3q0_(L6`6_@oKS!x3x3x3x3x3x3x3x3x3x3x3x3x3v2f3 q,h33rADEELKc([$T!T!T!T!T!T!T!V!^&g*q0x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3t1a(N :d3Y>kG|Q T!T!T!Px3x3x3x3x3x3x3p0x3x3x3x3x3x3g,hu-33mKEEG~Hl,e)]%V"T!T!U![$e*n.x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x2i,U#Br2Y:gExOT!T!T!T!T!T!T!T!q0x3x3u2d*Q!=j4[m-x3x3x3x3x3l-|033lNEEwgk,n-g*_&\%d)n-w2x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3l.X$Dx2Y6^@oLS!T!T!T!T!T!T!T!T!T!T!T!T!R">l1W;fDwOT!W$x3x3x3x3x3q0z3333lNEIi0i+p.j+p/x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3r0_(L8_5]@oIS!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!I~BsMS!T!T!T!T!Ox3x3x3x3x3x3l1r.333lNE[`'g*o.v2x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3u2d*Q!=j2X;fDwP T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!R w3x3x3x3x3x3g+v/333lNEhk^&f*w2x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x2i,U#Br2X8bBsLT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!e*x3x3x3x3x3m-}1333lNEhh\%p/x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3n.Z&G{3[6^@oJS T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T"x3x3x3x3x3t1s-33333lNE\x\%w2x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3s0_(K7a3Y>kG|R T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Q x3x3x3x3x3x3j+5s,3333lNEMb(x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3w2g+Q!=j3YkG|Q T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T"[$e*n.w3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3g,Ru.33333hMEENw3x3x3x3x3x3x3x3x3x3x3w2i,U#Br2W;fDwOT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Y$b(l-v1x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3k-z033333XFEEEv7x3x3x3x3x3x3x3n.Z&G{3Z8bBsLS!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!V"`'j,s0x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3p/j+ 233333NBEEEKx3x3x3x3x3t16\6^@oJR!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!U"^&g*q0x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3v2[$r.p333333OCEEEprx3x3x3x3x3x3NT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T![$e*n.w2x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3j,ou.33333s,RDEEEGv3x3x3x3x3x3Q T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!X#`'j,u1x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3m,{033333_%RDEEEEw;x3x3x3x3x3\%T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!V!^&g*q0x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3o/[&H}^'x3x3x3x3x3r0s)233333W"RDEEEETx3x3x3x3x3s0S T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!U![$e*n.x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3u2d*Q!=j4Z=kH|Ox3x3x3x3x3x2f,#s,333331Z"RDEEEEdx3x3x3x3x3x3OT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Y$b(l-v2x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x2i,U#Br2Y;fDwOT!T!T!R x1x3x3x3x3x3i+w/33333k*\#RDEEEEEu3x3x3x3x3x3S"T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!W#`'j,t1x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3n.Z&G{3Z6^AqLS!T!T!T!T!T!T!T!d*x3x3x3x3x3o.}133333\#\#RDEEEEEy?x3x3x3x3x3b)T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!U"^&g*q0x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3r0_(L7_3Y>kG|R T!T!T!T!T!T!T!T!T!T!T!T!x3x3x3x3x3t1r,:333333V!\#RDEEEEE^x3x3x3x3x3v2R T!T!T!T!T!T!T!T!T!T!T!T!T!T!T"[$e*n.w3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3u2d*Q!=j2X;fDwP T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Ox3x3x3x3x3x3k)>t,33333}2["\#RDEEEEETx3x3x3x3x3x3OT!T!T!T!T!T!T!T!T!T!T!Y$b(l-u2x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x2i,U#Br2X8bBsLT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!S s2x3x3x3x3x3j,y/33333g(\#\#RDEEEEEDs2x3x3x3x3x3V"T!T!T!T!T!T!T!W"`'j,s1x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3n.Z&G{3[6^@oJS T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!^&x3x3x3x3x3o0߀233333Y"\#\#RDEEEEEDpkG|R T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!H|@pPT!T!T!T!T!T!R x3x3x3x3x3v223333333W!\#\#RDEEEEEDuoPx3x3x3x3x3x3^&e*o.w3x3x3x3x3x3x3x3x3x3x3w3j,V$Bs2X9d`(x3x3x3x3x3x3x3x3x3x3x3x3v2d*Q!]&x3x3x3NT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!S!p0T#@pMT!T!T!T!Px3x3x3x3x3x3z323w33333x.\#\#\#RDEEEEED~7lw2x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3q0_(L6_6_@pKS T!Q!x3x3x3x3x3x3x3x3x3n.Z&Dw3W9dDuLx3x3x3P T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Z%x3x3u2Y%?oG|T!T!T!n.x3x3x3x3x3y4v433333b&\#\#\#RDEEEEED0pq4x3x3x3x3x3x3x3x3x3x3x3x3t2d*Q!=j3Y>kG|Q T!T!T!T!T!O x3x3x3x3x3q0_(L5_6^@oJS T!T!S!u1x3x3\&T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Px3x3x3x3x2_(BtT!T!Z%x3x3x3x3x3x2߀@333333W"\#\#\#RDEEEEED0pq@x3x3x3x3x3x3x3x3w2i,U#Br2W;fDwOT!T!T!T!T!T!T!T!T!T!m.t2d*Q!=j3Y>kG|Q T!T!T!T!T!T!T!_(x3x3q0T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!N>l:dLv2x3x3x3x3x3n.T!T!Q x3x3x3x3x3x3q9 4E333333X"\#\#\#RDEEEEED0pw_Xx3x3x3x3x3x3]'Du2Y8bBsLS!T!T!T!T!T!T!T!T!T!T!T!T!T!Bs1W;fDwPT!T!T!T!T!T!T!T!T!T!T!S!x3x3x3OT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Fz@nd*x2x3x3x3x3x3x3x3^&T!T!P x3x3x3x3x3x3x5D233333q,\#\#\#\#RDEEEEED0p3nv2x3x3x3x3x3P!JR!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!R T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!P x3x3x3S!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!LH}w2x3x3x3x3x3x3x3x3j-T!T!T!T!h+x3x3x3x3x3x3333333^$\#\#\#\#RDEEEEED0p0pq6x3x3x3x3x3_'T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!S!p/x3x3a'T!T!T!T!T!T!Q ICuBrCvNT!T!T!T!@nt1x3x3x3w3n.w3x3x3u1X#T!T!T!T!V"x3x3x3x3x3w33333333W"\#\#\#\#RDEEEEED0p0prDx3x3x3x3x3t1S T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!\&x3x3u2R T!R!H}?m;fG{W$b)c*\&G|=iQT!PS"x3x3x3k,W"T!k-x3x3`'T!T!T!T!T!Px3x3x3x3x3x3y14X33333ހ2Z"\#\#\#\#RDEEEEED0p0pzN`x3x3x3x3x3x3PT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Q x3x3x3O T!R W$k-x3x3x3x3x3x3x3o/DuR Dvm.x3x3j,T!T!T!b(x3j,T!T!T!T!T!T!S w2x3x3x3x3x3x2W333333j)\#\#\#\#\#RDEEEEED0p0p0pu2x3x3x3x3x3T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Q x3x3x3V#T!T!i,x3x3x3x3x3x3x3x3x3v2T"Cux3x3w2W#T!T!T!X#h+V"T!T!T!T!T!T!T!c)x3x3x3x3x3x3333333[#\#\#\#\#\#SDEEEEED0p0p0pq9x3x3x3x3x3b)T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!j-x3x3g+T!T!^'x3x3v2m.e*f*o/x3x3o.R R"x3x3k,T!T!T!T!T!T!T!T!T!T!T!T!T!T!S"x3x3x3x3x3x30%333333W!\#\#\#\#\#V=EEEEED0p0p0psxLx3x3x3x3x3x1Q T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!W#x3x3x3Q T![$h+^&U"T!T!T!T!b'w3d)G{i,x3x3c)T!T!T!T!T!T!T!T!T!T!T!T!T!T!Ox3x3x3x3x3x3x2$3j33333߀2\#\#\#\#\#\#X9EEEEED0p0p0p|@gx2x3x3x3x3x3P T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Px3x3x3PT!T!T!T!T!T!T!T!T!T!_&X#Crx3x3x3[$T!T!T!T!T!N=lAqOT!T!T!T!T!T r0x3x3x3x3x3w3i3333333x.m+c&\#\#\#X9EEEEED0p0p0p0ps2x3x3x3x3x3W$T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!R x1x3x3Y$T!T!T!T!T!T!T!T!T!T!T!T O x3x3r0T!KT!T!T!T!P x2q0R"@nMT!T!T!T!]&x3x3x3x3x3w4U33333333332v.k)\;EEEEED0p0p0p0pq=x3x3x3x3x3j,T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!e*x3x3n.T!T!T!T!T!T!T!T!T!T!T!Jd*x3x3g+Q FyEwT!T!T!S!r1x3x3t2W$?nIT!T!Q!x3x3x3x3x3w3UU283333333333333xFEEEEED0p0p0p0pukQx3x3x3x3x3x3P T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T"x3x3x3O T!T!T!T!T!T!T!T!T!T!Bsv2x3x3`'Gzn.e*BrR!T!Na)x3x3x3x3w2]&EvT!Px3x3x3x3x3x3y373|3333332333333xFEEEEED0p0p0p0p~6lw3x3x3x3x3x3P T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!O x3x3x3R!T!T!T!T!T!T!T!T!T!T!Lx3x3w2W"F{x3x3m.M JU#n.x3x3x3x3x3x3T"T!T!l.x3x3x3x3x3x4{433333c&`8~H]$r-333xFEEEEED0p0p0p0p0pr5x3x3x3x3x3[%T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!S s1x3x3]'T!T!T!T!T!T!T!T!T!M`(x3x3l.T!U"x3x3x3x3x3x3x3x3x3x3x3x3f*T!T!T!X%x3x3x3x3x3x2. 333333W"[#QyFg;f;Mb'pDEEEEED0p0p0p0p0pqAx3x3x3x3x3q/S!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!_&x3x3r0S T!T!T!T!T!T!T!R @pu2x3x3e)T!U!f+x3x3x3x3x3x3x3x3x3x3s0W"T!T!T!Ox3x3x3x3x3x3+ 4J333333X"\#\#\#\#X"NtDp:.EEEEED0p0p0p0p0pxYZx3x3x3x3x3x3O T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Q x3x3x3OT!T!T!T!R H}=jx3x3x3x3x3X$T!T!T!T!T!T!T!T!T!Y$b(l-v2x3x3x3x3x3x3x3x3x3x3x3n.Z&G{3Z8bBsLS!T!T!T!S w2x3x3[%T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!V"^&g*q0x3x3x3x3x3x3x3x3x3x4@333333X"\#\#\#\#\#\#\#\#\#\#X9EEEEECo)`o)`o)`o)`o)`o)`o)`o)`s|Jx3x3x3x3x3l-T!T!T!T!T!W#`'j,t1x3x3x3x3x3x3x3x3x3x3x3r0_(L7_3Y>kI~R!T!T!T!T!T!T!T!T!b)x3x3o/T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T"[$e*n.w3x3x3x3x3x3x3x3x3x3x3x3x3x3f32=333333X!\#\#\#\#\#\#\#\#\#\#X9EEEEED0p0p0p0p0p0p0p0p}Vbx3x3x3x3x3x3V"V!^&g*q0x3x3x3x3x3x3x3x3x3x3x3t2c)O ;g1W;fDwP T!T!T!T!T!T!T!T!T!T!T!T!S"x3x3x3PT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Y$b(l-v1x3x3x3x3x3x3x3x3x3x3v2x3x3x3x3x3x3w3<333333u.\#\#\#\#\#\#\#\#\#\#\#X9EEEEED0p0p0p0p0p0p0p0p2ox6x3x3x3x3x3t1x2x3x3x3x3x3x3x3x3x3x3x2i,U#Br3Y:fDvNT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Px3x3x3R T!T!T!T!T!T!T!T!T!T!T!T!T!V"`'j,s0x3x3x3x3x3x3x3x3x3x3x3n.Z&G{4[m.x3x3x3x3x3x4233333_%\#\#\#\#\#\#\#\#\#\#\#X9EEEEED0p0p0p0p0p0p0p0p0pzFx3x3x3x3x3x3x3x3x3x3x3x3x3x3n.Z&G{3[6^@oJS T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T s0x3x3_'T!T!T!T!T!T!T!T!T!U"^&g*q0x3x3x3x3x3x3x3x3x3x3x3q0_(L6_6^@oJS X$x3x3x3x3x3x3; 333333W!\#\#\#\#\#\#\#\#\#\#\#X9EEEEED0p0p0p0p0p0p0p0p0p|tVx3x3x3x3x3x3x3x3x3x3s0_(L7a3Y>kG|R T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!]'x3x3t1U!T!T!T!T!T!Y$b(l-v2x3x3x3x3x3x3x3x3x3x3u2d*Q!=j3Y>kG|Q T!T!T!T!Px3x3x3x3x3x3w34O333332Y"\#\#\#\#\#\#\#\#\#\#\#X9EEEEED0p0p0p0p0p0p0p0p0p~Jfx3x3x3x3x3x3v2d*Q!=j3X;fDwPT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Q!x3x3x3^&T!X#`'j,u1x3x3x3x3x3x3x3x3x3x3x2i,U#Br3X;fDwOT!T!T!T!T!T!T!T!Q x1x3x3x3x3x3y4N233333m*\#\#\#\#\#\#\#\#\#\#\#\#X9EEEEED0p0p0p0p0p0p0p0p0p0py9x3x3x3x3x3R!9eDuMT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!O x3x3x3p/s1x3x3x3x3x3x3x3x3x3x3x3k-W$Cv3Y9bBsMS!T!T!T!T!T!T!T!T!T!T!T!T!d*x3x3x3x3x3y3333333\$\#\#\#\#\#\#\#\#\#\#\#\#X9EEEEED0p0p0p0p0p0p0p0p0p0pzJx3x3x3x3x3a(T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!l.x3x3x3x3x3x3x3x3x3x3x3r0_(L7`4[@oJR!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!U#x3x3x3x3x3x3/333333X!\#\#\#\#\#\#\#\#\#\#\#\#X9EEEEED0p0p0p0p0p0p0p0p0p0p|jZx3x3x3x3x3u2R!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Y$x3x3x3x3x3x3x3t2c)N :f1W;fDwP T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Ox3x3x3x3x3x3{52a333333_$\#\#\#\#\#\#\#\#\#\#\#\#X9EEEEED0p0p0p0p0p0p0p0p0p0p?kx3x3x3x3x3x3OT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Px3x3x3x2i,U#Br3Y:fEwNT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!W"w3x3x3x3x3x3x2`33333332z0p+f(\#\#\#\#\#\#\#\#\#X9EEEEED0p0p0p0p0p0p0p0p0p0p0py>x3x3x3x3x3U#T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Q n.Z&G{3[6^@oJS T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T"[$e*n.w3x3x3x3x3x3x3y333333333333߀3v.l*b%\#\#\#\#\#X9EEEEED0p0p0p0p0p0p0p0p0p0p0p{Nx3x3x3x3x3e+T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!;f?nIR!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Z$d)m.v3x3x3x3x3x3x3x3x3x3x3x31/333333333333333~1v.k)a%\#X9EEEEED0p0p0p0p0p0p0p0p0p0p0p}^^x3x3x3x3x3x3Q T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!W"`'j,t1x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3z2.3t33333}1m*233333333333}1kAEEEEED0p0p0p0p0p0p0p0p0p0p0p7mx5x3x3x3x3x3PT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!V"^&g*q0x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3s333333d'm?_6yE]$r-333333333xFEEEEED0p0p0p0p0p0p0p0p0p0p0p0pyBx3x3x3x3x3X$T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T"[$e*n.w3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x4Հ+333333X"\#\#T ~Ik>f:Mb'x/33333xFEEEEED0p0p0p0p0p0p0p0p0p0p0p0p{~Sx3x3x3x3x3m/T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Y$b(l-v1x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3m$2B333333X"\#\#\#\#\#Z"QyFg;l=S h)}03xFEEEEED0p0p0p0p0p0p0p0p0p0p0p0p~Scx3x3x3x3x3x3PT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!V"`'j,s0x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3z3A333333r,\#\#\#\#\#\#\#\#\#\#X"NtDb8tCU9EEEEED0p0p0p0p0p0p0p0p0p0p0p0p1px7x3x3x3x3x3Q!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!U"^&g*q0x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3y4233333n+\#\#\#\#\#\#\#\#\#\#\#\#\#\#W!J4EEEEED0p0p0p0p0p0p0p0p0p0p0p0p0pzGx3x3x3x3x3]&T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Y$b(m.w2x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3y3333333}1q,g(]#\#\#\#\#\#\#\#\#\#\#\#\#X9EEEEED0p0p0p0p0p0p0p0p0p0p0p0p0p|qWx3x3x3x3x3r0S T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!X#`'j,u1x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x33333333333z0p+f(\#\#\#\#\#\#\#\#\#X9EEEEED0p0p0p0p0p0p0p0p0p0p0p0p0p~Ggx3x3x3x3x3x3OT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!V!^&g*q0x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x33333333333333߀3x.n+d&\#\#\#\#\#X9EEEEEE0p0p0p0p0p0p0p0p0p0p0p0p0p0py;x3x3x3x3x3S"T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!U![$e*n.x3x3x3x3x3x3x3x3x3x3x3w2g,x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x333333333333333333~1v.k)`$\#X9EEEEEECCCCCCCCCCCCCC\x3x3x3x3x3b)T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Y$b(l-v2x3x3x3x3x3x3x3x3x3x3x3n.Z&G{4[8bj,x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3433333333333333333333}1kAEEEEEEEEEEEEEEEEEEEEt{x3x3x3x3x3v2R T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!W#`'j,t1x3x3x3x3x3x3x3x3x3x3x3r0_(L7`3Y>kG|R T!W"x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x32)333333333333333333333xFEEEEEEEEEEEEEEEEEEEEPx4x3x3x3x3x3OT!T!T!T!T!T!T!T!T!T!T!U"^&g*q0x3x3x3x3x3x3x3x3x3x3x3v2d*Q!=j3X;fDwP T!T!T!T!T!Ox3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3y3(3t33333333333333333333xFEEEEEEEEEEEEEEEEEEEEEIx3x3x3x3x3W"T!T!T!T!T!T!T!T"[$e*n.w3x3x3x3x3x3x3x3x3x3x3w3i,U#Br3V8bBsLT!T!T!T!T!T!T!T!T!R v2x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x4q4{3333333333333333333xFEEEEEDNBNBNBNBNBNBNBNBNBNBNBNBNBNBNBd{:x3x3x3x3x3h+T!T!T!T!Y$b(l-u2x3x3x3x3x3x3x3x3x3x3x3n.[%Fz3[6^@oJS T!T!T!T!T!T!T!T!T!T!T!T!T!l-x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3w3x46333333333333333333xFEEEEED0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p}Z`x3x3x3x3x3x3[%`'j,s1x3x3x3x3x3x3x3x3x3x3x3t1b)L8b4[?mI~R T!T!T!T!T!T!T!T!T!T!T!T!T!T!U!]&g*s1x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x5562V333333333333333xFEEEEED0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p5nx5x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3w2i,U#Br2Y;fDwOT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Y$b(l-v2x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3w3w3w2Vy65"2f33333333333xFEEEEED0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0pzCx3x3x3x3x3x3x3x3x3x3x3x3x3n.Z&G{3[8bBsLT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!W#`'j,t1x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x2x3wx23233w2333333xFEEEEED0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p|{Tx3x3x3x3x3x3x3x3x3q0_(L6_6^@oJS T!T!T!T!T!T!T!T!T!T!T!T!T!T!V"^&g*q0x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x5Df39 5D3333xFEEEEEE4z4z4z4z4z4z4z4z4z4z4z4z4z4z4z4zSlx3x3x3x3x3x3e*M9d3Y>kG|Q T!T!T!T!T!T!T!T!T!T!T!T!T!T!T"[$e*n.w3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x4x3U713UsQEEEEEEEEEEEEEEEEEEEEEEF} False True 4 True True True True False False Open win.open True document-open-symbolic True False True 0 True False False Import win.import True insert-image-symbolic True False True 1 True False Save win.save True document-save-symbolic False True 2 True False Save As win.save-as True document-save-as-symbolic False True 3 True False False Main Menu True open-menu-symbolic end 1 True True True False False Zoom In win.zoom-in True zoom-in-symbolic False True 0 True False False Zoom Out win.zoom-out True zoom-out-symbolic False True 1 end 2 True True True False False Rotate Left win.rotate -90 True object-rotate-left-symbolic False True 0 True False False Rotate Right win.rotate 90 True object-rotate-right-symbolic False True 1 end 3 True vertical True True True 2 True False True 3 True 10 True 4 4 4 4 True vertical 1 0 0 True end 4 4 4 4 True vertical 1 1 0 False True 4 pdfarranger-1.11.0/data/screenshot.png000066400000000000000000006073061463504064500177040ustar00rootroot00000000000000PNG  IHDRO$sBIT|dtEXtSoftwaregnome-screenshot>-tEXtCreation TimeSat 20 Jan 2024 08:53:42 PM CETG= IDATxw|?𗶷#' 2 #-Z([ --+a5lJ 3@B!gqキHeKv^O?|>ys''"""""""V D†I"""""""""k򨿒7LG'*ӛ2DDDDDDDD$ܞ@rgrƙu9:/GDDDDDDD4X9q&!䑻2I,ϼwsĐSz3赵%$!BPtOg#""""""",\a @BZ̙'{#ي!$l FmqHOP$[0588hX,  seNojj>iCRYF;X:5^F(=D\`;+_(F V BFDDDDDDD4DDK$Jehom;=ֆ ´fj^O&$B|kk"-_чD*R* 0QDDDDDDDDd t:45d yč78='7|~~A9Dp?9E֒ERB1:2tVkmۈȘD"J=vJ2{Ymh/#0r&Y$^7vܘZD"P`iW՘/6 q1e6o9AˉkN6赥ڶv2G3 ZJ:@߮HllKey҆61_*mHZN ]WPЕs1Ado $K.1H |@#'|p< h0N@P6۰=jyC} 6 ..LDNs4{OO @$;ǛbOO"""""J.L9C"Xns k6 kC[2z2rl#oV鬜)޶1K1xADDDDDtIbR փdmH|܌-6H0VސFt:hZO8{+""""" 6Zox{|$lnޞ@]lL0ǜcċB!""""Ab F$GFv^D֞tVyg \9{ڊPW_osP<Ѓyyc> XVD"6|c"""""` a=]ǖXK&[vPOi61,{C,cWW_op(an'ssLsbcW}USH_""visT*|ؼgv%aaaX8o.ݐd(ճx{s#c ic #[=le쿟|U_1=YW_E|dёlΗ>yYw_u/tu=MmVRV!)ى{ g`>~-0/&r3/ϼsrxߞ…"| ry;sׅ p-1G{CC1nhq-eSyӴbok?bogu!92oG|8Ե\F$|cΜ=_Z Lfgi*m!"w/({RMWԠ'N`YHϩbc'T*Zdn.f]>). Ԇ[vb$h\lYg\- «+pk7\i?^zUTV ^{tڻL` 0n,BCC!HPU]'Nnys,iTXTd\ !*28~$JʰmD"$'%\G2ƺ=r`/ }L[m4{cZ[m7G׋-to7nJ? >ۚ[[s4Ӿ(RmY0WF-2l.ȥj.Fg+?!}LCܳ< ƌƱ'!]O?ٯq\Rz/wiljomtt*bp0:1&m$~o봪CGd Wi/M@dDn߉Ȉp,{Vtd앙} qqxB@b^?f͜o 7]w!f~lY|p͂yhinAcM_W6Rt:]GM]c[n-֗Gkѓ'QW߈@̜:m~r9: Nke2V̹|ݍi#_ҽ?_?̺|VYҲϺOMNݿ~lݶs23-Ϟ=fL:S1nh<^ַ̑$7h={!&O&'#!>G]En?-wLIOǔ^ 8C;Ettqp{}^ Hg^|0,1YϽX~ޥ$ #g q|^g*{^N~)#ڬ?gDGE^goOg_FO&s' OȺz7CDw"2<QQ;))%ÆY\++9>صjjWX,/")q("#‘}ģi/^e@\L m*xX0*T*74 by~deARP}ti#qQl8Z/i64ƏCV<5? G7_\cǐS~i#r9~}~ccw֬Ū5k6b†5HHޓNAno iS굤s})i3&c8___F:MF}mm?sv1I rsOAR!>6GXtTԠl늜SP*H7IY  >m4[yrൗϏťxŗE%k/ھ*<ïF~p)i~:|v?x(x:qJ;-nq[k|˛Nxy%d2|:Z'Oa 1u 2gLY|q L70R¾C<|ax_B"࿟MxoLOTTV>{eVVUCbk&i[*/+IyW}YGyHRw~ڲ$ad^Guv$D";·+ 6_Wnx\Y]%<Ǐ$0}5iS𱿣MBQ FٜV51јi:>6JQX\ӧA"`8}OX۷{[#I"oQT\ 8a9cFEnOv1,ylɄ QZ^8\ino#O3>=NI%cg]wor$o*N@tT|%",N}:+ #G58ex1߹T*W]WL{qX8N7=N9R9GMMC;vDDxa? J/\L544<\wZҗv_""a9u@HeR0bx 2,9qfҲN_m|sk+ǎX"Ft'Tl7Y+7i/hDr9F 7,҂7m5P\Zfw앙4~8p(H8nIf(˻|ƴi}ڪkD*S{W߼ KJ0i8p%Jʜ|po܂3Aj}So 63<%%ehjmш0޿,ՑcGc쨞bWqRىC}ޛ=02?68}YNF9#T֦;]f#$kjnڿbdD2ns8*2ݱ`**w:oWmHVfr4L&HZ?|67=ܗr򔴟6mE]}=Fb嗣Pu0H؝GŲ<,,4O:jj!2< ^?>de. ı}RdFcF!<41Q1uCN䜂 HLpTFWGۗm܁& #z6^D~dVq-q0۹ҕqj𿭸rb`֮1tE?NIsFh_0$|m9Ϗ>¢"mԏ=)9H$M^c}#}x9~> Rud2n <4@ jyglۑgDZ/Fݿ I mѦL`2_B\""PU] E%HjPַ I"Of|74B \dg0+ư!''fȕMf7ͅ~GeAa!ⵗ^Q|m9?p 닾'voNナ6tZho P'-vż-\]_ot:*dxwſ1:- ;oGAѠaxJ2kjuzWϟY3/CUM-miM۶EHDnχD=iSQPj<ПjQ`-~{:ˑUFEHp0v7@~H2PNz7cάƽI8z#_ˆd%X8*tvv'b{Qi Hk>$'&`洌mڻ;CSS32&Mī?qm}eLy]?9{Uߎ>&<_{ """믽i'ssQZ^B1G=1cFC. 'sslqny[C[тȈ>kYe}YkSۻyC2k|4*ZZ>]dѧews Vcj&1IȺݏ']_ tthkiFHگK|No/)&ڜGVEɅc N>m2mQxs:+ ?:K IDATͥ/'^S X,X,vkcmi>ru{)כμS'EzIIխϯsMtwav۱vB{םV^1.ߕ6Z_cvq֖&#-adDK$K$O}tZ ȁ*jʁ,ts\wo<H>rhS xH%an"fg^A|2unleF GqiNcֺz1rD*n_t??_onM77d},26llZ,=xpv۱NFRȊ]jY~0Ya/rbw,'2{l|$F7)Ysy'WX S eg;TPT]oehkkXE"rr_(|HDDDDDFJFS}r?ĉHNNFSSBCCQYY6}xw HL&466"##GD"A]]~i{ֈ;wcѢEXz5.\@ѠΝC~~>?bڵhllDuu5&McϞ=x0l0Oo,]o6(,,D@@g̛7۷oǦMpw PT>}:*++_chll3sEvv6{6lD"jkkkh1TU9_}79r$A@[[Ç#$$G@@L<$&&"==O>$=IDd<صk:l۶ yyy={6󑘘+?8JJJЀDB.CV555HLLěo Zy桢#FX,FSSt:7M0}6oތٳgӧOGSSz7ߌ `ѢEꪫىI&aΜ9ؾ};rss `ҤIصk Dԓ4MltݤdZW&W#(D&u>aCǔ xЀK:rJ,Xqqq=;<>#ϐ"rK:}4N<[omKۥ~L㩧›o Dbs޺:+x l防?!G5ݏ5F7M0È.9"=cuT,[r}+Wt:"111K4 !R (//d2$$$""OIKKCZZ tBCC;84oXX^z>hp)iDD9 Fa sb2ำV\Í ?&B\wu8vKgxG__~8r/fcZΥ0""D󑜜l2Ml۶ ۷oO?dNkk+oߎ{@SS~[\6lM7݄L|W 4 }Y\~:u*-[fql ޽p 7V^mx ?2220yd$֭[gq: xG;v0\Fzɒ%DZ0aDD^Pɓ'bcc G/X ---8p.\`q> _~9 0c |#Gĉ8s ֬YJeq_}1a̚5 @)jGDDZ[[Ν}j=z4jvZSO=Kn!CyyyUYm<#A͕c2*7)g?=/J%4[c3^Z1^\DDU҈h@ J鐜 XZ#..FJJ d2jBC*8z(0{lO Ĕ)S?bĉرcQUUD\(//H$B[[QVVfx---M7݄ÇC*B,C,mmmP*HKKCKK r9D"$ t:bccRB,;@ee%4 QPPp7=-..Ʊc  䠰:s7ߌɓ'#%%رcZ- ׬Y7x+W?n&Lyy9 +봴%K`ɒ%„  ,cڴiGHH Vq6b555@@@B(d2h4jOƂ ܌ R HL\ZrCII DJTVV;'wy&M¡CpW Ddd$4 Z[[Q__?~Ə"ddd ''>>> CII BCCj1g޽E}}=RSSQ]]&clj'PZZ L>~~~hllDdd$?t477qqqH$JAII Jc LHHBO?nCll,BCCq9( a޽;w.b1JKKwݻw?0aDDBkk+PTT2 661118~8R)QPPC(// 8|0F:nvݻ+]J!**ƌ,477ꫯ6L?{,J w}&w=/0l0dff_Ggg'(j1i$_W_}۶m֭[1rHY  2338vvލgH$X|9OEd TS;wDFFn @}}=ߏ @ӡXx d 00_~%.2… ŁpeٳEFF=3g`„ 8z( CATH6lŵkbȐ!޽{  ˑ ????òePRRT T< ǎChh(҂&ر(((_bƍѣݾ7i"&1IȺݏ'Mp/?Ś~g}0hls1R  MNGJPTD"Axx8j5$ N:qAVzhZ( jhZNqP*H$J%bKT* A:bIvXlxNzK{Xtvvѿ_0k,H$۶mCDDjkk477c&5 k֬q ӎ=ŋcݸhZK7oaތ Rioϟq]waѢEXx1T*͛M6ax +{n\{X~=^SC x7w^^ ӦMî]h"sΌ]ǔT*5/鏳͛7~jH$P*}V?#bdH$h4dhoo?֟awyKh4}Z$AV5Bvd2h J 󷷷* bZ𙔟VL0y#ˡ ǜFYPD"D"Agg'W\"bҤIP(׏=GT̙33f|}Rgycd~FTe٢'N4\gYJZb=t}( dHDѥotD<рj*̘1刈@KK ۇQF!)) j>}:/bGll,:d;x Sf͚(ԩSEDDrrro>adFSSBBBhpyqظq#V" c!!!rܐس4񼶦GDD6FD.6܌hHR---HMM5)Hb隞B 'NUW]FAP`ذa8v $ 222eillD`` ;w֭[Ԅ뮻GB@SS""" bĈhiiA}}=BCCى ( ̝;ש1 IDAT͛7#,, Z Dxx87 <<QQQPTEpp09#F ,, "ЀpH$ԩS L&3jܹs{nr!??w߾}HMMEgg'⊾ڵ.Y?$g0aDDB@@6l؀ 3g ::ذa233;w3f@@@jjjP^^TJ:u QQQƩS@ 2{A^^ZtvvBqPUU,L<"Dff&ˑ8" uuuJhooGVVjkkg298quuuHOO/$$''"eeeZ!aiӦ0=Ht:$&&֭CJJ fDGG#!!7$%4 QSSH &@*HHHw}HR9sqqq$H999={fCAAJ%piU7gΜxb@cc# 'ODZZVj )) AAA(((@qq1pm!$$555ؿ?BCCtvvB$HKKCvv6.rjݻ Zjj.\@QQN p #3Ètέ)Zcǎ! Ɇ:V  HaAVƂDD0$j[N4j`<~~ }\&X_vH$ 1\T*]>_Z[[ uj mmmkzG]Q_)JZHRxz 诊HJs$*q>ch45OIP~~~K"~?ӏxLc8dhmmE@@4 T*.\#GzoFcDPTNػw/.\rOC)4)K8L =0~li#ccKD+[s9V+?a]Z~…@VV655!99xO;O^pz=Y~dW7__%M~$0Nt|}} flJ?MgYZqq\x1gםq93fw["ס~>>>.GD4X0aDD®]bBTĉCkk+t:j;v 6\լp@DFFP6;wG\\ @II  Dhh(F'OÆ /R)|}}qqǣ*  Vqmܸ;s RRR\ZvHLL֭[Vnkgë9sIrrr2@ )a 2#u@tmkk}ާNkVmVE $2|^=ݟ!gZ>}_"+GݻWϛ7jP(ڵ|Z-}}}FZ----ƢT*tE)++N>~RPPn'&&F8s HJJt2{llقlFjt뉎'KII ٳXbbbCt:2331͗|~1{lϧA%,,@ @WWVɓ444`2HIIfp8 i2DFFFLL ՑpV2e ߏ"""`0Hcc#fDjj*ݻ &>ƏϤI裏HKKcĉ⻓|xt… )..+W;0o&O nLyy9aaa7@ZZgmN2222_dUaϞ= %m6#++n>^QQ@bb" ;vtR8w555B/s:u*eeeQYY111l߾'ׇZz^TUU!// \.񴷷p8 ::ǃV%&&Av_sfҤI8NŊuuu5MMMt:h4̜9sX@ O~z-8{,f̙3,wR_m۶)))a˖-p8W`͚5رcbFnvڅJbΝeR[[VehhLΜ9#51ikk###BAEE999 Z[[iiiETܕ 2|V+*C@piZ-v3}tjjjHHHĉ~(((GSSJL17::cǎ Qf9dF}}= F:uH, 555X,rrrl|> ԐѣGQT̘1^O]]zhii`0IOObprL2(ddd4F#cneϫOjh4p^vPZ-< 2`pP{vh4 ^,X $T*N"""ɓ'ӓΥhp8h4[$i@HߡTJv -+Mo>/_N0d߾}\s5477+?5558q;cXM6~^y}QfϞ<@ss3\s /2g桇a?{*? `4y'yxioowa9rdX< 4i< k֬AT288"RV:8⹺WOI!ޔ_w.5 J#~? ;Jm\TP*#UTt:"y^(jBCD:^PR{2&]NX4x^$YNSe˖ 1dff EX46II"RP χFT[#Hc4V*J]*>>US_ bjЭlTTTP)+z$ TVj#wB~$`0(z#wx<t:~L򙽋@cc#o__Ga֬Yڲt5Jp>vM4vO4BzgGTýYx('3*/"òr0īrzzzҜrXF2222!\Ls`6v, }nj/4wr@YN>͌3M"'Iaa8.33s~͛ƩSxx7ٹs|DEEL0L:_|{g}ۅDwѓO>9,ԩ?N8z(O>$/zd.z(vw1R˸9R\jۡ}cɭDqV:.TEBZſJ&o=ԏ{LJk"S(cҤT"/_&9^<4dU%?$}'aXvȶ{vqv"߱4BVǎB L2l[us7 WT~;CǮX͡?gdd1X̗w}~8{,V'^Օ}vx1߿233b#ddd ^{5Z-gϦ ֆn`f&L a6 ?~瓜jin7 , BllX4466G{{;mmmtvvr[o̙3q8Az{{h4hHJJjuaZ9p QQQyضmyyyB$`u)->777/ظq#I8y$?űmmmL:uX_8N6o<,T"E:B}a9q"#0KĉBw(66LB (r%TVVR$&&HQ(XVRRR7ѢEسgF˅ ӉnGPPPs=u]GOO .dΝ"+11vH Az{{1ǿ\N:`ɄFe`&㉌dԩTWWrf֬Ytttu]GYY>|nJWW7p̘1>S200 =$͚,梨\V+mmmX!GRTT //f͚EUUl6z=۷o^~}9vFFUU& Nrr2x^goAVVL0V!LUaaa3n8233_VV7o񐒒Bbb"x<ՏE0O8Ndzw^~vڅhd|x<YYYAl6e…DEEaZinnfݺux^, &CdBVo>KVV$&&b),_3 |љ7o{|y F222W6ӧX,L83gExx8]]]( bcc1$==JǙ3g 444BII aZKMM NqQQQAee%DGG|2w\JKKaԩ8qBJffP(سg Fx^,ё#GX~7# ټyUʳ>ˑ#GHHHf%""j,X@OOǯkQz"3[ww7wy'̙3ݻwO?fq83f2r AQ~>6m+ӔzQ!}~Mƶmۈa6)**bҥTVVp8׿8p8طoL0!>S6mDDDPPPV孷d2pBt:Ǐ'..Okk+&L`׮]\wuL&6m4̀yQ__!cǎnܹs4551m4̙޽{ ̘1V>lFŹs(,,DՒş'RSSFVuVRSS1"Sp8ͥ2Yz5痢iӦ ]EEbBkضmIIIX@ ØL&`9aX#<<\JJJjٳgESSfbQ[[㩨`ҤIjZ[[QTTWWMZZ^OTTij߿ ?_F)FÁ @=z( z^=z?.ƍGDD466X,t:1߿^ϔ)S8}4̞=[C&N;l&!!N':u*%%%,Xs ӓ"ye5Fep5#!=J~~>. J5LD2HzDjÁR)(& ٳ%K鄞V畮IGtt8tyyy?^H)%Z-.uUqA-[6l{[[x^HLLnqOS<Ϩ&Mb˖- rm1c J%uuuڵI&i&,\ DDD0m4;_Ϟ={o>0aowCDD0gN:ʕ+yYjvJJJp\:u34B.vT*^Ph(d4i lhZ:/]~sTz=>O%|>Z-v0L8Q}^a!$T/H4c pCCn4$}$II@BJ8q⨺%]6 =IIPAӉW:\_>p84Ξ=#;;RSSE?ST{ږ%2O>H:;RZXE`>%eI3RiDDD 'B(#AISHf222!~{aڂ>0}_~!i---"$M7ɓ'3gvF(//K,rk׮%%%EٶmCCCh4Ӆt\qdڴi,]T+ ۹s'Wܹs$%%a49y$3gd֭vN' +xضm6 ǬY7oޘWs55ddddBK"??[`> 0&ih4֭[75WCӍyqqq|ⳤW2T*K78!|:44Ċ+d_...jjj!--aboxgmS*?jkkCt:?Cw}a^"/FVۙ4iCCCDEE]ss6^Pc,/!6SKE&a)OcHߑB3#/TMk-1r &{FcV+z@oZ]~#PT&mJ5{O2rL'.E0EʍՏ.E{2_\GHN>͜9sp8#{nZ-x^ZZZ^#G`@ dbhhE\\f%y~OΖ-[p\\s5 ٳgzDnfVXɓ'KHal6z9rիWS[[˸qfnT*Y`gܗN>U*O<:7nd޽r-X õ'xB|`0 /u4pY,za^/w[_xLJ/XQYqedUFaDFFP(X,$%%a2ؽ{7 .$55֊POÁF!++G0aT*JJJ믧`0Hyy 55#''FFPPVVFEE`Z9s DDD aYYr-X,z{{Yv-Ťv))) ^OWW555,_Z޽{v ͘ @__===Cvv6JRj7Vn73fbω'Xb8NJyy9:yHII7$%%+WrqƏfpp8bbbhkkc׮]"{Gjj*(Jf3OfʕԠP(8q"PUU%ǔ)S ' !r$OիWSSSRٳdgg 1\.J%&Mb޽DDDŃ", ›5,,jJ% &MDuu5@9{,+V pqbcc1Q__ڵk9x |>q:444駟2{lv%{ Lkk+hZGRqzg_ggd-55uTVAV+rssLSICCYYYL0aHbƌTWW `0?M7t߃I&P-ΧP(\]jv^/>HFFkɓDFF)t>֮]`Bc}tV׋^vm6ۨв+ /$sYFhqI/"y/ 60IHp8?>_=ZVh) j5֭^3&MBRq 7NFF UVɁRPP c0 |[{yjOYf{" aXf1ydN'v*CVV8 JESS\.jkk1DGGzn멮&11-aM0ۍfZx-\j43gΐB\\g;w.jZ.VIG"_).<(CewwEFIrr2S^^NNNe_Ott4c TUU]v2_ d̗͸qㆹCoNZZ:|0s=< F?y7GV@ti^}Uo [n3w\n:JRj57t[la`TUUņ 8q@9si&?gUӧOOGGNGGfZSL"O:Ųe())+Wގ ֭[QդrARSS$22DEVll,9rxN'mmm0e***KܹI^^]]]tuux|9rɓ}555TTTV项nԩSXsaYt)o&h4" RYYN'Od"22ZJ%z^|_}}}̛7Z, t:"<<˚D|8p!n7jLkk+/b2!55JEll,8N֬Y]wŎ;աqqhll@ ^GR*D^/tvvRiA7 RWWGww:;; c``.X,A082_ RRRXrTVV~ݻwѥ~zy/;adGyܹSw\}#/ bBgF1 L60jkkl6x N'ja-BVaT*T*e %XjKRe4::44 ŲeXt\rBIRt:Q*# .|>4VXAxx8. ZWF`X?GyC$Fu]'tJRLN'Z,YBWWXVRSSP/7tFK+ {1 Rj_{I}'PPP ~$@ ƙ\їu:jZh#t:\.*JEDDp}t:줥;ߏVR8y$yyyrH(4 qqq|GhQ!×ٳy7ۅo̙3?S<.{wsq 300 'WG6/ \s5sa ŋmYYTTTbŊae].[nG+Vi&~ӟƍyb߾} o6'O7m֭[ٰa?O?ܹsx^Z[[G{=l2~AYY`zd>RvPIFk IDžzsj\Q BB]h%~XIr!Ѕ4H.긔I\F>C`Hz1og/'MH&N@||߽VR M -W$͠7t#/OCP ###EP .x.// oTT>[9u/:ēO>)aÙ:uz͛7f}:fժU v1 Bp000@ `鴵FMM ƍ;;;)**b``z{{h4"%))@ @?ɸn:::󑞞.S^/ĐfBRaZEb0hkkh4bx<(J4 999<.aCEEE,X3fFݱc*7m'\o~,\Pd` /aÆ ;wK.>u ---;v W_}W_}U{wXlk׮e,YiӦ1#G1 twwc69{, L&^hjtwwdĉЀV%..JV(a̙ O`0Hnn.|>EZ\{Yd ">>Á"**2n81.s֯_Ͼ}`ɒ%x㗑 5kEKPfϞ=JGN0BH333G2CC.TGhxX$$$pI3nܸa5(ʋ#ddd RRRHKK^{4&Lr9&MѣG!RRRJFfnF{北 tuuaXCCC LRR麟ɓ'3c 4 Ǐg۶m"odd$ƍ#66}a2PByPYYɪUi={6, 7t0@9sFx"Ilڴ_|׋m-PXX~1g[ow=?~<wydK/aXu[n% ?'طo.?<'OGe˖-dnѣȼyp8|'DGGϹsX` tuuv$66FCMM :`0Hkk+x* L555dgg6ѬYرc7J%tH.\HCC z&Qrr2GT;%..`0Fa„ 曄 ç̅ F222W .DRb VX!Q FȂ h4̟?ĉjh4n7~_-]Rh4h4rM7 ]`0HXXE^/dggQ*l61akQ*,\^ϼyj(JT*( E V{EDMG}Ĝ9sرcr~{__Wb  ; fv=uV6oΝ;&##CB/_/K̂ {;`՗dSXXH~~>aaaòI: )S`0xQTIzCR{p\-]R6-$=ʕ+E(O<M0sBnpRXn8NS"kJ$9l6F#VBTRXXᐍE22222222l0* <#5?B'c饄jmR%VTWB}#Y6GA F222W8hhmmETäIdժU=zTH!^e˖qQ)22˱X,$"##466~z:Bh4|̞=痢H/_Nqq1`IMMjۋ^'''{7LxR8]2mڴ1D=*Dz bJrH!8֤=hqCC.78z(qqq477̙3$&&bE֡C1ydV+!!??]vqRSSC]]&IYV)..&))IW*477|r6oinnfhhEVV {1uTn7))):t }}}$$$P[[Kll,* JE[[]/;wVYlΝCKDDΒ%K(**"66˅L&@!1~&L@mm-̚5ZF#NՊj%33FdddxHLLb륾~L9|0qqqt:4 rQ22222GUU@`XP:::hkkc̙W݂V}}=nO R[[ԩS/+?`$##sUcN'IIIDDDPVVFBB'OӉnt:9z(l6ikkQVVFKK p+pa:JJJX,_bf3 Zx^QT QRRBbb"> :u%KP[[Kuu5qYrrrsI.\/~2_l6ǎr&s2332e ]vHdd$  BD]RQ]]MKK gϞd2HSS.ӧߏĉL2*z{{IJJ@ CjEOO'NtP(سgfAꨯ'&&,VUVF. L}}=6bccEThϧNܹsٻw/|!|r9Bzz:Nfb шlJ磣Bbb"j2gƌB@_zv:l6¨`0pcW{ NQQј?1¾N`0HWW~KzYbJnGRqwhPx<j5:!jjj2e `Z&##CL*"##dvFaa!pv*ʚ IDAT+)((@p׳n:Z-'O&22oY趨j]RK\qjE]q QQQW e/   ͛``ǃNmVBR YjZASSA nkh4( Xt:vjQ|zH^`0HCC֭zedʔ)|?e?z(yˮc׮]Yf5_v=2G2Nj~3 Ξ=;`zrgB &&ӧOj*, H]]QQQ8ؾ};Ǐ'""BAGGpވ:uTF#EvD:;;IJJ344 !!&.]ʳ>+2j4Fٳg"''ZMCCaaap8p\l6͛GCC}}}p\ĉ222tf^/NvbܸqSPPDeddddfϞ=455qa8@YY?8/sd2? ʺuXjܹsc6E]~w}C5k6lsؾ};=۶mFnQ #ihh`̚5k_̚5k_{ԩS޽Vˍ7(<%^/o6G!<<OW柁l0*j?[h"*++ gܸq׿8z{{nS^^βeTWWrp8&<<&V+~!'ORfQTTʕ+9}4MMM   GPhZ:tHBwqQ\^D@DŊ" jTlaHSMbzcr5M1c+ZP@D@Ta ;]=1y^b̙3g3;3yϓHϞ=СRtqvvxxxP]]㔞/ܼyS0r \]]ͥѣG]z8Wȑ#̘1KKKQ*,\ Nll,g͌7DaB_fÆ sϱxb.^h$xN<Μ>}Z?㏼;TVV믳`LLLªD$Ν;ǠAu[nqyJERRpYӿbcc$<<ƍ "4oޜqvv N>R$88:PZZJII )))tЁjlll8s !-lق (JQ* ОӬY{˗/S\\-͛7XYY!HLL JKK)++DA_pppYf޽4i%9wwwV^7?~oooq9994i///n޼Innmnn.YYY#A" )**ŋNAA 4iooooo?<{X~=>>>xxx!H/BӦMyyy8::J4;v &&hO>{Ѯ];]Ʋe/駟ΎիWn:N:%Ld4cǎѭ[7Yf ˖-رcsfϞͅ }߲rJ{zA~pwwgʔ),^֭[3x`rrr={6ٳ@Yh}Pc,2d",, +++yQ[ A4<L& 077G*bnnN˖-155[[[@֭FT ]tA*R]] RDDDD0rH!RR7D"$ * Tʁ   oߞ>}PUU% B㔝M>}pww'66V0?~ȼy }G{8;;j͍\^z%K-رc#FEcܹ4k֌ÇIBBgƍ,Z&M0zhd2-Z0jC]4ydN< pSj} >LF>}P(2k, FAkjjQ+**077:OzJʌfEZMZZG HRT*4mqw`ooϥKaxwww @VwD>szŕ+W0∈j+##cֻ.55ǩShҤ UUUDDD0k,>c>bbbׯ۶mc„ lڴvA ~W&M$_YYIff&fffT*;Cddd/ҿ|||صkӯ\Bff^O>a8;;d:ݻ۷/P3I٣G+`$""Dkz~ѿ(˻w.3333҇Cվ9 pTRիСCʝﮮB>`ccCuu _'$$ CT^^^GsvXNrr2|WѮ];㉈_~aq]vx{{)--ۛ3g/+V`̘1x?Fza;T*w$'' }Xr%Zv믿η~K۶mhv up C"w2Lft-m:}OðF}\OPpߵmCW(kñᶆ?0yR^G QCP[?I?EkFƢGL&9<ݺuCT"8vSk,LJ-[RVV]$򗐝Mii)999jh4[u5jhffW^[[[222ӧO&00PӲeKHOO7j rɓ'3n8&Ο?OiӦ ;vs͌3{T*W_e͚5$%%ڵkE>>>ۼ[2T"!HDDܹs\v [[[<==)))lpwwTWW¥KR._L!++ P*xzzVپ};^^^tЁK.FΝ9rEEE`mmMQQ :ׯhˣy1x`{lmmׯ2LZ-͚5CpiT*nnnhZqwwG :HNܺuK(qP3UۨR|Μ9пn޼ə3g ))#G u7w\{=h***СPk!L޻HҵkW\a7b/_ FHRRZ+++n߾P\\,x]`Μ9#xR]]\.ƍTVVBqq1 8::\.GVSTTDNN`iݺ5yyy$%%ၳ3UUUBNƍ133#770vIqq1ݻw333찶&??_ XRR&&&ّ&&&ѡC>OZZj)++LE~:ҸqcXyyyGAA5̙34oSSSZlIyy9V DBzz:d2r9H$大pss^ ۶mCRBʕ+hтFqG 1gF˃ 22{E^^^̝;sssʄElܸu_| t6N*bnn.x7nRɼy8wdddVjF۹-'|***7nзo_Yl=3ݍ Wyn= r׶E?HDDʕ+\z[n(illlhڴpStP(}6NLƯ.\ڴiCZZ}T9q@Me{{{JKKQդL`` 111d2t:ܾ}4A'//iԨ8;;h055X׹o}cĈF@̓FeeP~#щ'%!!Aھ}eggGff&P`:u$lo>bcc7oࢽef͚EBBݺu3f.]JAA9t^{ sss222زe`{]7nKȃ{nu$''s%Zj%<%$$ (++uw^>k׮h8wZVk޼9"$-- ZΝ;͍s$KөS'AlϞ=ӭ[7 qvv&##NGbb"ݻwGRq)t:aaaF[w"##Cts $77K.Ѷm[j nBѭ[72339{,NNN0wFظq#NNN`nnNuu5/_ >Jn޼-28OZZ%%%,S͍P]]`_"xgVVD&ПRݓ޽{qpp0zI,//gu2C-,QsK?C՟>|a9z(ɉÇAǎygԽرc&L &&AOއE=#'}bffBFCAA/^4 ?3DRaff 5za,uǎd텗0+++PT899ѻwo1332N /$hT*,,,LI7o$00+++!ۚL&#;;ft\4mڔLZj뱷ƍdggӦM'|bt 2ߟ3gPRR%ڵ~4jԈ7xC3X&&&2f&MիiѢƍ0jC]Էo_Μ9Ö-[#믿N\\׮]R FԩSH$ry)++RIӦMuFXZZbbb"=Cuu5B!茙 "{{{BAΝ@lllݻ7R]RVV& ooo$  N:accCIIpN }j5aaaӶm[Ruqq12LЯ4h#F~BBB011o߾T*t:rNGUU.\ݝNu B2 }YT*ѱi333AkMP>?\΢Eܜ\OXbYYY4mB!hp 9r7oޤ]v𺧧'O۷uW_εk֭?UUUrmZ-M4A"Jdd$/''' tϋZH"K,--! j& ,YĉӧSLaeiѢQ"=O~6E:DPYѷQѰwÔ}cUۘcl8|) j)o޼9* 1cpy|||j1ۛXt:M˂LjEYѰ~zA[OPP/_/|cmmLƍK,ݱ3lll odee } cލlԨv;vMkB&agggiߗagogx> n[{##;v</B\.YjgShh(?/ڵ3_ƍǜ9s8|0z}6E:DNC/Dx611 JuEz qF˩IF;SS:-[jAx"u 4rn޼۷gɒ%tڕ&Mp5JKKDTD"Ãdt:iiimۖ#G%fffиqcmۆ BhTEEUUUj133֖Bppp@&=TTTcǰҒr^J˖-y&k׎B2d}ϕ+WPW h4T*\\\PՂFRpp0m۶TTT H͍u UŸP(!''[n1dbbb ŸV'JEvΦ ())o߾\.p^^^k׎ҰiӦjȠGDF[F& QF􄆆}||b„ uƧ6[""*#Gdҥ;=z Hj}6؇W^aʹk׎ rss)//7JL8ΝK۶m!^{5Àݻ7DGG3`6os F""""""O!:t<sss(**"33gggbcciҤ '{EѱcG^͛79pM6ٙ'Osq54 Z_~Bx\UUOϏdIHHݝf͚ b666XZZr-RRR uhժU ʮ]$((K.Ѿ}{*++ښv!JIHHe˖HR~w ۷G"9n"33{{{!LvժU :TJqq1$$$။ 7oޤbسgM4ˋLquu%--vލ=&&&XYY+/^رcxzzĪU&%%|r9xxxi<"wƌZnp}hh(f=2F5 IDATb N< ,?~\nuD;vȬY$*6m%٥KΜ9ڵku]t_fҥDaV5kVM4a֬Y0x:lޞd"""4iP͍Yf ^z5kB.g֭[Gll,ܹwww|||ls Fn|L >wÿ9h cE?#l;o?yx)Bh}rZ-R  R/ҨQ#7o.K$t:W^^mee%fffXZZRVV%EEEFܾ}d2 +++!PH*CfF`ee%Z3?j#2r92 FCee% b‚>GGGpwwG*biiINN;w@***!CPYYJBRqpqq!-- VfffQ]])r\***J,:z(~~~NP@@gΜ!// ƆXo\.gϞӺukv܉ TTTP]]-ܺupө&..Sq|vڅRyڒ?~`5kFFF͚5#++0n݊#tޝ<,--Jّ۷i۶-RRIYY\x-[RRRBii)T*qSZZJ@@+W___\\\8p:u4Jr;&(_tQFEgñc{x,$''UDy#TB"L&իqq233ر#VVV8::)iiitJѣGqrr]Jח .PVVFhh[pu8s ~~~=yyy޽RSSQ(ٳ www֯_'(JbccFP鰷';;___233LUjVKzz:fffcnnNҒxښÃ}qMwR? ((333?0o}LF(((E?Z:ɓpeAٳyEEv;;;dyy8<<}:֘R5jn°ƌ\.W^(JRIUU$&&ҤI033 \F 4jRSSi۶-=z0 ;+,,Ņl&L@aa!2A011k׮B <<B!hI$AwAйsgr9~~~j!\R2=3}E*bbbBHH eee>t""w4 SN%-- ;;z܉ e oߦw6IaNFdK~$W( M4GDy M0\oQIָqԩOP>-%:ۻ e(vuҥ~H_g=>z{{_;vZښA =N Oj {www@Qq)bbbh߾}^O3 iii|*" ߿ѣG Ǐsg}ƢE{Fii_G͛2eRdm((({'K\\ /]0=I#x)..pM:w̦MۛL! ؕ+Wٳ'666\|'''ȠSN͛7ÞDD$t:SL!11KKKΞ=y0rHƏ{$"Eu5YF H#DDDDDDBӹu7N?;wFaiiɯJ&MGRGFF[Xlll(--%11|)((@Vy45pBZj{b׮]tؑ˗?ވiٲ% ,`֭ 2v=.<"DSH߾}T޽; 8LFyyڵIpp0( R)UUUXZZR^^PiEDDF5zdQQQG?F#hJXGGGaNի@M>4WD>vMrr2Ps5ᤇjfΜIHHuքl2._L`` /"ܹ}ajjʘ1cڵ>O<ݻ~:666x{{3vX'!!`jjoM8|0XNu1o[[[W^m۶wʕ+\zÇ /P#V|qqqA"ܱsssBCCbܸq>|ÇGW^y}{?K.#jZ0H/Q:-[9Z-cȑ "DBhh(W\!??J믿n5ŋUWWo2t::uoocџEii).\`ѢE3o޼:/yWE? d:u]Ez5j='Odر?Fĉ|85cصkݺuݻZMdd$|ɣ9{QF}:NNN"ɐJobذa Ǐ… .h 0tP<==>#Gr#ܺu+o>99'O2a>gO7mڄʕ+DGG'6lyFMP#ڦM|}}>uѣGJQQQΝ;<̯]h]||`zڵ+IIIdee1yd Bرcƃ'$$gp>z?gϞO>!))IXB޽jr,Y¡Cmgܹ3Fp6/ **J1{l & b:_p.^י4i>pYYY̜9Skұcǿʶm8LFF=Ojj*{a$%%+--%//<***lC̒bhl$88ƍA1:}4 .4h6m] Æ t:ё͛7?t"a$""DfM/BffwS]Y:ĉyjDFF2p@.\('$$гgOBCCjR5Ǐglٲf„ L2޾_$4i<@2w}dffҿf͚e$6x'Y~ " 5;7oѸqc}]!lmVXݻp႐/`РA̞=+++d4iR }x×6}ٽ*322^~~>`ffAAANIbb"ŸеkWPT!BB "ɐFH$"ĉTVVRZZjgϞ=|ԩSիއ⡵qvv}={Vߌn-Z 00x#ZBBBHLL7=h۶m}}l @7o}m;x`V\I||rJcTޞŹsf IOO7JM6888TKU\\999,0m y뭷}h+z<)++NR_KHHȟav&×iyQR)cǎ2ԩT*˕+W8{,3gk3i$XdaaATT{Օl6m֭[>>u꺸ЩS:u769;;78u44">HDDa &ТE *++9z(s%55SNxb3222d3 ֬YHW/_t|||'III,]ؾ}{`"##  ;;׳`mٲEHNLL Zև2zhl¸q DDDٺu+AAA$''5k֬12۷Opͽx"!!!ɩSm[PWz*ƍ02eJ #V/_^t邋 Ō=Zhߟ_h۷7ؿӧ6l`ƌ<߿T /ӹsg,Xʕ+4iRe˖ѹsgƌ#ajjJVV͚53FVJ }]`/d5CG}$x 6LXgccѣ }rJ #aH_#ի'NӎAd'qA֭[G֭ȫOUUGaqF#c!#G2<lݺ-Z0m4!oƍڴ9f IDATiӆۓ A#==Np֭[KYYYA*2tP/_.5mڔ}hhٲe2d׮]ˍ<*epjח 6md$Z⭷bڴiaJ.3p@~:7mDFh۶-P3;ܷo_K=DcMyy9EEEu>7o$))o~w\]] TVVrƻXd'Nj&A vSSS@!fmYh}P]]?Asqu>IRzbnޜkҥKBf>}УG;oU<[DDDIG0y"Xz5'OfBNcѢEٳG+**Ą*9BRR;vI& 2+WҥK裏(**2)--r{ǢE 1H$FөS'\]]yװgڴi,YڵkZ9sիWR거`ѧO:vԼXwQQQꫴm֭ۖ[ߵO7n$;;^z Ɉ֥KB&o1sL֯_o'ף76n0ZUUqttO>wfxxxеkG۩"<<'''JϞ=]vj6lǏDFF>n}پ};>>>Bel_ (|7]ׇXAϝLL&M&"L}'شiS*lKCk{666ȓN2+8h4(|Pz=DDDry#7&MĎ;J888вeK7oN۶mYp!֭y|駼꫌3\yyy߿_gyt҅;vyf~ں>>>;v#GK,M.cmm]g[L&Q& 7+Va,--:t(-M Y:&O?eڴiT*?qlmmpÆ ޞS mmggg=N&?bff&E֭aΝaee_|0`w5cOPٳ}6Ѥ=RZZJttAq5"##5j#Ͽ/"##9sQyff&,ƍDGG? / /رc3f W^E`8ONJJQP*k.fϞW_}%3{(&M^2ÇHZ_VȺuyѣ̟?_W[@( &&dxPՂdCԖxO ߚG<^Oww:i+B"0sLfΜIii)VVVut^z6<<<=DmۖVQTufTy:f0̢ŋ)++S'66N;0+L&ҥKF gil߽{:#GPTh4:QK:6mB9p@ gΜa̜9o/i iii׏'zj7o^Ru b쏚?(+x㍇n/$##ooo*++ׯ:uzL">SWm8ٳga0HIIa۶m:ud^`4C򀚐{I p?gg::BPvZ&n͚5wx8t| т^SmR)ZuŰPDi7|]  F"""O%2 L{\yy<[D—_~Y~}4Ν;xDGGӣGd2}j4Az\=׮]cǎdeeqZnMXX/NIII={•+Wo\ sX[[Aff&[6ANѣ<'ԩS9|z% ={PPP@v/}&GwwwǏԈCǎ9}4H$Ο?j=zt\\\ݻwy͚5ٙ<~DGG۷iڴ)-Z9qS /0p:cƌSNhZ-[kf?1W^y͛7k acc#hRRRPgR!7˖-SjINN&!!\zS9sf)^^^ЪU+㭬WT{ _Je$#FPܓֻֽ_]FJcHDDDDD)%==ӧOөS'F͌3ؾ};uf{l۶ml۶|CFfffƒ%KxY|9߿?c„ W_1a֭['O<˗V:tы5۶m#66VMtt4III׏:3h {w)RPX^ $Ql5M1ލ J` 4 Ηk2̳wfܹ3s>gĈ޽PD jr! ̙3x" ߐ֭[7"##}ݻwfԨQڵ gϞamm-2Gi&8s XZZ燚t???˗ԩSEB&Mč7ضm?=[[[xb,X@x"٩S'ԩ#D>>fff <}ͼy(L&N$ ۷ҒVZѠAԩk׮Uj0k h4JMMg~tRض|r޽[oRSSc̘1 "!TREx#h#DTTTG俍;#F(Rg &\)SDgϞd2'-- "~rʑZcܹld2ZZZӢE JlDDW\AȽSSS)Wqqqӿzٲe ڨ]:Q!jG%١F^HKK1cAiȐ!͚5޽{<| L“'O}޽5kPȹsRJl۶P<ȩSINN󤥥رcqss4o&]RJ=*ȵ_8s K,!..C":ErR)ӧO^zfԨQs1X`G-Uފ+7o_0ҥKŮ]cڴi~#G+/^\l]vҥK@~Ȁ&M9W\@/;;[i(ełWR+W"^˗quuO> rJSR% \,!ȟݻcii  +}t߾}lذΝ;+,.*_"&K< Pn]ƍǨQ6mNԩSL>ѣG3i$jԨ!xҼysƌСCqppcǎBE9'''/^b~}Μ9#ĉnݚq1bNJ  6oތ==<>><{6RTIffBO>|Ra]^^"** ˄+=Çd2<==?}xx&ܹ{S F={ٶFPsss=Jvv6ڵ֭[Ү];2228qℰܹs^4-ZYf)?tPŠAHNN,[6Νcƌ<{ȍwΝ 4HHKKo߾@LѣV___"u&&&ҽ{w{ncIA4hPoÇ믿޸ܹƒӭ[7vڥM=e͛7>DKKX:99q kkkF/r!!!B}Ǐ\߇}5jբW^:tTZ4:t(eʔaqy?б? sE;@sʕ'++I޽{ lvUdsҦM#dl,<|MDNNNUҧO?̙3OKKcĉ:wrDGGOݒ044D*bhhHDDʕ{yq˻WTI~)`\eddd1"+K$u\t ''75GA}K.ѹs"TXSS7C!j}$Fɑ#Gܹs1"""o&22!CPL~nx...nNNzbٲe,_9sgLz*#Fb-ZDdd$;vv5 ;;;V\p3߷oÇs 6!ʙ3ghӦ gϞk׮@~B:u066̌m۶1fBCCYd ~~~oѨQ#=*ܹsi߾[0F<))&M*_ۗ_~s7_܋q ***6mFXTRuuuwν{#==]77R}ڵCOOO733Ç3rHʗ/򟑑?ٳ9wϹs4ڸ1{l"""5j-aÆ@+}ХK rJwΠAoݺŰað l߾]ҳgO<==x~'wL&cڵt҅Çs5 1cƌwC*D"ѣ>}ZXOjccc6Μ?;w0h ֭ΡN:::ƲdyPkooOZZk׮D9r$L0PN8A ۷`@*###/_qgllLN8v6m޽{Xڵk|r֭6>>>^C1sLz4իW@wtt4 ,(U:u x!{zd,[ fÌ3RXXDE.]m___[m9q'-[dǎ%z\R0ݻž={زe C ҒTY>'|н>C ߟǏsMlB֭ٱcBX2jԨݻM7 6А&M`hhȷ~K@@Æ clE *hkkSlY*TNuiiiQZ5$RO/ryϸq5j;gMOOgݺux{{Hw5|DWܹsZiR+׮]o B.]Ca8v͚5CEE3fЫW/Nӧ̤wV"0rHÊ7&&&k׮qϏFѣGO+'N‚+ Cr. &LBZq9^^^\|]([p!̚53tPlI?3899h"o{_ٳg̙3$77ݻ3zzz ^ ,ø2h Bpp04i҄u*!p={XڴiCڵuޝrqڵ"3Zm۶0x`سgXYYѤIN>/D__~ccco>;wKf-"/L=x"ůUV@æMJ5A& w3t~و!i"""__FWWW:]]]TXL011f$]]]֭L08&Nk`aȑ4mڔtttطo@ZHw-OEvpVVVvЁ%KЪU+6lYf4nXBbb"Ǐg ֌7cccٸq#mŊnw)vqq˗#13\Bll,6mBEEmrM j͚5<|PQ9Vb׮]GF޵EJAf("~ 7n --jժ xhjjGTTckkϹvقQ` ?ݺu#$$SSS:t*`hhHXXϞ=#)) SSSd;v$::۷oSlY5kFPP`FZZ0^~=-"**JSSSJ*Ɗhl-*ѣYr%O-[DEEM#''Ga-R UT)v}l+5% իWW`+WBYWVjUmmmwߠ} gJM(h(wAA 9'ǂԨQ5j WUUZj eS\9ڶm+|nٲuX8SA???<==y&-["O2e`Νܹ(Q ~ݻ"##INNFGGu SNeԩ%f͚[u֑E\\ kQ&l jժNe˖)M*!gԨQ5!SUJh۶0diiVԩSɛK[[ؾ*M{۷/˖-㧟~~$O /_r^zuׯϹsPOO{\||<%fO̎;oeĈٳ;v.;w槟~bѥR-PPӂrfQo޼ $&&[Ə_ƍl۶ ȟ)={6[nחTwPۗ 6?177gx{{ 3@w!8~8+V`…ӢE ^~-<ԙ3tP###233y€hhh(\'FFUU:`dd$SSSҒcǎq}A_ښaÆQ$nҤIXZZ2m4444'((hR#Gp5nݺUdر#7nܠ|OXNj/AhEEEX/yU Y?ˣFtt#"`ڵuD]]];4$%% U&d[P\ km֬]d.hS֗">TUU/LaýӧOÃaa̘1%%~(!C HMMMʔ)Ô)Sz>ri,޾}{|||Jiv+;ހ8}4[nE&O?$f F ..2 6lؠMpp0;v|7e˖"u5"puuEaŋܹs[`aDDP9 mhEټy3#GdŊ_-Zΐ!Cz H$~7lmmqrrA2sL/^nb߾}JS~Ν;Z*?fܸq888( 83fYV^ͷ~+<6k֌$?.d|+Wƞ &Ŝ9s}HHH`„ ݻWifʗ/OXX/^{~5k֐ǚ5kCSS}L:1cp)uǏٳgvvvzժU̞=T*KF-c…̜9SIMddIbeeř3g5<~cǎtvrss9u>>>%Nl$$$ 7D555oOeȽ Rl7u)ۯ8̆[6/\^lY ߥ^9ʼ_@\x 6JŊn 8]WXEcQӦMׯpR JS""uuuN>:5k֤N:dddɢEʊm*dsЩS'FYL'۷ojժԩS]]]4iTHSWW=zp z]hoA\DBITT'NdΝD"aٳG!Zqxxx%Da|CCC133Sؘ5kRR%Xd 7n$,,ʕ+SjU3g˗g߾}8::RF ;vȑ#TZjժ|xTXQ4h֬p9f̘t20<<AG_b„ \x[[[n8dZh""""_;ʦ$\T ,5@_fio.?[vvv9rΝ; iD mmmٸq#+W&)))S{na}2d{:u C?uϞ=ԔLTTTpssczOOOJnn.>---UF0`iР8p{r! RJtؑ0`Rc{$##+sssy5e˖"<ߕ4rss9e~www }"==ψ۸r>\x{b$?t"""""""""P*7oTVNi&<<䘘 b333V *U]UV1|f/ u߿|~ƏϽ{J`k.NJtto1~x+@!TT"o!,,"b͐=::f͚qMȑ# 8nBMMƍK1bng4DD]1T?wSD>"_Djո{.;3HDpA8r.]b̘18::2tP ԃohkk)I CC*TP+Bs7@)<ص;vL>NbΜ9̙3//>/iӦqY^?s>= ,ɓ'""""""""97n\rKKK&N(|gС>\hqq֮]`T bȑ,[e˖9rvvv899qMfPL}j*lll5k\vm۶a <`ĉ(Ϟ=F~:7odĈsUbbb矹pvvvs-4.\Hqtt<Rp.׏d26l@>}8q"?3ȑ#B-[`gg#ׯ_''''''^|ҥK9x ^Z<g={ƺuZ>x"ӧOÙ|Ȗ-[Xz5111Gx6Ύ*U{nݫpN"_bHWF&M8x .]bŊ@~N:ٳO7of۶m_ǏӳgOҥ ǎM6p]2epcРAhhh믿ҹsgqssՕ2vXׯ'7nё-ZpAiܸ1weɒ%0aV1<'''oNjj*tИ9s&UV%WG׮]߹>WWWa L={Ɲ;w066@OOÇpBϟ-}{:tѣѤI1h07nwѣGJϜ9.\H^^DDD(lcggݻT"_+WdҥPuff&ӦM7mڔE`jժEnnnuЫW/֮]mΝK׮]㯿b̙X[[ӻwovEHHetttۛ/RZ5BCC9y$jjj|waA'iŊj ȟY|9fڵ?-ZǼyuU09rZlI6mPSS#//2o<:wLf&e <ӧI͚5qsscԨQhhh`ccɓ'_>888pIZh7'OF"cZlINNcΝ|Y'''ؽ{7F___NWXAZQDDDDDDD}x9DFF-xļ.\PY:##mڴ`,S H[BI޽9''X$ /_T8BԊ \t [[[I7acc}H$p>|ҥKcdž ʕ+KuOh0Ht### ߪ*SNhjjЦMZZZ ξu+W&$$Gr}^xL&f% ͣ_~l޼@bbbѡe˖ 6LS^=:-/RBM*WTJVVVuv҅5jгgb^^SSS!6@VGGGXgddDjj*wޥiӦ ooo@->qqq*̴βRR%ĉ>|85kGGG*W\FWWƜ9sطo/^o߾lܸ#Fƍ:u*Ǐ'((nݺ xbv0fggǤI{.QQQ(?'ׯ_W+dTUUTKMMlٲ ̜r "HTRTWH$.LFnnn6?yQv999{>%Qq)XlL&KR}"ի3}txBŻr9gB9n-SƩavv6{ȑ#swZXD[[HZZZE&Z=zD>}dذav6(\2ePQQٳgԯ_ȾD ħDqºGf%lٲ 6:6lȪUPu&")(_իW'55/_ҤI}6ܾ}Zj ͛syhРqqqb``@DDTR}}}@GG ;;/_E6mHJJ˗QZ5TUUȠulܸKKKRRRHII!//5jcddD||<~}Q~o"o{QgnP]4h'Odذa,\zѴi"r oׯY|9۷ogРA\~]a] >QV&yEEDD ڵk"##dRhѢ7.\`͚5E$&&3gqB#''ӷo_ʕ+G.]Xf 2]tY`+WfԨQԭ[Ǐ.6lH``z1oΝ`oeҥ DBΝYxܹsiРN {ɓ >X=z4VpڐdDGGN`` <{OڎhڵkI_vԮ]FqAn޼ PDFFrMW^̟?WWW1b{շn:hٲ%vvvdddp!Fɶm>HE> 32f7n'=~\\ܺu#F&fNb9s ;v`H$\\\p } TUUK*v̨Sʼ,Tc;yyyEE>/ɓ'Yb^~:X[[~2e nnns}.\& >wV?s `绐/gΜaĉoou-0n8ms888vZAȻq rrr000TJrr2wESS ɫWΦUV$%%155EEEʣG033ԩS n޼IBB=zӧDDDвeKRSS"%%ƍ.T^ڵkӶm[N ?uVǕd|rh߾=z1m4֯_T*Ą:_~РqƄl///"##U>|LMM144$<J:tӧ5[ה§BW} Q\} z׶lgJJ /_gϞolSI$%%ڈ"yRv|iC>D%&&]$4Ӈ|M| kJeMl ЫKK^EVhpFaΝ;qE"_|p2225j/YAQQ]tA"ʗ_~ɰaXhYG~ x4hyyy̜9'N@rr2;vՕ>cf̘ٳRX׮]i۶o߾rHӧf^{5AD؈VeҤIeܿ%Kpa h4o>q(&dWQX[[zj$ 'Of׏<ڴir < 77)SGJlB 6dʹoߞZj… i?LHHP*~˖-Zܹs.׳xs}vƏDAnLi׮$ WWWwwk*c̙ :ܛ|V… CHHs̡G\r9VXƍ+_p!o\pJZK.ٳ )))NGvv!+3z{ѬY3ݻ\.K.DFFT*h4qaxzzT*'''j5>>>:u 6lH||<$%%ѬY34i4hЀ|\R)hASN85TJ\\r $==Gѭ[7._,$f)..ԩS۬^mꊅ6mARpqq!&&{{{J%J2dnݺhZ(**nݺdeeNZZNNNЮ];9… ٳ'%%%=zS\\LNNNm""""'DsFղeΞ=Knn.~~~3//j?~8#)) BAPPC`رc# &nϞ=F1yd݅/_NNN±CݺuY` YYYf;0󄫎=>qqq@μQ(11KKK1[`tej5ƍ]v%,,̬ȑ#|2_|ݺuȑ#Ν;+-SUI&qY RXvrr2tҥ̹HbՕ}!Æ ɓe͝;ٳg`3PJJ C ԩSe,\06o,,߾}I& e^}U`K/T}ѢE^{uVth01clݺѬ?L2%K"ƆK.QV-`F߾}c DC 1e[.J,իWYp!_8''$$`aaaO?1|$ Zr=믅HV܄ߗ/_f5Kpp0K.\|} u_~efϞͭ[FQ]n޼ùsÇ/s޽{ 8\FŶmhݺ5\p@9t萰^OƍGxx8GF#_|8p={l2ƍ^gϞh4-ZD³kHzzzEDDg1n8֬YCӦMͮ [[[RRRBXRRR*mST2`6mĕ+W$ -‚~G&LPX!aooϱchԨQ ٳ-ZTh1W(::XfM7&C%11{2 FOɓ5FM0׺c]G6ӑzǏ7N0T*ƍWn9?ׯ_79r;v_r^xAxqA/̎; c᫯`ӦM̜9l,qf̈́Q"n9NǎJJJ8qp8YYYiX$솪j>#O.7 4H0I$5kFhhE߾}ej%t:&OLLLLm\˫y "beeUFaÆf#z8]Ɩ-[x饗1b~~~@.ȑ#Yti 6zTS hт>:7 ,`ٲe{+BxxBGtЁ .m6$88'ҨQ#3apR)K.֭[ܽ{ZFׯ_J7:t@ddh07o=ի_8}`,7;GBB*Jaa (wƔ3gVi,2İa*-sΝrWe0k۶mL24l4=XǸ6 cTjIeZ^ӕ߸qc7o`oժHFj0blgӵ% joJR_6בz`il# @tHDݻ7͛7/,C0zN̝; i޼yL0RɎ;׿%S n롡|w駟x7)((`ɒ% <:p31111tܙl.]޽{wضm޿|ԩS}1} >|A1}td޼y3f̨VXHUaڹs'[l!;;Lkk׎!Ci믿Haa!ݺuc̞=,֮]ݻgߟX!Pnn.K,رcB 4@ղb WA1}tzD"Ϗ5kPXX@aaaZ666Bߛ'N0|pz='Of޽'PW^)ܹs+(..&<^|E~W¨]6Rw>`Ϟ=ZJH۲e <5BЫW/ƌCjjp~Æ [{JťMILLBUѪU+6lP CUmzNVM6-׃JCE=c׮](J+FD"AVӪU+.\ jTJZZRZjByzuO?DquuLJݻwP(_>8::bmm͵khР=zEi֬JD|}}ܹsM68pl|}}hZѣSω'E ֭\.'33S0*((@ڵBF8DPдiSbcc&;;,ӓtHIIk׮|7?#;;J%XZZ׮]cРAܹs zŋ)))AәyH$oPN1a`(..6|9soA:ux饗MMMtS,--ٱc )3f Ž%KС>ڰs`}`B IDAT&[^x-[U\m۶e֭®NPPjbС@+WhݺumTŋYbG)|Ç Dr1 c턅T*͍Tڶmˑ#GhѢlݺ{{{zͩSH$rr9J;;;,,,HII!99P4##h7n ܼyzѷo_Z-zG YYYd2Ҹx"ݺu#77+++,--y/_ 00Z-}R4 NB`aa'00ܸqCIMM V+UsA9pkΝ;bkk˹sҒTJ%G.ӵkWʊǏ#2d'22{{{ NNNdffbooOjj*\v^zETT;wɓܿ=3;.]J^;ɓ2d>g })))t҅oFôi8vL8 k999|l߾&L`ȑBr@@!AFF/&--VZdɒJWnܸ6 Ĕ)S̄׮]K .0sLΟ?Yh0z>}ZH$s4jԨΞ={R^||Y/C\ y饗6m/vvvL>,2"Pjz2ܿׯϽ{*mgȑe܊+ĮCn""a03g{%22=ˋ͛7 ׋/;v̙3 ׯό3<૯"..p.\`^ڸІp8SCҥK9qPƍXZZ铌1sV9u 4Pzc͝;wbզÿ'VVVT* k4rssyF< iaϞ=y:LuL5j{Hc֍7 UVXXX0qD*kL4W_5;jv}fi"5+x[999Tj޽;/fԨQb믿NMTStYfB@ʹ( 6ozӇX5jĠAt\pwwwANӡR8v={n$''m|(߽{7;v{7QO>f̘AQQ:u2,HOO'=='Ow^6n&v0]ׯ_oKI=)w-R=zp]1o<233>QQpd(Xt"Խq#GVb G0zz5GyYgtǰaÆe7FـΝ;֭4i҄z\MQf Tt㍭)VVVf TVe„ >}Ǐ2С+Wnjڵv,L~~~Z?ooo>S<z,^X?~< .$//ePT¢tޝ a<  @Tk.~mj5 RN6m=#Gdƌh4Z-})e̔'FСC0\zڷoٳx"rsαiӦj= OŋEc_@FŁpqqޞ7ҫW2F%%%r!VZ+w#<}F!!!znNGAAR-A???t:%%%rQqtt8;;SXX^j5ѨQ#!4&44TuA"RPTRʢ4"77LF >|HII nnnz3ğVZq)Μ9cn:̈#Q_fرhJB؛$AJK/͛IKK3q.\C+W,c0k;44ÇiѢ3'{yrDst?33JUsyb ~?5W.3gf͚ř3gܹsڵK-ڹs'|'emmm&TnjUB"" SnȜعs'YYYU14h>ETqF233)((^zs:$}ܻw 3({{{Kjj*%%%xyyt z, )nnnZB@"гgOz=F*hrؘ.77\NϞ=R!^^F1qe2ݺu֭[@HH0B x#VE"c5 BC"5ĉ2]xJcLQUyw^ӬY Cˌ>kzz:}]R.4GCzifя=bرZ|;u$ܠQ7 ̛7ݻӽ{w>S~ͬfnUY $زe>##_L/""".~j UKKKVXAtt4ڵ\Θ1cj/?G1l0ƌ4lؐ3gPXd,EݤԨk.IOOg5ևH=®RBB7R|;vrR)K,ᥗ^JuGEEѭ[7T*GQd2`1b| z/QQQ,_\裪ɓ'l2߿Veذa4j{{{^ZJUc%""ץN: 6Hhի4d26mJxx8...̝;̖-[>c߾}5"ρ h K.쌋 z=z$-7i҄ JJJCTbeeEAA呔7666HՈĀ5k}Pz4}`.W_>cΜ9z=ѣG(J֮]+ gٲeL<^ϑ#G͊.V5=zLrǎ[&ۓߍs>nݺ4mڔ 7n,6&0:tC$''sN9Bddiw)I&R=]Z&??{q-R)~~~Ԯ]bn޼I&M8vΜ9s[[[ܹ7VVV",:tHX6z ^.`mmMbb=%%%r Jܹ777222;ru4i"[YZZbeeEZZZB+C"pU$#sN>M͍֭SND"ΎgRV-رcԪU g̘1c̴7tZ.WY>|8'NJϝ;GHHX?̚5>(߰a ,̜9_UZRT1`~gn_ FϑO?P-Z˗jԩS'2{lΝ+=ޣm۶,^ n⎎ߟy晹L4.\Çkf͚1~xx aagggdܬY3]Ʋeˈ$==oooFѣL]}5k&(J4%$$Div+? gɒ%Uswwgԩ 6 adxxxoo"ΝT*֬Y;DƍR$>>FuT*SNB`@&qM0` Bӧ VT*e r9m۶E udjJ#jwq g:u*Ps-pSaU/2rψ#\ӑJB]Ν]&ED~/8qqIWWWFéU֭#//֭[ y\-8p ͚5BA---5clR8n~9i$lllغu+hт3g_I'&LdFL 2D5f޽) ӧ"|ҳgO>M_DEEl2Ν;'SN%&&FSOOOD~SҒ22wȟїS wEn=z4...\xJp) S񊈈ʸ3iҤ'ӹyݻjqtt輵5˗/\|rϢ$""""""A4K.|>|Ç)͛ʹDDDDDD>Tē'??84iR筬4hJZIR:w\ȨG!""""""F I)/M6ѢE2!gggƏϵkDDDDDDD.TjD}'dee=8+ݘ)..~kiiiU'tR?Q ϬVj_ HB ưa"99b\]]F&ynZFTZI&<|RIbb"r8 ٳ'Aaa!Z{{{ tͩSwrBѐL&C& f֭N^^^/ԩS,N81cشiu!$$JL&###L qqq4jVKnn.IIIB\NCĝ;w@O?sN&--\ %77jlDDDD,#*qqq"TDDDDDB˖-ٺukoݺE=+~k׮yg+o IDAT;SD:w ܉';v,ׯ_? ٙ-Zp1E.sA z\NFVKBB...PRRBݺujSRRѣGqttՕwb0s l$ od2ŋqss???,,,r  jظq#NNN5j0}6aggGQQڵ GGGٳgEEES~}j5<kkknJpp0{!$$֭Kzz:YYY|aDJ%dffbccî]((( 44T4-)YkӇ!3y=+s‚%#,bH45%W@D4nܸr2PBCC]6re]D}z{{PxAA<|N:ѹsg4hܹsCqܹ*իWYxMiZd2ZDNC.c0H$za^ )))&a0tXZZRRRT*5[h4J% zR)>%DL&D0H$r9Z^RKRZ-4'5=?r\R(U*hZt:07DBGӡP(jHRzqRqXYYݻw43ODD'kv___|}}m_DDDh0zNrj5uҥK899 D 55F;NNNԫWgϒB׮]ٱczVZDNpuuN:j *tiݺ5HRԩ\.ѱۓgr9>>>T* H$бcGn߾^')) OOO ݣ}S[( VZkVcmtZ[nMII {f߾}4oޜ4RSSu$$$C6m}6o&((J%qqqHVV+r_-\x۷o%ZtbbbΎݻ#Ν;Jƍ9{,ҡCcccCJJ  V5 >|@r9oϏ\^J%** \NV$<<VKVV<{{{N:EΝ)((NG^^qqq+xcE4㏜>}MFVV~au#""c)tؑ[n[/>>QF*p\RÇ3f_`,2e/tܺu3gΔ|!2.ϟgСߟ2޽K߾}vNNNU_DHbb"{&22̐Y̘12^m{a̘1#Fcbb2e |wUzV'Nm۶j߾};}.\(v2ydΞ=KddR|СPvmwL71c퉈͸q㪥8۷gƍxxx<J6m0i$Ο?nݚիWӬYgnرcMQ9!!LՕ":unu޽V%33BA݅u%/h4zIBB Nש]6]t}[nOE]Ok&  *J!tzϟBt,--_~XXXew d2:DBXXNQ#8~EDDDߐOΎy}vk݌O>/[w׮]8;;3vX^u0a`,d[رkҢE ~ÇW^|]m۲w^!<"9u~~~L0'cT*eƌ={/'?ȗ/_6i4e͚5l2-[&ę:uŋYrFC~J.Cc7n2=1#}zjUV#F0d-55ӧO '&&^OAAeJuXfayyy$&&iOD䏦qDGGyfëuw}DZcj<{R-8{,wnRI~ؽ{7ѢD.P(ӼysAX(\vmzB@P JQ(XZZT*Q*( WP_PymP(I&r,,,ӕJ%r%2  7΋qsYByMDp^*bmm-T*df%0o:gHňF C /džNfHOOGӱrJ֬YS'gϞ5r劙U8q~ȑtؑϣ뉈k׮ V^-:t(6mn^ǎKϞ=9zh`0лwoon%7ǎ˗_~)o޼9ϟ_ɓ?L^^^DGG 1cOzz:PwROM sYjW^[n±HVXA&M8y$6lٓe˖?R=z4YYYL> &xbN<)ywڵ+ ]V0֨jtڵk`ԩo(5۷ѣG3uT&M_x 6p k`00~xz=֭cÆ µGnt[3jժUڵt<޸qqo 8p ;vmll""" ֖2vX'%$$K.qa~'Pk.6l={ӧG`ɒ%;v#G<_^i={6[lA:tN9po&PڠAߥ_TСC:t(v`jj*XXX䄗aaax{{ik׮!=D"O>Ӈ|N<ɹs爍%!!JE^^XXXP~}!*,,L)=w`Ĉf"777~m>v]n)SۼyaÆL0켕 ,_~8qTAȇ~hP(X`A# )/nxMIII!##Cxodʈ#̼ mcȵ[nȴEEE,^ؤI_*Xv-+V QF ǃO8{,[l1s/Xp!/B8niiҥKYb EPja3ÿ/֮]ˈ#0( ӧcǎ~ 11Q1޻w/ ,ϏM6ѬY3$ * ZyEquw `K,>5hLQƚ7'**vذcRץǓWKmjnݺP**@v޳4o޼Bt˳H/^̈#hժvvvU2Ljl{6U<CCC |ܹaÆ1~x4~YbiiiB۵k8y$/_g/AXX>111߿+W{nիWINN&55˗/ t999ܻwO9LXX?^MvΝ?KmNDDD0x`"##G 89վ_rA,--jժW_}Z +֭cƍj櫯"99YÇٲe js:qÆ cĉ u֭[jk׮1qD&M[B"ǒ%K޵)=zL:H#:[M|P{-4YRRR;F)j&''E3N8A),,M6;?aO*8'E"0h 8'O޵9/ """""""""x^ԳDY+-C :u0~xj֬Jb۶m\v 0uTƎ ܹ3Pvm6!ƍ;v ///Zl155gϞ]PT*/fРA@y駟9U`N"UϸqXj˗/Gyf|||^*""""""""R9FoG=00Pxmkk[*'(9sRYϳ2 gggmYYY~m۶ -ZǙ2e :t(yUڶm .P(קE >777A/M,\Pؾ}{,YB˖-Q( lmm^:~)קW^BųVZqYڷo۶mСӦMiӦ899Bnݺ(Jz聫+'N9T=ӓk>W_}`ڵdgg3~xHA0z ٳcǎѡCa[hh(˗/ޗ TW ,^oFhd{///,,,nݺ<|cǎ 4~ךRT+1޺uk^kl!C`ff...BItt4;vdŊ̟?sss3pBoβepssc֭8p@.yfj֬'/_fС[iܸ1PEʂ W YYY( ڴiÌ39s&իWho߾ٳgf7oεko9UpN"oqѧO6mĸq޵9e(..fŊԪU:pƍwmHl{|ѣG<|tttRIdd$>}MR\\T*ٙM6@nn.ԭ[@{/}9?w8qrR%yyy( R)GCC 燉 \x#FefΜf("""Rk׮ }FrY>#N@@qqq5GTPlرo?Lddk-"W_}EݺuILL4jԈh ׯ:::lݺU uִlْbvڅ6*O2h  ֭[@Iu5jЭ[7d2VRsθ 55l 9/^Diذ!@ES$Rw{{{.]ʘ1c^xbRi""X6l>JplllQk'::GG7>|kkkm{L&#**ƍsy444رcp 8p4***"99RIpp0Wx9?o@XXZZZdffb``@FM ҿ'>>}}}? B|@߾}9p֭cݺueΝKݺu_iL???~:*-[e>Rjٸq#!!!,ZHhoXtk*o5jW\Q+ѬM۶m9}++"0c fϞB (yk֬5kM"3f >>>8q 5kRD"0gڵk-Bu.]dj֬T*]a 0דIzfȑbii 2Ǐ>zzzsD"/Yd{0{.gΜaĉbM ر)S{n!ɓܽ{FUq>mX IDATK]]ygK۫* q96lZ?իĆ9ޯtRG,z3prrbXZZʨQHHH@&q|||uիW ÇРA8*wArr2RVZq9 011Ǵnݚd$ !!!SPP@VV;woU_ $3 9憻>&oZ AtQ-Ǐ/9wIHJR=e;:zPRm-CPP'::;;;>#-?wL\΂ 駟s111;R1c0f)**]TZiӦjٞg׸q=z4')) 4h&^^^|jt@7/+V`ɒ%œΜ9s:u*kƉ|hjjRF zǖd$ G~צիW\XT{!#HPTPfwe;٨Ex,C䟁x{{A:u֖x<==y}HiDJ"99:uPvm$ ;;;R)ၮ.999³Tff&T*@__ҐhkkSzupwwG&aiiYYYԮ][6CCC㱱^zDU7o~*޽{ ԓ'Ocǎj}:$BK*L&+7G]GGL>c===a<7țwEll,bĈA~f "*|7bŊwmlݺ.]U122l߾O>///ÃGr%ΝKjj*)))Uk۲e?E* _ 6T{hР 4(\l/|<+PvmݻWhWRTBg)JJX@^ΝѣG (6xwb3f(i_v( /"**aÆqq֮]k!t JF"U0!Hm۶ Fٳҽ""UALL Aq.xڵٷoߛl۶ۿj "2Ã͛73wwкzj;v;CDpuuUd,B1+իWyyyqڵl@PDD=^E{MMrEIjFKe$HP(k_PP *7rE^neeE@@cƍ :m1bDE"w_,Ơo qa`bM4At˘;w.N"))xXn?kkk͛y=r9jK$11&M` :wsh5ܿӧ}v իW?~<رC&d!駟ҥK+Mhkk ӯCXXFFFq54i"8pqq!//dT3 &гgO֮])**bŊСCwf?B,^$RIaaZuR;BAJJ $&& b\m)#####mdddzF Ro۷DjժEZZwѣGӣ]v:u cccHLLD&!"~LMMΦwcmmL&]vZ ===\]]"::qttLJ]viii|g8p ߿Ojj*XXX?bllL=b|( ڵkW-11_~K.U( C.~zZlKp?[n-MWW6 bBwıF.t/2 ӊWhy3Dѿ GGGΝ;رc9ydvD4y033///N<ЦEݹyf999lڴ 5XzG}Dtt4B۸q|2͛7gٲe~p-[?ٳgѣжc=zD:ugϞI&xzzVatmK5HLLҥKjUGO=XjPr8==:up-N<֭[nݺȲe˘4i;ӆ۵kUHeRPPBp$W)Qqm١cǰ%;;4"##iٲ%/^zdddPTT)#i׮߿III!33zQW=? Xώ}2an޼ɀj"%%}}}puuECCtlll!>>DƌCTTZ,^)Sqzsss&O̒%K_+ŎBf͚Unۧ~pϞ_뻞Gwxޫ瓞>ʉ'ŋ$&&"Juo\TD]`aaĉRenmmmڵk֌ -[FӦMٽ{7999֌3x%{QPPP&y7O_мysF]vlذ .| ޞK.Iff9tT*%((Hmؘ8,--W^6T-Rc߲~zNظeq5N>˗ '--lnݺnݺW_G^^\xׯHZZ2 lllOhժ^^^1X\\̞={pppg+Ry۷'(((Q!w}ǂ xxxTCCC"##!??LRSS˗/@\\5˜ HJԭ[ ^Y wM^*Eؼy33g˫&>>PUԮ]O.$'' Qsss嘚'D:FW}={j4k֬̾nnn ===_jOҳzF/F=½4"YDR}vn޼~4nܘ_~R9BTTTl޼Y7o&**/رcUèrk֬!a~>> .XP2229rzmQ(dff O~ JTL+͉w#(w!;;UGQnr_uԩ%KQg:ǥR)gϦSNeڎ9":HDDϏ p...x{{H׮]9t={ԩSܺu3uTUƔ)S`СL6SN1a| ٌ? ]ƠA*TM<^T@u8F:::hii-|g K.!H(..F&T*%-- x"T^mrUd2QQQKaa!rB&ѻwov؁rBJ޽{nݚdbccV0ĉ+%JU˽k&""RFw-MWWymڴAGGGX"oa$""A`nnΝ;3gpiݻ7&MBSSEPau@ZZGaС8;;3j(!~߾}\v 2n8ԩPrc}va5ÇIf133clڴ~w!FWWy1{bNPj\ڦ… tN={DOO'N믢=adɒ1ǎ;ڵkDT*ϟ̙3 ^*caaA߾}۷/?fڴilذӧOsW%!!r)XhKFJS֭˔)Sؾ};} ٳpNÇWc.**+WTxD P1}}}˞={RÇYf vvv 4m).חVZQXX֭[Ԟ.ׯj3EAOHOO;wHQT䠣acc#Ty&VVVG@ttϥP(gggDGGcbbBqq15k;[GGGP(=FFF{_7$..RlILL,Vښ%vF"""^^^,]0RRRh۶-zzziӆѣGs]B^PP@ӦMYz5=z ((TZl @N<}$󱱱VZ 4"biӆe˖1o<̩ŋs]/TH9 :0hTHquuSNl۶+WRPP *}lJY|9M6eΝ8888kf߾}lڴcҪU+?NӦM_yX<== eԩ믯\P"п:wYz5۷N֭[chhX={R*m"s]]]Kvv6{iEͻ*?ݩUl޼Bʠ(OPaRnbմM(@Rb ddE)(+Hdcض2B"}%4:vޞ G{ԠAQ<ӟ޽{m.rssHza:ʘʹ+,,,":f %m[MeV$eGDDD>ʣGX`=.111xyyѬY3vEpph"VXĉr 'BϏA;ڵk 0]raN>-3e9œ9suSPP@VbӦM ]v1uTʙ3g%J={#FQsCtڕ۷s$ 7n?~ "_5 +W) VZEÆ +$@L6˗ӭ[7Ν;Z΢g2dNB*#DU4 cӦMo,zCCCvɔ)S`(rjjjӧ˄ vz'3RnݺѵkW! =UErnbץ 2\>K|v,A)yȌuLeI_H  { zy = r=DO(<{O&v6)rx1_G4n'p aSxW29d +DȨWv +*VVV$%%IT34+0^f#/Ea$""A"00H 2dիWg޽RHH^^^B}'O_PN"##uP"H߾}R {4k DÇ£Gɉׯ U!J7]tԔ={WsI&ѵkW.]+}NQQQЧO D"~LLL011aƍ|oIL:vHڵf۶m$$$_Wcx{{cǎJ{`hڴ)ǎ#77^zUJb<~+WVZjD"a={ )ѹsg8uT;../Vo!SNjA B8!-S u i!z_8ƓnV c˴gGRK\@XZC?.%4-wJ`s PLf KlV4"OZGjR/? Ȕ$e7Zy@{2H"$Pqj7sĥi ~=ԗ!7I6hjPM-}yɅb QT{mk[M(;w 111Eu*Big#22DEE[iyk"U&""A0m4 "W^(yXkذ!S^=a~ԨQtԉSN!AH$L>Q*VJ.]Xp!jBCCC ҤI8p 7n$-- 6l`ll }k׮nݺU{4`ׯ&yyy9rJԪU+ lGg޽HRJ%{}H!H?~|8lݺW4iÆ :_ڵkٷo_}#FT{,Y79s&;vT+]#GХK7>={P*Ջe˖xRcL^O)%iu,`>b<ʷ~1p2%gLTGg 2bckQO16ԅ삒}-[7'8MlH-SW4eeE+|aQI&uuknV^c:getW~={}6_WRg9p@M--wK/y;#aÆѿ"""YP CCCQ(888 u IDATnnnFj$f͚ĉFС&7n 22MMM,--, ԩ aggL&"֬YüyHKKի\WWWttt %,, ccc7!ݺurf͚Yd {s4jԈCUgXXX/Y1޽{ {!Tڼy FKF:c?BUkT];o^ҧOaT*111>}*\g!ܾ}[m"ܾ}++rS^^z1k֬2ϧcǎe7n`mLW$)i""" :::\z[n%PZ`bb"8d2v400MMM Ԫ6T^kkkR)vMMM\]]C. ڵk_% NNN `Sڵ~9V>ܹsٱp I"PV-֭+8>'Ts244EmZj":S/v/^,YMMMF]>y5k0-Z/~; ̝;Lpvvf̘1}:,]R'šC8{Cx6բJh ^-D;@fpttTkwwwRKVX5ID(.\vS>ҭ[7:T_eիm,X@-ADMQݺucDGGW~~~UصB?y渹Ucܸq( nZn}gȑo%‚={rrv| 悈{nLMMi۶OET ֭[>]t?W[ e˻K$@NNZu֯_Ϗ?_[j5,$ٵkk{n1#:DDDɓ*=FVVP4227>r~aaaVx1 177RT*O>xPR---bn޼)+""Hbbb +wXAOI믿??J7775kЬY37o^c;w R㾈VZann^'hhhhaRU 2rmJp222^kN>M`Eɓ'Jz*I.ӽ{wceUP(JύT}e3w\:=w QҦMN>Mڵ+Oڵ UVf!:DDD>8&O7̚5B5:^O?_|J͍/))#FzAxzzRn<<==<:t/QPTT$ooo'ӯ_?>֭̀[899'..?L<={JMMm۶Ӷm2_;>D<==iذ!W&//'55ңAۻ~2 oooΟ?/DKR8qM49#T>hkkPǨ/c/eh[=zč7h׮s# ԩ#D >}8DDMs\\\ӧM6O>ӇO>=zPF Ξ==5LT[ܸ~:˖-QFרQ#N_Y[j|p|7N?:vX>? Dݻw.СCvvv\vN:-fΜ&n]TTĝ;wطoܹs (y`]j XnW&mQF<}TMeiӆSV͍Yfѣ Q[]266p O1a?_~RƆ}V\p;;;jժUc777nʃnx+WO>rm>P[n2e~7&NȤIhѢ|̞=%Kx{{3}t>L~_p3zh͛/^^^=Γ'O8tC¢-,TKCC㹢UEuJmz<{ӥK{٤I {nرcO#22Rp^FϞ=ɓ`kk[fS.Zb:tx>pٸq#͚52DDD2Lu@@R/"oa$""AСC2m4RSS@KKK&''Ӯ];-[ƒ%K'!!\>oxx8waҤIܻw=zGjj* }T*bbbnL#""s\vM͞tܹí[>ܿP AAAܾ}7nqFUӹ}6SN󉏏'66$(+##333߿B]vB[ij!**wRXXȽ{OJJΝ;ܾ}˗/) =zĝ;w8{,;vP/..۷o3gHNN&**C iYYYb: }a|ٳgWhL;Fѩ4[Il޼Y9h 7n\ς )ST<|/\Ù1cl߾E ZrpvSߦ'+Daa޼y1yd8qZ?KKK~Ο?ϼyV+W,[L [lf8::r .\篿MH*ؘ̙3,,,عs'9YYYWF.3n8<==O.(lH$rR)ј_WW'OR^2Q{_}w3zY(xMSQW ҥ 7n$::?u{%99Y!{뙬otR Z0_xZKk׮l߾8ݫL BӹD dŊ4jԈ8.]Dhh(| DDDеkW?N`` ݻwӓ4Ν;GPPC:wg}F`` [Vf9wӸqc4  w޼̜9ccc*WLbb">>>,ZoooFeʔ!**N:gHHHĉܺury9~8Cb >7OVb[~=/^dӦM4lؐ/*Κ5 SSSfΜF!22-[СCi߾=:ubĉ899#z3ܹ3_}Kǎپ};ެZ333ݻ7;wرc5 Jűcǘ7o'Oۛ'OdwalB˖-9w#G>ѣGJk$QyxxMx 4_̓r|)@Һuk&O\h)5ã>%%%y,٥K 8w؁]t[/squZhsۨQ#\\\vW^ՙe 7x@8pw}'#!(R0BsaԨQMFLL kצVZ\vEaggɓӧ۷o'""HÆ qssի :&M`kkKhҤ 111ԨQm۶ニ xxxгgOLMMhҤ 4 00_͛c``@^[....\zYfQre /ŸI=~:k֬̌3fн{wիGٲe `ٲex{{gIHHPf޴iݻwgÆ jعs'&&&| WWWܹ+‚KAÆ ~:={]vT*+\zɓ'SfMjԨC]65jחcbeeɓի...TX7nyf OØs= o!99###~"{~8q" oUVڵkZ*ݺu+Zeu+Le-+ZV״tSSSԂQRRۻHًؕ!,ǂ }lh9dJ>f~x{{SlYbbbطo+Є(I4M-SSSuZ?.%%E/;>|Hjj*vvvOσHKK>!..T*ED8p }%88{{{eʔ)#ԪU+ܹCHHK3e˖zܼyS7W,h8::*q=>}NO>qq-\]])S&!lܸGGGׯUT);_Err2nnn2 ...4 4 88lmmqvvVԩ7oҥKT\*U(1:ݻsujԨ31baaabmm dvUꫯ c߾}ܽ{lpQո)4*T/.]BR|[.AAASLjժ%J>}0uT>sƎ߾} bҥ0dYh(םH|޽Cn,--i۶-z?{%))I=Ajjؘ~xT F[la/U-[h۷/z1}eݺuux;w˗/ceeEJJ &&&:~DIJJJ*x;vf͚`eeERR)))~ߘ={6@-cƌa֬Y={0k,]dN2sL5kX`666\#GEYxҺ^/ϻgbb̪bŊ8dhhH:utY[[Ӽy\} )ٕ+Wb::: sPcER=qTSS'bee3pwvvvvOWzu]6:8EoԨQیefؘѣG3g߯t=|O? VY[[S\9n(>SfE?CBBtbxooo:A֭x~ SS| RSSINNh4i߾=VVVʶrtte˖\z=J۶m"kqh~7勉޽{@AYrWF>;dffV(j\tIgk׮q1^yoN-t>??͛V y_,Pq&00}N SvbXZZ2i$vM^j`jj͘1cPL;wTt9}///t~̬%uE],-cǎ)ꫯ>i۶GlˢRr}lnI(999GQʔ)Czz:)))9 88xqkkk ]ve>S^}U17Z- 6$""[nѳgO>#=z%KǙ3g022"==]0x`$x)9r$LcݼyzԿvZqҽ{wl٢VZvx"m۶eÆ ʺ{ѻwo>sLRkR# IDAT^=~ٰo+W \r*,n#-[$22rqrrޞǏ&%%q<[ eqvv9ϢQJYXZC(x-B ,--IOOgܿ_Y߸qcBCCsϒU|5O M]yL ի,^O>{)]F*JL.]s5kF5)P\HHRٳ'֭[n|2~mw׽{77o˗.88e2`̟?_;M2b.tQQQ۔)Sիh!Wn""""mw2R~J7+>e„ @y>=:uzbF}ԩz!{:v숯·v RRR=W\y?IZ.,..N-brw`TB"Fׯ_?z3gٸq#$''?uBR]n]~7ZjEbb" ,iӦ|l666Th%ߢ!#!K> 88 7l?~<`֭yvȯ7o2|p:믿^wuL1cШQ# /? 6([C jѣ3FqVf͚DDDL7\^=χ~cfDvѣq!#22:茭:::²et044d8pѣG竅(~4h@vؼy?۸q#L8ֲeKʕ+w}Žhprrsιnٳ'~ŴyfڵkߥK )))޽W_}ۄݻwOPj"s&MR~o۶mF#DKNNFPtivСC8p ;vJ*8FyRXx1|h/֭[iժ5kT_Kdʚ̙3TZUNޝ;w8}:sss4 eʔ!***ZOˋ۳sN4 @fK? _|˼y3g^^^TVM1'#!Dq5MƬYr󗑑={8sL&ڵ ___,,,Z͛73n8VZZVvZƍǗ_~r&!!+WC@@Λ? 2e ԉ#88s=Ο?M2yd~Woe!]taʕl˚{ܹXXXt)_cfϞ͗_~Ippdaa]8y$K,a…ݻgRbE s[bbɒ%lݺaÆ(.|rU0b6JJTo"faٴWfY7 ,PM^E7}唷7dРA@fb̙\pZjҼys cشi)oBӧOȈ~-[aӇ.]PJOŋ4iªUvGeǎ@*UpE>s O{ԩCtt4:;wVf;{,#G䯿A|i;vcS$$${Q~}""". o&4lؐ#Gre\-7ol۶M>-- '''=ʖ-[x!+V2)VwaԨQ4mT?wܼy͛3{le|;w~z8#iɒ%RfMÕN5kdԩ\yŜ>|86m"99Y%ٳrxzzrae?M4a,_2o<ywǔA%..wwwbbb >Wی9RgC}IKKUVR~=TRI&)GҡC֭[ǨQ|16oL͚5sɚ>;###~7qqq!##[nQzuZ-wQKT*lkk-uCRCZhӧ r\,]'SSSn݊*U"##Cy.5\ZjaooϼyhѢwܡI&ܼyS/9%Da*I9 K@ =Sm mȶh[$~;. !D!'""BiFPP񄄄0f8V100 (($^cccquu% @Лi֬-""]ƙ3gtj._L@@7oȑ#ʶDBCCڵk|@7<|+W0~xe&$ #>>>}(>UV?ѣGkNZe[xx8'wO'x.]?/_ɓʶG?.\`@fP`̙G!**7|SXʕʕ+zIK0kkk̺u TYԂcoʕ믿GݻW/E,)))ߟ06obd[o> 6mĉp˖-+p2󸹹~`sN y"k]qW\tRPϟvTTH>|Hhh(7z$''# ':::߭pEVVT^JEpp0h4bcc}6RtXYY)gBF FBԔEcJbӦM:c%۷oy899VT)~7obccyט2eζ+ߺ?MbJ055e:E(Ȉu) ^LLLغu+*{c---hҤRbmmŋa:ʕ+Ƕm6lX2uKKKLLLOu*400 CCC{qLLL)W\1%J &n:V^͚5kk׮899ilݺucƌ|ۗ;vhCˑ#GxVqF5jfffzhZOκuݻ7'O~}h""""\2+ZiK~ޔwyGq;vctGV6k6mjX!J2HQ"xyyqprrחSbnnN۶mpႲfժUԮ]n޼l[j۷oe˖ܹsR SNԩSt???prrB }PTxyyq)%W2~xر#ΝS۷ŋSjUUիWmׯgxxxÇqrrjժ̙3GҾ}{._NNN3|p]\Dҥիˋ'ORJHIIgϞ͛71bFFFxyy(~w>ʕ+G?m| _~%7&%%{Djs[kˋ֮]KJJҕ-\qƱ{nڴi3|2͛7L8%K9r'''ٳ j#;ZMYt)5x?Y1FFFxBQRRRHNNu[BBBhe!7~RSSp|Ehh(: %44T3MhhNw!44ZMhh(aaaDGG(.|DXp!^^^4k֌RJ#ft֭[IKKCVk.T*| Aܽ{;;;}lllXz5m۶ݝ7nN׮]111wߥA4nܘ˗/3`4i޽{qqq̙C =z4GՕjժqe֮]1ۛ&M`kkKpp0[n2ܹ3 mn׮]@ѽzbbii?%_~%;vݝP\]]իfff̞=ƍӤI/zI˖-100K.(3M2*U0tP< 5jҥK\sssfΜ 6|e s`q///ۇ1ʹlܸ=z_C _155믿[n4i҄[npQL8vZ6l؀JQd|ppp`ܹ1gƏcvżDEE'fT*W~.w:u_Eq!/_^ Z۷3c yYfM)7rAn޼JhBQn:ƍ%Ν;qwwɓ9Z/\ѣGSF eݞ={ҥ vʊD5j>/.\P#vڅseŊ-[ӬY3Z-֭cĈʸj=b̙3 5jD\\mڴa1m4>c:wݻpHHQ"/_???ƍǵkWխ[ .^emۖ(_}: "$$ڵkIvZ8ٳgҔĄݻw_2ϟϏ 0332Cv/^ܜz)yzz?vvvԩSG^m۶\|ʕ+O8~3*URX &Nzَ駟 $66777J. @2e8utR W\cccܔ7nLpp0Pn]e.]̥Kpppf͚/|u^^^ԩS瓖… :$̜9OOOƌ{Dze8p zqJnfDZcعs' ɴnݚ\1UPÇpB,YB۶mdtggIOOڵkݻo ʗ/_[o\d144T.]SD!D322_~ 8lٲTZ[[[┙ݻǫʹst>;&%%annNTTNNNd2խ[7|M6oɓqppPwXn5ݝ/r1F3gFGaΜ9\|8e @ҥKwK}m6ڵkǾ}8ys1|_ѣ~:cƌVZҠAڵk䒵5nnn̜9Zͼy [(K.]HHH͛M! *̙3gիʸm۶ĉ}?NPi4sR \,ʲrJy&;vD0x`QhǏG*T*Ο?ZWBY2sL޽˗_~L񉂓FBeӦM Yӿ-[Ɣ)SpppQFs5BBB aΝ:t{͵Dpp0gȐ!cQq{Mx5j^^^9 |0dʕ+#z޽SNf#ˋ1cƌa̘1qq.\@hh(#<<KKKڵ+-[SN}ܼT\kײb <ܼyCCClllh׮lْW^y%G1V_w N߾}B9B׬Y3mٳgu&g(99SSSUFDDUVܹsxzz756lLJx*Wʕ+ݻwgܹDGG̱cPTۗm۶q '"`$(QƎ鹭Og[:uXz۰aC:nݺѭ[7X:uDN: Qqww/}[ZZ-P\\\ֲ'K&Mqʊ333zA=4ҥKR!jIMMinhhHzz: J״-Zm6VJXXZK [߿Xʔ)+5j͛8p? пmƉ'8w@o. tIB!B!JҼysykm+EHΤI1.j5Æ UHOOۛW^ymFdd$FFFx{{56l`$B!BPAAAh4\\\077ˋ_U^V-BBBxNWJ*qET1ddd[oZj155| F@XyJuʺVZ)-DђB!BQjN8ɉҥKs%e]rr5,K6mX|9-Zx8.]ӧ155eڵ8;;3c ̙L0ӪU+eҕr) goQTݱFB!B!D d``aro߾2%=@~rLDaddĚ5kt&xb̀۷/fff8880c  ߟd̔yeK FEA FB!B!D diim[=bggN!' IDAT󻕕3Qr댍qrrʱ>yz.iB!B!BB!B!) !B!BR0B!B!:`$B!B!tHH!B!B萂B!B!!#!B!BC FB!B!BB!B!) !B!BR0B!B!:`$B!B!tHH!B!B萂B!B!!#!B!BC FB!B!BQQ𲊍ښRT)T*qqq```@ZZe IOO@Y~jT*T_狈J*)Gzz:j+++VKqSJN!9% Nާ&9% Jr*oS$&9%^)`111!** U_E2eHMMĄ h4r%lmmtҤqqqnݺ'FAV#K&.. =zJBVh011)E-VSƤhWgh4<|߿/9%}*oS$&9% Jr*oSEQ!_Rvtt 055U݉PlY UF||<+VѣGXXXh rINzz:Zebaa=hZʔ)#/nxJMMES%HNINʛ((ɩINA F$ r077PZgd&_!r#97)QPSy%97)QPSy/BZ]!B!BB!B!) !B!BR0B!B!:`$B!B!t,iO2L(Dq"9%~IN _SB%0B!B!:cOܶd/)!KrJB$xyH #!B!BC FB!B!BGn# ?Bf8hL4ӧӷo$ijjJ7pN<gƜst;xuC43ysavlƁIJLٞ <!l߶=?Xs#c;#6&Voo^i&Myã>]5Yp+?l3155rś~MLLTm[{ wFs|!?+W.\Vp3&?O&44y<.)))/)))*> -*̮kƀ)`X,P TjƀW}hǍ޸qc՟+^~Ijӵ}Q߽UT!ʺc!CO\lL{Ie]̽h-ʕJ]u7֮]FXOZ7n]fmN>]kr?.Vkaa=u^tVo~Suƍ_>~i-  U}ڵjs/SSTqY$$r;O)))ɩZ Z<SLk56n,[1֣zC0zA ToUjU,--QչFH4>|sfu찰0uR344j׮M6mh7oksGRn]JYYqn߾sKr*s)Q0SyHN@rJTS`T 8:V3ܺuD4ys ̄h}6ϴRVV 8 &ݻw==x͛HJJԩXZZZ=ڱ9~~~?q8.ZZgy8q"~~~DGG3u4ʕ+ǫPj*z9W|$GrJTHN)_S#9% J Fo'M2x[L6)S&3;T«7|˗ѦM[z鋷wV=믻hޢ%_Ö133ױ^Uk.Xtͻŕ/p~Ƴl):uoдmׯJgvZ|ч|Gwkݻ3Kr*$D~IN/ɩ%9?Sr m2D夯x(,SB%9%~INYXZMT oklKFEؒE?0ҥK89U/1/%-^SҞ%-^SҞ%-^SҞ%-^SҞ%-^d2Kл`BiӦ w;o>}z)iђ)iђ)iђ)iђ?ia$.!>KT&}A6lXQD%-^SҞ%-^SҞ%-^SҞ%-^SҞ%-^2B!B!D !c !B!B"!#!B!BC FB!B!BD{n껹aE%Vzz:WuPnn]z!K-EVTP5;n̤SzuxB8ɏq].YBjUce7-_ QM1C/1Qix):`$Jo=z2lPzSQӛ~*>SOw^) ʗ/e˔+Uc%:{w)¨(T9_+T@jZj!TnR~OXBT)..QǰlRLL ą(D)j,-- KG F&Myã>] 5jmV|/^`РA(CBΝ;Gӎ߷ؘX`{S q aa̙;(NSٳиqc8Tzz: >|O/>+sBߊS>?:tP,Da+.yNLI+[:u]7~+%[n }Qe[ -F?MgDs 0j݆o㭷 ## 2qg֬Y x =zD%9|HG4))ו+-WJ]3` nɱ,]v[nH8={>b$A)S~OZBTrjE,\Z,X={™ )~GƏ@UTI011aŅw()Ο?]Ylt2ӧܜGchhXxA K@ =Sm mȶh[d-c|6JÓ7em, QRᤧӰaC_nAW;(qVBbOL. ?PEd*F95{,fLέ[Xf o̙ӧpss) QhA>ݾ}ɓ0u{TRV~B <<<ڶ~^\rEBd'#Q`X[Hv٣'sfƱre:tHzzNzzzc)c 3} DqQo Mּ;)!PQGRzu/[ƙ3g9xDUG y|!} d~V\ayBPE>ɩ:eʔR0O$c<ݽ{MYGݺu &&>uRʊ+W(Wwr3g* Q*)eeŞ{_QĊS>i49##C֮Y+N9SSSlBH%֯_GRD5y7n,X$JWs 8תL R0y0Ϗ'NEPكr#qqq/T|d„ r]f lL<9srh4ܾ}"9W! [qɧ >oj$&&(ER\rɓ̜9SNs-N<ɤɓ k׮/bK> 2).yq9} XG>>>ԖȃDJ.C>yw⻸r؏ k⣏>Ï>[vMu|2ڴiK>}4T2N6)S&3;T«7/۷;~"44 Z)W߅!ГSIIMa„ 4nСÈTX/zP\IIq+V Fµ^}AVrWd4V0|ۼ5d^SL/|B$'!OJ5K0/ԥKpr./pB%9%H> WEYD &$86mp7*3w:,!J$'!KrJ|B$DQFP%dzxRjԤo߾9hn!3|B$'!OJ5H!B!1B!B!DB!B!!#!ػY3&}I$!B!(*-u[ݪ*mնV SpCT]P"" =B=6-3AsJ F\\939s򜓹g~G!B!@FB!B!bI !B!B$a$B!B!B!B!@FB!B!bI !B!B$a$B!B!B!B!@FB!B!bI !B!B$a$B!B!B!B!@FB!B!bI !B!B$a$B!B!B!B!@FB!B!bI !B!B$a$B!B!uk B^kP7$DbJ%1%bp 15H!B!B F_uZ*jp$wĔKbJ%1%:cj(HB!B!@FB!B!bI !B!B$a$B!B!A8=_w["ĔKbJ%1%:>0B!B!HH!B!B #!B!B1$B!B!0B!B!HH!B!B #!B!B1$B!B!0:C_\\=w{/7ofҥ֭[)..>#mlp*1m۶~'IEEwy'_Ēb%KyK.[ZZx뭷Xl1cnI<ౚZ[[6nxmۆbhnn>q @SSo&o㒘KbJbJ =P7_~FF~SRRBhh(ZJM7Dcc#:gfƌ|[ /˗Off&^>hN'3f̠.hwW3dcjtMK.矧ٴiӧOg|̙3>׋d„ tuuh"ƌCOO{`0¿o󩫫 q뭷R]]Zre}v/$44[J" ;3'|0bbbhjj_lܸk^{q裏r 7b.R.]]wEii),XqaZ)++#==oAUUW^y> 'xn [Pڛ8LbJbJ .))1sر;?s9???jkkٽ{7[lkQUTzoNGG===ףfӦMX,<><9rPoĔh$77JGGEEE1gynKHvdXF#L>m۶xb͛Goo/]]]|g8Neٲelذn Ν;)** , mmm3qD|||hll[n^>O?)Sm6 hoo|&OLII Ǐg\px<~?~<L> b4Yr%dz=7of̚5{k.ꪫxWՌ?sh"JKKK@bJbJ .))1t$%%M`` 111F{/'11>|||0j* h4ȵ^Kii)CB|;N%FNCV̖-[={6ח!!mƭƍKYf L: 9bHLL zٌ$))d^z%gժU*?"III! Ç3n8ƌCpp0dffm64 x^F/'N$00B[hkkcذa7*++>}:;Ve]Fww79 jtK/1c bbb!!!#FP]]Mkk+fnKbJbJ = S}>9-?X IDATt?Z{=30vloS[[K.n;w/Æ R{Lyw):?ڿ?{ah;ׯe@_9s0zc=s='WnCbJbJbjpILILIL )?N`\_>}s[+c}3Yp-|˭B}5|pSPP0|'nXX?SSbpILIL!)G!B!B1$B!B!0B!B!HH!B!B #!B!B1$B!B!0B!B!hW/&뮻np֑#1u$HL:)q<SNbJԷCFgȏ~n+SB .)!ĔKbJ' 3$ ` ĔKbJ%1%bFB!B!bI !B!BKkA@@:׋fCVVÉfa'AGGzn:::zF8M7ۉpp8hjj"%%ZM{{;٨T>$B|#S]]]tuuHpp0儅x8pz+x<Kvv6f:::fʕL&&L@{{7V+$&&ى |}}h4DVVw&44ݎ"&&ZF#|vZl6Zĉ#""F`` GCCcƌᣏ>ppEQ]]MLL vv;jp8 l¤I$00BBB`2rHhooGK[[r,j5===DGGcXp\`6x<:tL:,, Z233K!B1$ΐDZZZ8psN222 СC4551n8V+ 6-[PZZ̙3),,/Mee%iiirWŚ5k ::ƍ1bדd#"7s:1ACCx<*** 7ofرSUU$;; V+Z Ռ3jN'rN'jpٰa#G$++"< 8N^z%~_~z8T*p:,_˅?III0vX:n'>>???4 _HMM%,,`4 '***:;;$))͛7S^^Υ^ᅬ^lx(((@SVVEt: v܉/:ի>|8UUUtttp8d2tR DQTTĚ5k6mfYFB!B0:C8,h4DFF$**v;L8LJJ GB||<^ xc Ntvv // 0 `j $&&Cjj*JVV F@@Ǐ*88e{zzp:dddbaڴihZRRR6ljIjj*8NjqS[[h4ttt`Z?~|P5O?OKK {.ӧOp'pWo>z{{f qx' < _d ^{b+T_Y>>9t?Z{=30hy!n_S{5'1%?Ę3g\r UUU;˗3c ƏO]]{/sUÚ2e 6l &&l7߬te5xϟϘ1c`0Ν;2eRu9gz-vx4`!_s=s=GFF]]]SSSôiψ%44(KJJK.m/gSL }爛+~WB!~ ~_oSUU;CBBcJٱcVbʔ)R__jswCݻQTlڴ/uֱ~~yfFAkk+h4'P__Ogg'cwA虜64 o66mg+XV-[رc)**,_+Wr嗳cǎ!Z0B!~ `0ϧNGoo/z0LhZ/^hvvikk];!88]vC\\j8<+V`ĉlܸ={0c Z[[9r$^ٌf];'""VV+vyOĉq݌5 חhy饗PW%c !?@ߕ?G~ѢEK/ҥK5k999gBe?,fJJJ8s9s&3g6'Ys|*C>Sj` &&@{{;~wƍYx1z_o>*CZZaaa8Nؿ?}}} W_};w~zv||<^x!V@R x q&lٲ\.tttIHH6 NdLJKKh4{n8z=---C@@^ݮčfaILLDV@jj*˖-s!00BTT]]]twwc4)//gсfCEGGɧ}l~mvwItt4˗/g֭T*?*< ͨT*͛ձ_V.%((_ =OCBBBro>=\n7===k3<<LWW۷\\.mmm hhh`ĈaXFӡh(..&$$)SPYY?0vIAAeee4440fjVq:DGGSWWdBʈ#ؿ?qݴb`ȑ#ű~F#}}}jihhϏ4 >>>sncZh4_|AAAUUUȗ_~ITT555餦D^/:}1aT*vRhll$66KCCF`7rJbbbDGG؈hٌ` 00IBBMMMT*bcc@VH}}=ISSs!p\oݺu5mFjj*: Q⢪tl6ft:8aaazzR__Offikb4l6Lpp0>>>rA0Lp8HNN#GR^^Nxx84551~x줧ENNh4n7 dgg@SSAAA 6vHNNFף9tnXjkk rQ]]Mpp0jnk.̤ABBt:ZZZ;I[|r~r|}}[>j\2^u,Xb^z饬XS~pFUUU)<=k׮'dݺuz~{5Oի5k M7Ĝ9sE[cc#+Vg˖-w}'T_~%vۀdѬYx衇=---,\?JeѮ]3g1Ƈ~/Lmm-3gdɧvP8EDS]]Mff&#F`֭=m۶)ch5662b6l@xx8XJKKiiibJGG#FZ͔)Sp?Qv\.$44/ѣG+'seee{qnfrvZ%֬YCTTvBR}Q[[_'87S]]Ҟ)S0c ~QSS7Hrr2mmm<#x^?|I}f3vn6lرcٱc477HLL fJ%yt:/X~=7tk֬Q!߿u֑G]]l޼l|}}q:PXXHDD}555$%%vtR"""N(//gs=lذPZ[[Y|9ƍCRԄ`̘1ٳF'{|+V 33Ldd$n͆4440vX۱l֒Iqq1>Qƍ#!!O>ɓ'c0Xv-\wu_Gaa!SLAc),,Dヒ/V8طoᄄ0k֬o멨`0o2n8 W XV^yrssjJkk+ԠϰGPP8NF#\.Dm__%%%x^Z-uuu\(++S^1cǎ h4j5nCuu5*HNvt:{ Nhh(FQIz677SYYIRRwfTWWGYYk׮bGaa!MMMcɡ ө_ 1Llڴ{t:ikk#33???tc27r5`Yd #G$!!Dqq1F8f^CRSSðaM|c}P}eț戛Gky8b'cϞ=L0^ɓ'믓x755q7*޽X3+M,31e;4l*چl/&;;[owQ W!j vLԐlVK/=sŷSzz{{~bbb|ˣBff&[n%''4 ^FCss3$n:/AAAp\^s9Zj%-- Foo/jJϏBCCqtwwJgg'q~ǦZy?[׿EWWrUgU*LN̛7_e۶m?z?O*++IIIa׮]$%%㡪04 mmmsNbcc Mss3IIIA;>qqqٳ4zzzt(۩d2֭[ GDBB--- >%q]YYIpp0l6Z-tuuՅ`0('twwv&==L&eeec4ٻw/)))|ұcj*uuuCPP^͆bAG[[  Hhp\\.8(""Ӊjǣ$""ۍZV`f3ZVig?VK}}rQǟVr?aj ٌ/aaax^, AAATUUǍGggJnpp0'99bccݭT;NlXVt:+Y{aTTTAz r嗓K]]R]z=J:bXvN}]GSFEPPڵk?~JKKt$&&hlVh4\|'u|Q՘L&BBB顤"##iooGϮ]4i{Q3p}v$$$Z2~QXX^j*?vZRRR8p:u*---lڴQTǿo;<2228x }}}x^eQޘ`tv9sp=(`WZu„Q]]kZ "##.SBƍٱcMVV?O5j)jwe͚5KHH2_~Npn:e𵈈ƍOO!;Xe'.Lnj*>c***hiih4MAAW]u17WQQڵkW_}5G>iZ:q@髉qNɓO<ٻw//r)#UTT_O?c<󤧧 /@?|lp SO=E^^?骋+Wr]wQVVvjjjغu+:,X@WxeNۍV%//Ô&L&2(hff&GAEE999x<jIKKn+{<01i$^|E~ӟJoo/{!//O ȑ# V@{{;]]]|| b_m6|||ϧ7xe˖)0Μ98ljjRHHHPƏ &,,"""hii!** .H瞣fΜI~~>x駕cߞ3ǭڪTcԤc4QFQPP@ss3j` !___:bvȑ.X5 ???ʢݎZfԩ@*cǢjZL&F#n(VrᢰPiO}}qJ΄Trrr8].n LJ^ EѐCPPL0AF!<^{2usEb1bٔM&W]utwwcXp률jRSSA0aFQ9Fvmt:FN#::o+ܹs*eѣGr RT >Zl>j+qF_1X}nΝˢEƎ Wde5j~ `8ਪ⮻⣏>:$''׿n޼_Wt__$##㤶h"|AXxGO˹;?}}}o~ 0ac&}]Nefc< j8VL͟?_?wyhڵKETTԀu/^̐|owp g}W\1`t\uU]o7|?ܹs޳>t<ZE |?Ę'zLJJJ>}:VRFAii2%hpȪUͥkeogw9 "\pk׮UV_q,_~_Dh4ڊ^waʕʗlZ-?0nn+~o~UMy$)!Ĕlc1rWVSRRN?Y1NYqYUV1k,%2 ױl{twwTW_t?M6駟JA~zed2q~msw /^ =oN>nfrrrNj:gqUVq9ԄhTfIJIIСC |}}immeᴷv)))!33.vc2Xz5 >Պf*сNZMTTرcX,Fr)WKt:V5kpSUUV%88bccZʌQS~%[oQRR܇ p*瓟?efD@zz:K.%,,e˖TJ̙3Yv-@̙3 wbhooRꫯt:y뭷p\g>`ذaTUU)k.q8^l65kHMM%..FWW&.Zrr2vݎ2 }}}ޮ\jA[[mmmT* >>>XV"##1ͤPZZJKK ^Zp{n?ӺVYYtY 00˅DEEp8 QՌ;VBCCioo'$$jbcc g[z5FyNtt4p+RPyyytuuzinnV.544KWWƍ# 2ΦM Bڊ`PvwwԬq:::p:455)3gݻBNpXcc#&LFˣFQ*@N'C&"##$%%Aww7VDzzz0JDFrr2f\.'Ot066ł餡ll6:FCqq1&LP[$ 3l6>Uƴ4F?bŊXBgԨQ?>v_y~_ R0zhjRRRjTVVtRequ]Gpp0ӦM;voɢ nFrss;v+(e֭/g͚5_;^_ףELN111L8O>;.Ba!<<\eMK.>3frJ̩Sr]w1o{ulGm|ree%gf߾}@]zZrrrr[N GE* Q>O=|^k *ɓ' }KD"a̛7ӧw7lJZVVK,!""jMƞ={ZuտfѣTKJE^*zɓV@s]VxXr%WY@'7~]wyW^y;;;&MĖ-[])!w[ R)IMMLJZ6l999yD|||X۲e ˖-ֹq0=k֬VK [YYf&M:jZ"T#Go'GGBCC9qPw\li TʦMX`+W~\r+WGC=u"$GGG 圜FivuF4[CCC }4//K.\cFĴ0JMF['-hVepss$ dggAii)111L4'O1xzzrqƎKLL !˩BVchhHEEVks1vXvԩS(C=*lP(Ϗl FxxԻwo*++d+GD-dffbkkP"BCCIIIۛT|}}`hhȱcǘ0aق抵5W^EP]/^PAINNʡ1vRee%ƍ#++ ____RT/3( >LHHΘއ_7oRSSCll,cǎCCClmmJEBBQPP Th4rQ(T*ٙG 2 \ͅjۓ$DBii)yyy%%%ٓ",,,h2sBDNBtt IDATu ӴԻjH dz HKOn>D"l,**YsN!h9C:=SgdafSOm۶g޽{u^x6;qDLɃ*RP'(mR)?y&:!.ҭ;(bbbضmR,֮]'|ҥK%u/--ՙhi*%+ZtF{JpۄvHC}у@RRRؾ}; D7oѣGcddJׯcmmQ?~DÇ-pݑJ\zUDFFN~}]=ʙ3gۛL… 3sL(++ 62~Gzŋ$;;[%Jpȝŋޞ̄+WЫW/! 222|g 8CCCx ^.ҥKܸq rssA4rrr2dR"***8s zjѣX[[ sH$NW} sssRSSIMMp 2 9ؘJ IJJgϞ$''3j(JJJHOOΎSN!H#<<>0`CڵkdddгgOLMMINNFVLNN yyyTVVBMM X[[c``;:EDDDQаIyyyϔ)?>mER駟8;Fj:Tt{8 Y~mNViӦ 'O q @ `ggGhhh۝8qb#{:G+ªU08Ĭc0J=%㻊A1h >ٿ?ѣԥe}g:tnAV IKK^PN:%6GZZ5L[٣bffJ ;;[g K.>&Mĉy衇6mPFDsss&M\.GPꊍ ?~iӦ@Ϟ=)--gggzIEEcƌ'B6rꮭbaa ( aZTJpp0dee1dd2ү_?#55={W_1ydd2EEE,]___D"***q۷{_ooo č7k...NII  BP`aaAaa!nnnB)aaadgg#D,hNlll///>|pJ%'se2aeeEXXQ7p@Q( Fh^F% 9Q]]fxooo텂7cbbFJE='77WB5yyyJ~P*yyy ,h4lڴPd2}___]ȑ#Q*ܸq{{{^']@}WVNxP#55k 8_Z "Ґ޽{8Vȑ#yEe2\>oP~iҒ6Ҩ~+}GuF5ix{"Z璥etuKӢOS iAUh}RDNAtu:ˁ*"##8x`P߱tᥰ _j qU|ӧ۷oFذa6lFǎ˴iӸ:$Z,|}}R$Xw#Xd K,!::EԥX7vxW8p@a]]][F;BDFFGuu5r dԠP(xzzrjkkݻ7 Ba% "ǎeG%""$ }a;Xj#:q]GѦ+ǵm-ߴiӸt+W䧟~I=:]6mڄ3+Wdٲe%4AAA̙3wD#8u\~~K{/^o₷7׏0***Z jxZYYu7'X.JYv-/}{ܹsBZ,|ؿ:HLL L2RZ'111\~Fͺu###¸r xxxMnn.(HLL$..www1c&55bA 333{E.SXXȥK8q 8prAlllȠ>}˶m lè ֯_ȑ#r 888`bbT*ȑ#&DңGr9qqqX[[TUU1f@P\\D"җf͚7-ԩS>}kkkGYY'O-IHHwA"GQQ 6 ccc\\\é9wSNeȐ!]zމ9o[w0'N2228}tE'|}{7%E+71ɓ' %Å޽{ 0^#TRhnIK4׿(=h+@]Z{mZgϞl޼5kΑ#GZrssY|9ǎc۶mm'7n۷o~H&LЩ63339u0=tPd2VZwlzϥK9yG9r$aaaMVl<|p6tرKxy)//ԩS8qcǎq A^Ѱf,--y7̞2Z" FN BVckk?@AAXZZ 渻B͍/鉻;¹MVTXXX*ֿ/Y[[PEɉ!COOO aРArϏMgBA= kgϞ_~ݛ2 @&VJLuuphUj5Rpwwkkk,Y\.'==-h3|||077^{)hOу2h4¶fffɑ&""""""r :Yf餝|gwi1(Jj"q?G:"GGG>#zFCnS?ݫ34 czi~ڜv$ܼy];88pB.\DFFcv%o߾6WliSb`` /?wyGrJki>Yv^wt􍏏δmҒ' <~m֯_/K.:V?DP?JV/j ʎZjCks'i5ԣj}}}-'ڒ6fKS̜9 #j4hF} 4>Z;_DDDDDDE"&M0uV:_'Ұ\*|733,XEgQYYYhsF!:TCQn+B%ͷN?`Qmv1|vu9>N-R7"_߹s'gΜp{*^vssk$̓>(|vա}Oڤ-^ F{YPS!:z`o5NNN[_|QWYYɁͦ;4ө ==H())ܹs\~lRRRATr1ө!//, IOOرcOYY)))%SRR(--%774D.#)//';;oK-))sΑ͛7&.. jjj8q*t233M;JLL )))ڵ4 rr9{!"" ())ǏT*z*)))P\\̵kHLLRRSS)//'99@AUUǏ'<<Jō7%##k׮q5ԩ*"""""""O.W^yEu ,̙3*ǿoaĄ'xBgQ &L 00v[7nPJ(瞦WhOEO?DZprtTna٘1cݻw (-ta嫤eUɲ0gʨ?F1/s:tӧ?jtg^I]U+׹\AcfbF^`17xK} : / h4<補;wTu̒%KB" Z"::ZgZOG1Ԁ^6% 'Nd֭ڵ?SS6_[[Fi5%Jզc=ݕ(Th4ネ 7o"jkk~:0{l%%% rssJJ~z)r ~~~(JWWWO^ͥ^Jqq1W^ȈǏD"a 49sPYYIEEٓxLLLx;||)--wނhuii)6l`РA\| 022 =z4XZZRZZJaa!2D<<<|22*%66SN1l0fΜ)h^ooo͛Gbb"_~pEH!:| ˗y_~m B>B裏at*߶駟"uV\ITTT/FXgSVV[" .,x衇QJJ 7o4^aP3q…LY}`ff&Dw}FZ|5 v&=SWȈV  d{3g > ̞=]vO޽[pA]Pk\r][ż: QY{{{Au|w裏 "z-vKh4RRRy )T>>>ۗPJKK166fN;w.ׯ_R )++\ΠAHNNfРA3ydAZ[WWWR);L$ 8Pp JEEfff 4+++:?FAPtDiaԅuV,poxꩧZaUSSF>3g#""1b[liՑVYf u?MicG8,a߾}}"''S ,XС(* ¸QUU#<&q &&{2cƌ_m۶w^^u>uч?#+Wlخ[NgZ+,>Z:dyB\}'v^Tl6R>}ZCm}$hYCo\^g...:6yyyMk 5Ԡ^,hilh{LFXXXuDDDDT ؾ}m[4ӓ)St~h755 [_Yӈ.ח_~ӧ ߟCةjΝ;ǖ-[t駟i3g rss{/u.`Æ ZE"-o;wD_{5ylsw?Sghhڵk6mFy166Y???+VDDM: U_>tx BQQ_~%WFPܬPvpp0\v ^z ///Fj4>s6m$=zm{ûpqqaǎLH$| >JyXb>viTVV2d.^(333cرann͛7p n``^~eaXlٲG}Tlbbȑ#B&ӧ9ʱcǚ͛'hi8p QTTDZZQQQ:9rD/wcڹs''N`ԨQ&Dp6i/wcݨڵkQTT\.\D"lllLJ6kDFF BJ+++lmmʊ>}лw.j>}VFM ƒ(SNϾqۿ[NSMana4 T^ h|t\11vXbccYx1YV]]MFFF­SL/l1‚Ǝ+k4.^e|' 6ي{ IDAT#T*/۷/k"իWcllo!fff6~kY0m4~WyA[:ٻwo/&L`۶m̟?_#"**mR);wԫHaÆ 2{m֬Y ڴ07o^#FΑm۶f1Ԕ}1rHiR8p@U Xn]Ĵt=p|t/{e֭:6mڄRRӠNʒl߾]LЫW/^9>>>(ELDDe; FKXYY%rao !cԨQLQK||̞=~K*bž={8qׯo??!eߟX6ng}&oD@@˖-cٲe;qqq| n:Lɓ'۵ٳgƿos{믿΃>آ𼹹9;v`ͬ^r666<#^{{v.Kpp]tjtիWY!m4EMM |W8p6jjj뱲dҥvr ~-?NuӎR[[Krr2ر ܹsyǚ}+hXn/bwn.$p=U|MSp+ÒKKK9w.\ //qvv&((#Gbee9{,iiicaa -z8bmIjQW2 9r` ݛǷɡ;v$ UlkԐ@ff&UUU899ѿpA^m(**ȑ#\v|$ Ӈcmm![By+TEEP»JqsscMtΞ=ˍ7ϧT=~~~ >\'5:֐~7]Fff&RgggƎȑ#4?'|UVG" 9w~I wFfFó~ǯ<ݦܵ4# "rO3|Mj5 /أ0`4\-j>Co6F0K!J#GOS]]6ϟgƌ:˖-R;ED{n:$Ls=hD\\C mEZ <Vp7|ѣGv΢|{-zYf ׿044DѠVX`XHwMqb}‰?[2|SuѢEDG&++ ¬YG} mǸqnSeռNR1o6aJΝ{EGG3c ߏiw#", 1}t.XuNH{ll^Sx6[a$d:u{キM۳fvڅY['"SSS^{5֯_ݦt3w}udQCyzjYfq"-Gʩ](J~uB]{W; U^>''0516Dt#DoqEω'̤ ۷/SNeܸqH6Y.ΎGGG5k2ԔAZ0(|r^ݖZ-ZŋqvP~ne?#-[NW_1j(.\ݦ4b͚5<3:Z+i]Z9qW.i>&IOW[_F"yO۔&"rpsscÆ mHwʂ& oOuA'//ϛUEHT =d6m=陧z'MEn+kf̘0vQkvBDЈ#BoDڎ&"""""""""rPeoݙ"-ƲaGz`Q y饗 ӧOcmmM߾}-kSQ}z?u,l\Dd]!FeԐ=xzzbdtgգE]Kje'uqh4wKa o{5Y t r۶L&㥗^bdΜ9̙3W/gϞ'u dժU̙3SFFF=ѣG>ِXϴi֦H{Oy1iPYLTvF~"r`x= Sqv-C| 122H ѣE]CUUU0_%f=:!›E=hHkdƒ۶ҥKIII^[>}{nك~*)ak0ei#Ԕ?\p~XiVVVXD|I:E׬YDDÇ ӳѲڎEX| ˜!|;I\]\=HK"G0"=&t+sOi~Έاψ#f̘1~܈!uc2L3̾gϹuxfϞGDZL ۣZ_ёӧw-?qqq?Kll߾N%O9s& .ޗTomrtXlYe*s%I974#!)u$z:tkIe.Bk/}/h^Yw]|MvLLLԃE]]+**qﻉ@"""}o`M^8z(nnnd&LL2NhزeK2""]ZomKtmCn\9 ACۼYBگg[0"z&ֈG猈QV"PS[ESC' k6ZQFߤlgtSVLLMԴ555vNP`iiGDAHHQҒ={0~xΞ=ۥ"-;v0RSS;ݻE-gMUVV63=N`rFᙷKz"uF""""""w)}!!!;p3'O\\\kk2`c9`eAϲ3ƍ'N&:hHgӧG"-رKmeeŞ={Yё={tZ*66,=Y%"<۷ogĉ7cc[cNː⪯e &D]ѣjxJ3c$~mwt^V4X4~ 0 ^^KMe}{sZRتΜ!+^LhHgppp`޽t lܸ߰aAAA]~[۷/Zh4DFF fz*j!C5E JeQ|}0(&YĔ.… dddၫ+@ )//\\]]9~88::beeEuu5dggӯ_?IOO[[[J%ؐ7* Tʵǩrn䦴ggglœ9sHJJD~%pvvo>ѣXZZVBXYYT*.KKK&%%'%%1`~:PXX3NNNd2$ eee888PRRB^^XXX HA}yad+܂, PahiN** 14ㇱt?HATbeeEYYLQQ###,,,v\~___lmm9wSE{SL 01@%sC*QWTccfKԸXS^̄Z (Ե8ZT*h4DFF";]1UUU^FAA-/%E8w5p3 T`n^,-рq3CjqeZMmkkkZJs}v|||fΜɔ)S8p^}7o^ ?<7n$==mDGG3|=Z%"'ٳ^zujub~cܕkǛ ˗/SZZʕ+WRD"ի;w طoH$쨪Ғ~qq_ZŅ0O=ȑ#Z&++ r9rT*K,ʕ+ <$_NVVJ;;;lmm*ctuhrDRRR2drbbb̌x͛G^^ORSSqvvDӣG Drr2BhD±cEѠT*9x cƌ '''>LJJ fffJR!A&1v.=6"Mcha*-H1qvô%Tљ295[VQQ]OXFNNNs% TPP@II]iPOOO PT899accC^^7oҒڞa6&:r˫3@K 8aonDL %؀lCrxl=l۶N8AXXYYY<|E&)((谣@b@mm^KTFӺ sqի dznDfN.)=/ pDٳg գE"aի0233cڵzkO3ֈӣE"":nY*ZsXC=p\)60㛟7[FtuaaaR[[K||QQQH$rssINNF.#L֭!44L' BAnn.wW1///իGxx8jnݺEXXmڴٙT5jM6%00L?-[D.n?ѨQ# ;;;\\\С>>>8::ϠAWAAAQ^=.\#Gxǹp5CDSv(ϟƮa0ڻb6^>=ؤnVM~ E8FJE^^ӦMӧ/ <4HOOٙhҤ 999#'3OŀWf`SH-~.6IWiiŏ gB"+OͩShٲ%'NƆH kDB`ӯ_?njxm{gct.T[#%8::]-*0J<#VDEE!P[199=߀ZZWdΕ9|L>h0(??F4 }Isrmy?]0u-u?vk*Az; +Zb-ѱiMjJjxeׯ_FK8{(dh 3P_ R;wY;2t뇃CMQ!źiqG,V\jiHVћ7om۶VH`)Æ iRNf6l(F'Wp\P$'/CV:x7Thk5iՕ]rTtÔJekޛycXj\~ZzTJRjյJe9|0N"==<\\\'::֭[[C~~>yy%"Vdqܼ ~X(d2w/N$2WAC,]Q-{=EY38Pӳ HH+O;0qP[o^ :ԅ]e^*TW"`d},9FBf0|{|McZmkbkkawOQ[3#Uoߞ`زeKMdΝcĉxyy䄧'8qJη~}Q|||۷//}ǓO>IǎgΜ9$$$5W_} רDȶ{ώ{菉`@ MHJ]|݇GvnnRgr|Mkɹ 5 vZ*AQQ}7ӓ ԴF6wG+MewETFS 3xBTn^ /T*-AՒ}ׁMVnC϶-A"F~ѣG]̬Yj#ٲe mڴa+iTphg/sp!NQcRSS>|8ݻwgÆ L૯iӦ,XBa-Z-}~;**s֠G@P1ad2ju0?g3VePkh,xh,_Z*QxvjEҢEvZ+lۊ7\P!-P[yݺu <77|Vc xQQ WWJ9tsZ-0 o߾]Mfbb"/_ܺe@dee1n8$:գ Ж[ A G2j*Ill,[~L&# qi Yhݺu#5nذg:}e˖\@P۷/wم;V>$ecM9I֖={H+z$Be1IeDk:oEU*Uj?~"L+V*)??J}e,|fF!9Dr^&prr"''Dc6OgVNb̋OeE[z<\9Gޞdܮl`Zmoӧ@fbEAR>Xļ#M[VKnn.j2fA=7u 0&LN1-^e ĉIK+Iݻ77n4"8zhڴiC^HLLtNfh-Z}W%kصL>+W35+ԙcn+Gݻ-nD#T&[WZdefyL6͊ *Ã0,&3 ;7|qq quO0!c~sT*Jk?0M«AB L*Z6/ٳGݸqc~W#aaalݺB{qUkj6۷oGբhݻwɁ|e@ROٝlp"Fлs1}*,˗K^yeM EqmZ4SgiLAL.q`/Қբ)1OmWYm؇{Yl_+ZG\\4m\Ap((ʿYhV,:W<_ }x뭷R)Wxy,\Pg!$z{mĦԜYγ.4TJuʡ2-G=1V87GzX[wRls٫ e5HMNQCڰkejqpp ??ZϩhdΝ;ݻPD*&!$^,NVfRD"Tp`Ɋ6{/j@V%p)RIIIڵK-ѣz} Ҹqc|:tJ.Օۓhp\[ٻw/~{ܸq3g_| Xw}"=((,@ CBuKsԅK.իnWTeΟ?OZZCXh!c=u9~~]ףy*hr%Fޕ= UOǎsfRTdYiWe}+v&%%Ѷ@h־#\oo EEfTa <؊A#J-^̰*)GxW>)p4HΝ;{)R]1Vs>ӗ0 ۷~/dΜ9lذLM6i&;1qD}W֭[s1INN[n ?Oy˴IJJ2 G%:ڲ ΝkGT*>|8;v8p3M!?a>({X*(( ..aÆK׋Ǟ{r&! ߇չ<;v"#? ~ڮaVZdFd(puqg#\RwBr[{rss͞ގj++9qV#-݊ T,Y+.-gw8"ہ#2 Fc #ZB"˟,pqVA"J r &跏?nV+UVD'M۷Ҷm[;bĈrc 2 X4j(6lP˗0`AHPCn5[S/x4[՛,)*;ެc1Si, r}_#z?6m4˗/7+WԿС-[tmנA6>}X\C||~,ɼBAؽ{~c=ի_-] йsgZls LLFE=l^N Q>¸tE\ŰX{ձ3Rɞ|Cr9j,s,[YBQa!ٳ={Z#@ r9EES\Z(0|p #ۂZ x)ȃL]c|2dj&?MƝlFfς $y7 <feEDDйsgbbt¢VbѢEFǎ3:uСC:t~'`ҥ.xsN?X?`I붙oҤCڅ ,jw?LllNθqX|~QQk֬aÆ|wӧw55;oߺ?K?~/?;ۻJ3g }7e* m]`YܹÕUuo\K8d\5j<״)- 'ATXNZO}ҡGgǏf͌N}v>=/ߟ\ ?XˆkIMHe6z0mg=9[P%ٓ+VnY\"j߽Сgh׉u1Mj(r8;[q5hEIyEEEf,^5͡A(fJԚ?rJ<h0UܽLP`oooRR ~ٲOe> QfԩQZZ۶mcȐ!ڬXBѣGW0jHMM5nк鍥EP%I9r~ߌ3XdI Z{{{vEDDy Hhh0,IkтO&떮՛gxOM$Z|_|=f\xUTT']cĢxu~%T2̮@-ۛ~}3{ j73|RΛW FYJĝDtNAҴ-puNn^mk˷aL2ZmtD.RVU-8}+W2ti9BT78 C<}A!9\SFRɤtZ͂dɛ_QV=zAY4JڵkۣFK0jΆ"RSS޽Ah֬Y&:uBT>MŦRze OV5pY1U5%%޽{ ,^:~~ \*so=>5`%?<߭'$3h)%{΅w^c64^ɱw;,G;Lc;g< Wt)9.DrvU.lLrM@Q} P:N!ٍ<9Ɛώ9=peN9–g_ojh4h^x?'CaF^_iGNql|czRJmlz T= `8s'/LsOyxY6uE%@H>}AkZ @ ImN`.*܌LeЅ^'Z=n n Q-W?B] k OuQVǙ:u*~- Y~̱BBBռYkq%-+ތ"SĹ_N޽ ĸϟϢE,!<7/X?`uzhc8MiGa*PLncE)1y7'Oy8uH=}֔=֡5A=v,hx(xuoO1C6g  E\Z 7hAnn῿ŋ16&/ǷAh EOES?3Ko[o 6B%{>m 2ڷB&}_2 ? (1<==+\0d HMOǛiM?j-3 4O"X@ $RԪ- #V_ɓwOlq6V@rrh4akkkV6ο!y! !8:u2,,-##Ţӫ^^A23*͛7F֭A_8XrZDN'?%RZOq)d%e%?N{*)qtiR ש=Ӄ ?rYR>7  5 !803gp%.]DZZZ;;:`.b,a#zx?Z_*>)6b@A %o'r| T=666߃;,Dܼ5FMmsܼ$sm^FS G@P3888o| 25`t!6lhuVdr]Z%yE;-- {{{EגSٵ/;*<QD_@Ngqqq:uڵk2Wi}yp+={ڵk:UPgHI>,Q2W&}l?/KQ4uΔ FsW(ޡY G@9ԧ Ixx8pu,OXq*rfgg憳3DvCҫYYY/ < >SC*W^oYЧed.h!ka# @߼yoTda+!O#1=&@ )"]vѫW/+{$5GUݯ`[v)י2lX5_"ۂD gV¢"b)Z9y$Q`cC/)!+O>{u2y_iƕ96q]+J6v~mKۻp:?-OSP.]@//\]]IHH>N0yd$$URRQմ IDAT 7vR[i* .Q\[Fc4hRTTTnFСCnݺf..45y<6|<܌>> 4{3/^l8Qjmt}̡90Ż/FcggW~RDGGsO·~߯T*MH,۷ӧOQ,|mMVaӼri8p<][(x`ZH 2-3GVeP&L&8p ,YK.;/u281WĉѣG']wG-gܹɌ9DS q1ޘzCKڟ8 (hqO͡P5ukO6^>_AVz1)L իίIKgG˘dzEopäwo_oQFxr93ɗ{}̜9Ӵ&6'aѲ_,l^ʴ"+.ҨY%hS[W[[>ڹod˹^$ #qzƻzdO,!_Ƈۖ'dhHY~АdTg{֨n?f Jkӗ("[ZmTU *vvvV}j&"E+WU n^Ц'\E~w2OOMX SL_YfxǎiڴiMw3f̠UᘘMVnW+W2e 4YfѢE aݺu\>މne?_OmI=>gWuЬ~'22ҠMfx*[zظq#nn% ,`ӦMWP=6qKvИ;mbɿkgI\~_@8yDdr:Kۓr+/Oai-dn Z0'>6ɱ'ϙ}$v%E ߳+xxxwM4r ϥ$rGaYl73IyM'voKZ>RʕX95CٵkE/k T!]h4r̹5v,2_cҪoY3b8eLy%tQ:u@ x05^ <֯_oPQ+ {G^{mfq2|}}YmaϞ=f}?NNNSvGiӦ\ࢻ}v"""xlZ!+##Cߟ 6 4iڵkA%k?^ 5/+ӿ߲| :] 0ɉ,?/?""" %))3gΘ"!o=븚3nK OMɹAt +~M.-Ϭ9ǁ 7/}oU^`n =C@x$X#ӥqcҚ6'h$N8Adf͍,K=q"ZBH;Mx$ee{@PװV63rrr}6rJPլ:rӦ݆$.ѷo_ !RRhԨm۶o߾ >ܨ# b9rdm;l0֭[gw%22vJ߾}С$$$7OHH{%<vvFER!%l֭cر:upy$&3ovEPZSO=EFɆT qd"p!NRc=vҙGCrNhŤî]8|pI=nݚ6|O߾z*#F0|HPs ~yz+Y,μKsO1 "ަ?uib׺(A0,Mf͚ormȒ /)eT*HKC/!I+L3d+˶`]V95C>}سgEaݎ}D4 2.H]s Yd8h|9[L]MZm Rř.]lN>Q~8*G* D G^rr78N.]JӤI=iӦ2`t߾K}0{ ,ޛA"Jӳ[Z Bt5k7ڽ(u>kIsYpgjrcCBB~]'rAI9dX_R;<<˗// v[IhVA``>wwJ[o;1yJJ*k-ݷTTRak[91@ Hj^.,,D"`kkK\\;v/(ZFѐF!++ JJBєKW3gPnZ-{}V/e3??~-W\!;;wXX2P[5tbזlvf[T*eĉL8éSuJWWW{xxxйsgxԩcܸq WpIBbae2zxpQP 36& 3$^gFM"ӗرI7[3cp0yq?1Ǘ3'r{6_ÒR/gH$ 0:_8YO7ؗqI˃q/.F?)Fh5UdQ6=`._BHF&ۓ4RCjx{XVNW/uiG{niP܁! +bm B+k׮GOHHT;dff"JILLsdddp-4:ݨQ#,HvR\}ؿo/YYYz-M"`Tٙ0*F.[dzj*4j5nr'.[ ODFׅ駟hӦ 0friN;2w  wFY֛l:F/0zV>ىQjVR.6mihiiiQ(sD&Urot~yNp-,~7{&uo 8ͮYOJ (Up%6ƺG{B!Q Խ,)iiԨrxyҭ[l8pce4[̅gٴt!K"^"%ISn޼T?:tѣol۞Qqr3ĞKA[|qzl: @H BrqqAV鉍 FS.hj̚5KOW9.DIZ5$,[Vp:W'\~j=u7|NHH02׳tR.]ʖ-[墠< M;o_lTG]R@$;4JB&n=Fj '8ngz<۴(})κAƗygP0Ç&z >yRAz>tshS~Hp.\k in}>33`cψL'b#n9vE=[|?};HʹWg КiI6lh|`dffR^=-u LOAM xooo2 hZV^?np\"zacc;NNNTiZ 5бobggGV ] j}1Uv۷sq:@]W RQ;ApN{hɏFP]Pj&O믿oA"v@+W,gDO:u ?6z XZMZZ 67!2cW*>} ϒj5WU  3Q*a+%ˋ}ip!_y9Z-rw>卦ƃdmOm2L; Ʀ% Db\. <Ă7v))U\*% гS{{u2|yj+%*9tZV2A`ua!2 1\WCBCzfuڕ?mۊ QDW\,88JΓȓO>I=$I%`=s>X0bĈJ(M4ߝ';(3yٺ={LBHP躔Jekz $-Ձ/kr9uϞdHV`ȑ<[9v*b iH_xiy%Zv́X\ | %=2O;@yʑo_ a$33?ZIpp0W\>8:ؑœ)rn vw8^L/ūL$Z6,C?4:IP{$7'M ~^(6CM8Mw}ǓO>Y^ ""`TE۷7np <二ooo:w6jW^yl֯_O489믛%spIDDD-ZAor9AF|`[7_0/3ɾ+>?.\+W@* ekx Ð! y11p&df@T4kf?ԭGNH z~HJE J@M>cܔ)Wx{{sF\bO>^ڢ>]Y O c|p)*-f>>X{ugC4I+Tx;@ 11rM\d-ɴU2l1@ ';;[/r]dz4tڟUCѣywY`A)T"`$xp)R3\2"̰fP7+T*ϧI& @^̚營.] Ϋh7o_|EEE&e7`1}1KTTYT ]t!&&=zm+BLp8i?l{1ڵiž#aFu20!`t1?g˂;v|@P H$f/'4tb[o" 6ZqvxPP{!))I,< @@B[wLM3{lj/99mҹ̙͛Rߕ(74ۮ_̙39{ּSAV[d׫g1:ĭ|̻yh4H!t]2Lyg.14?-Z0{~R)E@P  EK*Ғ^%ߺt8~iC*2|p6nh=Guk'PTTիW|H,NTn=O&ח).BPpMBBB*ճ}vbbbٳm3Z6-a6;;gã*ƏZHPC).vԕjG_]*kA]+˺ػf%!Z I2If&Lr3<#93yY>::ڭ=?~(,~{={rpp_|E>#b_3@}OgӦMRȠV3-g܈ ;22ySm%¢bBC/?j`L#n|q՘@ĥk׮?O!՝&Yd@ZqݢAوgÆ H@F !::222ɡO>ѷo_~ѯ_?$33¡CHNN&66<, .%x2d]w=?#D79! >}Xc۷/=z~S+rw3u<+@u>}d.]HFɢ۶m㭷rm?~jy=AZ8SSGSuw3sc]17S?jLƁ;~adQ{eeeֺt?ˀ$R^^YYYߟkZ∉ȑ#&7 zriL.\Hrr2K,.M]iP(&>>222v|g1j`gг2.uXݰo/Sq[7@oX, 7D=j5uuu.Ff^QK |5 GX,6#2jh Ԛ>fL8xr B\j[Gs=%f+Q)wN _W󣮮ΥRjcJHHH :u JUj5k,rd7`ҤI,]?חAzz}Ht*@~ ~_~ƿhxx8vu*ֿ׏xlff&}SFAA*i5tn_Aa.$|T(Rpvgѣӱڵ#nDB\:ȢfBQ@98~U*TTT4>|8TVV#tщIHѩ;w sTtt4UUUDFF*Yta&Nȣ>P!"11^ω'nW\\LJ\ A=ͶX*`Os'\2VHH%%%mذcǎ9O^5u> MZj`XظqmkeڵN9 MطÇل;_t,9l0T~>iXv kEː!mWI!gZ4B {5Tz?r{w׏ :))zF)*+<}tRQQV*jo>cx wnݺQ]]ÇIHHhXt'p H n߶؟>`Lvl۷ˉuTNtx 4-h7an^ ԥ vS+,,{d~({p#GFΔVӵk)OB,,WςS0x(/zA)PkAY_P(󣲲???al߾1cƸ$ș3-"\0rILLlr Xx7Cρ#~}c5(8ٴu*V|yCu}||0`Nb'Âzcu!.Oa(blj={*`y _QS܉WsaN$چNCT;?_*dIfPsf3vZT*1OBRem%t =?3хieN"&&vB!\מIyz&(jg5}Tj(=mv+ |||rz% &K/1tPAFmD½Y|:YeTRuQ˗/'*ʱdHff&ᄆCV( 0ÇPY}w[GY ;USJWO}6c= g4yx Xq(,"""0\5V8rCKauuSIƒ#a "з|zNݔǚ^'˛%/߮a(m*::'O:ݮ_~T=An5u,;u ;0c+ւS(Y{(.ywLk䩯B\njk8c =8~La67fVv]`` I +$CKd].yǧĕ 4#Gw ]7 @fȭj{p:[sy<J,K+͜(aTkv|= .~eCwؼf4j.++sKM7!șL2bJ~h4.%j4zSfΜIjjC&EFm䧟~FF#& Ʉh$;;jkkh=w'O$//bGSWWgms 0fF#sh4y睞^VQ^^ιs֭Nj\|"(??? N~~5ù2J]|p t֍gϺ_,CdW֯=#Cu#GweP 2#i> P:27SkF%n^pog?t߅n' z-&M͛3 -LLhhZjkks%@TTZ'ORQ!C_k׮a4 bJBTOLJj5Ʌ ߿?eee1Nlj$22Pz^LJ***',,`eʕ 4]j?~<  `޽;#GW^z tJE`` qqqlڴu4mhUvFΝs vھPvtt46 222I/Hknoooƍǧ~t_Z[/o"dљ3go#ZMTsI@%Ew-.*kŧe,~]FZZ} K^߰70 NByW^yz _#hZhbBX騮FPhjsw/?A]!$aFF2m эݻw.0Zs1cݶ>59i9O ˣk׮ߟ.:X;=}UVV6GwzU?I˖ȑݣ /fw4ҋT*̆:jMp^o!{6n>>TUUP(P;>P(;ꫯ[]WtRèp4묋EBtZifu4t:~I++s߹D%}uޝluiz61M[:@W_ s4yLVVV HIIaݺuNS*X,T[pvqՈaN.A!!\(,rjrLSvѣv!踾[ fp><< Dx9>j5u.kS[%єE' #!DLQQ3~}DDD]`0دrqp1ڹ ,,bcc9z$&&^{5F63RR}P,#{RKUU35o߾Ԝ;IIE7Mr3'ɔJ% ,dT)NԵ@ !e3QT-\T(nYחjq뮻裏Zݯ$a$BBB(,,3;[رcVXX(fo+H*$$b׼ ӭ>Sv(iȲeJ.7s741ϻ4*C???***j3bΥ%ΥѯLrF5lRBJKK[3L!DǔNNNӦMyl%fFi3f 7ov 5oߟ*P*iӦڊMFBN7VOg&LbBB(2c5vԮ5.Jpp0.=X,[WtԠA=ztNBWPP@nnL&OjOƅR ;B# M8d 22sIFm۶1f !hlڴٳg7ڷU#Fnjî]0 N#;\s2))lJZYGTtl0Bt QQQ;w['!CL{T.?tq+ziwyʆN5"##8SZ@jj*=P*fN ί%##D~W&͐q'r sf\t_6apVoJJM&CIBxVEE+V`…/5D}y'8ՇFq:???\{aŊn[tbc9;hK 4;+ҵBا7;ۻz2j*++9vV%$$)**BsmtU z-~yf?h$~ Bvv6uuuj( L&Sv *Nj``tcY2_5cP?{ȩ~;}B\L&=Xi9 B1P?Z*-P(󣲲{>NѣٰaW_}[$Aii)Xti!{J#Gh"n&Eؼl~m>'K,hW}رcvW3C xP<)y0Iv7={>}4οwS4L~X=bΟ?ԏD޽{Ԙ;ƍ9u] 8>p LJ%={DպoƌΝ;haAK2LRtjJ'{':fڵ\wuNB^{5,Xh: ٟ3w\^u.R74_sȑ`ȑeH#G̒%K4رo뮻jDi_]]O?4.M/Z-dee|M±X,(X aq~*7p]j_~׏6I]jҤI}蛘H~ӧ$:sA?Zna|b,8Z!uL؈J^~ůM($'8Q߂2 !h?.3glx*M&ȑ#ٲey{{qhZ1H¨ ]p)SpICBB'OMMnh4WM:s cǎeɒ%zǸ?.bpQ]ND v67'ژJrzl!ÇqBtPTr{0ePWs3'k[x-?9H¨ =6rnF=Jaa!ϟ+Vi=fڵ)ĉ]C孷޲}ǚ=OAA?/2˗/租~j2%BBBѣ锖:9rf67`P0Vn08j C*\pB!ܩo߾?~ܡc _%Z&Z C).*n8*K6mS7ׯBсm۶ Jelb3AJm͟?ߩm4j(?M< 6>>&, $&:W3Ğaz ~ $f4s& 7Сloa!?ǎ?0hrU2!ĉ>eJ3})))bi~U"";^K ^jΝL>T( egg3c 7F+_9+!x[naРA.[Zho]jhDgqQN<ܹs;]e&[AFڵk7,tut:zfg}ݬX{1ϐQYfɛ޽{pBy222w;tKETT555;vufXP*۩՚Z1:NKG'd !T >~P^ e`j4p N%Qjֶx\q)X, >={| [Wޛ5^w4f8?l Zf̘B`c IDAT@2341X,n&oЎ3=ˡ{.!!$DPXXw?!@~ # t~Dܹsy7[ &K:đ#GLH¨ܹ}DDn#GZX,\pFdٲe`֭[Ѝlno_V7[QQ9s(--塇[VXKy{{˛b`k07MZ`/_6L&(.맱90`0Hh1AAAqwkx8111S挟DF9$Obg$M5_]d(p] 2Vף={"B԰l2yT\Zw:3dU[dZfĈlݺqƵxNAPVO%|ͼǷ8Vt|/FZ H{3MHPp뭷eJKKܹs|63~;6o춟C2?zq ۿ|pwMM m]{]t!:3֬bT'|&j}L&TKP`3ƵrObGQd 'WWۻw/Æ scB!Zl6ꫯ裏jj-l7Qmȱ";v,۶msZnBzG̝;O?Mcm]..ǎ~mS夦rQPDFF2|pRRRZ\ *++~=j(n6>y$K,nk4/_Μ9slbΜ9~<_o~ҚT u uo,}'p`TUEESp=۫yCBI=z@3ƾ߲k~O |G21[@ "LČCs eQEBѾx nAqJ3-%Az=K.nϘ1F,^:!!!,^Gy_~Ms+bFɢi4{=233駟7|ìYSrev `jǕ!mn0^/S҄Gi&ț-I&+o.fJ \R$tNeuifX'{-1݄QNNQ7F!:+V0uT""l`R^f9+22^[|CMM >>>n>***qټK}Atfs5PSScիW[f̙`4m{ѣOC4i[lg}lUh'DqQղjM̄u1i$7D&RSS%>>c.5o<>S(?l-*++S*tM|h0򰯿~ۺxbj1uTΞ=k}->>~˗?ݻ[o޼y5:baϞ=ѣGP~w7:<:j67nn܄hI`` ;<3LmXf&\T/MO>6S\7=钷3X*f;cn=P׷b!;s W]ukM`$OoB368UU?jL5h4$'',{ iQ\\LaauD% #2<Çxb~d^Tvܹ>|ٳgd= gv9WnnfF\*--fkq-ߗs9 V"""p?3'3_ph2ؾfY*Z3նW^dT̝{'L7~[\g̖.&MgG6*++}T!ͳWGob/YwwF0Y,|wғrf غuk$t:]3PIPGUU ,`Ŋp?IyЩS˳n/Xvk֬~ûkV/1QQQ昋c^ Mڵe/u\>oύO´zqтAq!׺(HR28PI7o$krA wUSXXQ^FHPv5&}ۥ ӻI T2W??L S6`͚5N?B-)/F a*n&WI̙g}q9sCPewzZ&%%?pIylљQc3QA^~~~Q]]mp[{}9^R/d w̺wbMע3f ;vy-Ʒ6$OAyQ | 5ɄF9~ 拞7AZL(!}mo.\  !D'GI8%:WU WɰP o(]PPqzqJHAqqR&s&_8Dˑ#GZ /ZkײvZt~32B*ooB8(&&,uiP/wA1-7tpIⶁ`@ѴMB8IR·3nGK'B\M}fH/7]mh!R'+l7qL*3*ַ=Van# `RZjVkwx>]' #on_xꋋ34wޤҨ@ۥ|jOhhͶ35_ӭ+ :#:W^,>NTp[#,Z>b1$&UB 22U~w 1`>zo۶ѣG1"!m@ *3Qn&¡R3Mg-כYod{}%f]0Dj]&W4R :lP(jikJhtNcРAxѱ4.z#/뭫-[l>StiF… y׭Ū}Y[ΝԩSILL[͞`NԳgOݻw3}tձyfvttSh111>}޽{| 1|,d?wx5Tf1zZ$ 1c`ƌ^l6աW)S+0vXN`2v.fݺu.ߺu+_Bt: 3Ԙ,j^L9맠 e ^XiU*qpUW]K/Drrr3D|||n6Z-̨7n?HNNvxUnY0򰰰0֯_ɓ` >?Iڵ+9ruDPZZO>$O>$]taر?S6y}h0 =znjcv͚5eii)ASO1k֬FOg5 >|~~~~1mԴk.Nbۤ$}Y~gJKKYn< C 9?駟n믷~뭷{Μ9X7ڶm/k/R1 ֺvʅ ZS[ȠC!Dhx"㏻<, uf$$$_{lʏXb}UOɈ`zS&`D3fwUV_H5a:ÃUU$)PIJ{zkg$V[,I>>> ^>cF%! #O1 ,7n$33Sr5}?~7d?AYKvP>>>۵̞=Mۙ>}͇iӦ1m4>!<wÜ"##2BѹgԨQy:F t(.'%%'xzO?@I`mWB@}'OI^>Jz)Xet!*o\x%1Ju u ")EsWq&WD﫯/P|}}9~G͓l8``0PRRbjiĩSkYkkkٱcG.yd67oee-)ιw^.\hի:uue7_?D9OOP($&&vț3JeC@@֤ѭW_}a Iy*u x6#|ü;wBddCBF̚5Z')))0ػw/W_}5ٞEwNEEv+eD>fw-4ZޞD> 6PPP@XXgȔTǴdʔ)j,ZM6LFűkƧ~jSc9,_C1w\j&OҥK1cK}q2} ( իǎرcnYbpi=j]B!:{O㪫ޭu?{: !\ңGJKKMP(?b[U'4J5$(--%44pFMJJ 3<#&5uTؼy3?3#44A1a&L>0@{p'FC||<999.]9jjj8s BLL ZbB1l۶/aZyyCh?TVVz: !\v]wtRϊP_϶ $ A@Zfر[O4KFmTWougϞ̟?緪 tRkݣCst ZaˋiӦ1m4ڇpM7qM7|pp0R_Bt={~_ZZJff&@xyyѷo_O$Wŋ;&88ѴOFiZUő#G\0tPf͒:cj$$${nn}Fp: |!y͆믿ΨQ\ GFEVVdz^~eNAn?Z'DgҥKt0BtPwf3< 7СFVUU9|BvY4QJ%wy'O>d )))) 6̦$Z`08\s' t 瞂 90hK3F^/_?Z|my{j!3gꫯ?Yc>[^f1؁@!MUUUn:y֘5kVIڵ}Znooo0ɢǏ?L)S~>Ik|W6t:\?i>Pd/d `2B$ѐ.al߾[H2oMf2SDhB! gϞeɬ\cgΜɡC뮻\J۷ϕOaÆS*"0n3.]өeE;zjcٳ'%%%cgBX ӐFAdV~„ Oz7+\% DBB>uĉ| >[ 5ٙR!B8KRorJ޶m֭#55պ(T*fjTì[M6j֯_?< E1|>#׼[ & IDAT맣OOx[ˊ|n;p0cnf1vXƏfSl>///]N$%%Ԧ?CK ի HBJӑ<~Q!Rp&eB4 Q6HDDiii2CdeDRw1qD'L:T!BtXZUV*Ytʄ M.]2"Sɢ#FqFINka͚56nJ%f^hdQ3gp$.3_>7 :o7'*J=RB!.[t)SLt1jZvƽzʕ+ t(Bw_mviZq 7o޼FSD)i!Rɜ9s3gg70!BE`O0{#T*Fy/V"22ӡj={$55RR aN6HZ-'O$66]+F[B!ΐ!CXdh5WWBH^|Ek!.wuhVʃ [ݓE nv \-:_pNG!rVY|9juzC2vX|AO![t:bbb8x `|س"{Aec ;ʣq\i$a$B!D!Cx:VQ*{:VQռ{~L>:ZPZɓۯ#/::2rss=C !Bx{{Oz:Vuf͚EQ!D[5k; z'z(u]|ѹǺ !Bxyy۪sw}]]P:ѣT*qSDS(w.ĝ͉aտX cЫ=^J%)))\wu' #!B!Z)55!Z&""aJ@@CNa{:; R^$: DA UO ظx"(C)  $$lG ˶$.j E`f`fxJ 7ãOBMEMEMEMޏF0# i)6{}" psעעע#`fDct5YLJs^[S5t@R ufLI%d1Z,L_3`f`f`f`  'MrzW*--͍=ѵk'N;[ݥ湠WuZZZ<шg)nXռy\\\ܣDqwgw 5555O"оC^3G>*U6mi%Io̟fڵl4v8IRzz^xaDf;4rԳJII5kO?S^SUeV}Ԍ/ADCի M4{6oެ"U!7iӯQk!R|ٱO@^4iz8-C]r*IsxM4g\5k\UV{ѩS_v5id5iTWU͵OnkgRʺ}߿_ KwnJ**>>5EMQSEMQSԔkQS5Z5EM"_?L>CnެkVMj]tIAXQYZ={>bXӦMӧkh_+!>^{Ñqkڿڴin{())5yWnZbvکRnys_kNX^J{I аau4:<_zif>z}H?q\\;wĉ>E s5EM5EMQSEMQSԔkQS59|L_I~ʾuR$I*+ *K!pI%FRIRS8jȼ[li|~%٘bx{kEDDlڹ @5*p?͚5S*Ç̙3N+܋5쟃DM!) QSj9HT^M;wҟT,YRƏԩӴeVeff̙3ڿ/kڻw4e ŋhr*--M;vTPPѱ #00@۶)11Q/RRRԫWO>p@3F5￿XdR%&&IjժsEPSΡ,j9EM9)PS/#Я_?mVK $MzyM0^*U.]uc޼}ԵêZ㎼ҥK/{TFMZc.]کc!-pe˩O;f6l={~d64jу>]K//k֬9k4mGl?Er5gQSΡ,j9EM9B~Y X|jZg>E$צi)oΝ;:uEgCA\ػPSkQSkQSkQS}D4ThJt}ڶ}{qw ZW\S "T;~zRRR[Y~4mEm?xw*UΝcb!<<^bb$iɒڵkF+s4oŝ5[^=[uꄩI&=̚޴I˖.Ν;Ԯm[gw4v8/5:vz]ƁP.D?~ca=CեKtСb-<OIǛ1EŜч|P]nZ;Ѩ(5xVw3#=Baƚlu֭{x/z:q*U$IWzoժUb!Ǝz!ݻzaÞ$;V)ZtI P`@,YlIxbվC-ZtQUٱ'){ɓդiS^!T͚7O>1|ffO@^4щ'x) oQjP0P׳C___mVǎIjjq.]'NJZ$)&&FA͛7_c}wO1222tr ] )/IԱ:$GSO>+FX!4lpj?dIzy4mG 6tin5㣕+>1cղ坺B~Y*==- ԑ-!.)BQRrv=[4???*55U;uR4uUQC;? !KR. _z,W.ݻv:_l{x/.:3G]Zt15'⨧O+t9W>=X_kZG.>Kjժ/Xgw(EFvpYE_T2eT&8Xǎ3S11 Q```͋9`U\\-{l}(>>AfTDD:s$vX|||kGլYCeaFҵk[g? GUz zz@𤺒;w?c̀)tEI\͚6UbBb(jRS֜>}Z;vlףQQ}zk옱jذIf^f͚hX~yϛ7WջOv}8oؤoNzyM0^*U.]u}i׮֬^k֨e;5w<\B5rE\̓*>>^_~>{OpO'mX^ժVc}If7 M|JOOמ={4p ju/XghI@!yJӬY3}n6nܨwҚkaz5wEM"5tS]S@+ƶ9==]Nx^WT\9])8(]}+t39}ZۛdeezAf8rTo-=s;-_K~#0*Pg8rT/[,???IRH _ϥk>&Qm_&=SnȕQ:i0ZzƝSjU/Y-?lkԱ}{KxUk?ӗ+!7ncG{-$maz讉8l`0h-[emz>Z_p>zGqgޢh"Elh埬MhƔeҹn+WNO'>WQ1 IDATn 9pϚ,`^?ojSOiԤQF,YRիUY3eֵf:[N컋?9;PҥdM2]=/Խ%I>>> PAvݾ!l̩}w(L`Nx;zOo^z=O^%IiijFBʗWP==ti=G }|&MZ| ޵t} sxիSG5W 'Y PAcF>yVIR^=VUAW*d5}fXz!223uw6*S&Xak+Ayewf4C9MAnI3xmo:'U>ڹG}v>R233|V>$eff*--j[>mwسqr";5ʐz\uۤQcy$)))Ilޢrrk9Om={Ztgz|ӮMwlu0u2&F7_2gq6w>%M*`UD uܭ~hp.,ReT))%e?r,eee9lURu=5b? VJ4|h$)/}8zDI%JP/֞d0ty~H^ʕٳq2/W:v蠹 ҩӧzvޭ۾*V ՁwNW\q^P@uyH罡~] z߶'.]~@IZJ{;vPHHy/RRr|MTr%娯ɗ/kot!>^W^_) @esF#M6C?YW_@Qs8{˚]%ZgTnX୷wJ*p; ժQC4*]T>!~)"<{~yu"&Fgp&ꍷְQczuU7Kh!CԢy {eMP9Eʔ]R*UopP:w漱@ jܸ|,YRwԬß?п.S6ձC[J|}}^˗/m۵pbfz*ﯬ,ŞSŊv_jZP((IEe({"9,/ LyȢovG>+{k{x"S#Gٻo.d[1\w[$]yRF ښEY.9򤲇B  <3ꔤ}&_ @%9::Bs7IJř[Ӝl`̨"[Nt]v/]J/}wtJ'vv4Y t1Hj0NV^C)nO'CW`8!"E$ɐȔ}L֦◳0Y.TnݺvmZw/U!<(kW=ߏ=ԱcǮ*{dI2rֆkGF!I! 3Qk(w)')DRYI9r۲v,YYx:ː>)iht=rY y Q ;'bX~<d楜 |M>YApV((v<{}c+0rFndYFycj9;;5'q&06epd-0Ii r#ehd=!?],âײ| IlFkӀZhdkQ~'wpl`d:dd>(ҍae}M@֜I ed50hҍAQF cd:}[s F"EFY r_ed-86w 헙ܒf:Hq,?oT-hePhtx"[O#7h#gB"{S ;鵩BYX[lEF`(wm+07r"G[~#{s6ߑEF[70r&8r&$*EF1vkZn$]RZ{\O~Foc/ı EYB"RAnI ,#gG#r EGeh#[P~|ߚlbm?k,_[[&btY9;g{YmêLzmz˧YK|L޳57r&42}(X~B[ y*lPDxQ>G~v/7olhdkpƙ^6ku7(HL(@r L_9doǷዳa!S9{g$km$, 'Ա9< gSaGw& bRkp+s4)m ?-U3tN"#p)hLT(+Ø쾄Efla@]s#܌ $$2UT !k< TA@=$2UMqSiHPX {Fō?IENDB`pdfarranger-1.11.0/doc/000077500000000000000000000000001463504064500146415ustar00rootroot00000000000000pdfarranger-1.11.0/doc/pdfarranger.1000066400000000000000000000017441463504064500172240ustar00rootroot00000000000000.TH PDFARRANGER 1 "May 2019" "version 1.2" "User Manuals" .SH "NAME" pdfarranger \- Application for PDF Merging, Rearranging, Splitting, and Cropping .SH "SYNOPSIS" .B pdfarranger [file1] [file2] ... .SH "DESCRIPTION" .B PDF Arranger is a small python-gtk application, which helps the user to merge or split pdf documents and rearrange their pages using an interactive and intuitive graphical interface. In the current version, page rotation and cropping is also supported. PDF Arranger is a frontend for pikepdf. .SH "OPTIONS" Currently PDF Arranger doesn't receive any options. .SH "FILES" $HOME/.config/pdfarranger/config.ini .SH "ENVIRONMENT" All gtk related environment variables. .SH "DIAGNOSTICS" Common python and gtk diagnostics. .SH "AUTHOR" Konstantinos Poulios , Jerome Robert .SH COPYRIGHT Copyright \(co 2008-2017 Konstantinos Poulios, 2018-2019 Jerome Robert .br .SH LICENSE GNU GPL version 3 or later . pdfarranger-1.11.0/pdfarranger.spec000066400000000000000000000135721463504064500172530ustar00rootroot00000000000000# If you change this file, please inform @dreua since I most likely have to # apply these changes to the other pdfarranger spec file I maintain, too. # Help for future-me: meld ~/fedora-scm/pdfarranger/*.spec ~/git/pdfarranger/*.spec # These must come from the calling environment %global repo %{getenv:GITHUB_REPOSITORY} %global sha %{getenv:GITHUB_SHA} %global shortcommit %(c=%{sha}; echo ${c:0:7}) %define build_timestamp %(date +"%%Y%%m%%d") Name: pdfarranger Version: 0 Release: %{build_timestamp}git%{shortcommit}%{?dist} Summary: PDF file merging, rearranging, and splitting License: GPLv3 URL: https://github.com/%{repo} Source0: %{url}/archive/%{shortcommit}/%{name}-%{shortcommit}.tar.gz BuildArch: noarch # https://fedoraproject.org/wiki/Changes/EncourageI686LeafRemoval ExcludeArch: %{ix86} BuildRequires: gettext BuildRequires: python3-devel # For checks only BuildRequires: libappstream-glib BuildRequires: desktop-file-utils Recommends: python3-img2pdf >= 0.3.4 # These seem to be included in the default desktop install Requires: python3-gobject Requires: gtk3 Requires: python3-cairo Requires: poppler-glib Provides: pdfshuffler = %{version}-%{release} Obsoletes: pdfshuffler < 0.6.1-1 # The repository changed to pdfarranger/pdfarranger but we leave the app_id # for now. %global app_id com.github.jeromerobert.pdfarranger %description PDF Arranger is a small python-gtk application, which helps the user to merge or split pdf documents and rotate, crop and rearrange their pages using an interactive and intuitive graphical interface. It is a frontend for pikepdf. PDF Arranger is a fork of Konstantinos Poulios’s PDF-Shuffler. %prep %autosetup -p1 -n %{name}-%{sha} %generate_buildrequires %pyproject_buildrequires -R %build %pyproject_wheel %pyproject_install %pyproject_save_files %{name} %find_lang %{name} ln -s pdfarranger %{buildroot}%{_bindir}/pdfshuffler %check desktop-file-validate %{buildroot}/%{_datadir}/applications/%{app_id}.desktop appstream-util validate-relax --nonet %{buildroot}%{_metainfodir}/*.metainfo.xml %files -f %{name}.lang -f %{pyproject_files} %license COPYING %doc README.md %{_mandir}/man*/*.* %{_datadir}/icons/hicolor/*/apps/* %{_metainfodir}/%{app_id}.metainfo.xml %{_datadir}/applications/%{app_id}.desktop %{_datadir}/%{name}/ %{_bindir}/pdfarranger %if 0%{?fedora} > 31 %{_bindir}/pdfshuffler %endif %changelog * Sat Dec 12 2020 David Auer - 0-20201212git%{shortcommmit}.0.1 - Modified for pdfarranger-CI: Build given commit. * Thu Mar 18 2021 David Auer - 1.7.1-1 - Update to 1.7.1 - Update repository URL (was a redirection anyway) * Tue Jan 26 2021 Fedora Release Engineering - 1.7.0-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild * Sun Jan 24 2021 David Auer - 1.7.0-2 - Add dependency: dateutil * Sun Jan 24 2021 David Auer - 1.7.0-1 - Update to 1.7.0 * Sat Aug 01 2020 David Auer - 1.6.2-1 - Update to 1.6.2 * Tue Jul 28 2020 Fedora Release Engineering - 1.6.0-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild * Thu Jul 16 2020 David Auer - 1.6.0-2 - Recommend img2pdf * Wed Jul 15 2020 David Auer - 1.6.0-1 - Update to 1.6.0 - Require pikepdf >= 1.15.1 as suggested in Readme. * Wed Jun 24 2020 David Auer - 1.5.3-3 - Explicitly require python3-setuptools * Tue May 26 2020 Miro Hrončok - 1.5.3-2 - Rebuilt for Python 3.9 * Sun May 17 2020 David Auer - 1.5.3-1 - Update to 1.5.3 * Mon Apr 20 2020 David Auer - 1.5.1-1 - Update to 1.5.1 (#1823971) - Fixes rhbz#1824017 * Wed Apr 15 2020 David Auer - 1.5.0-1 - Update to 1.5.0 (#1823971) * Tue Mar 17 2020 Fabian Affolter - 1.4.2-1 - Update to new upstream version 1.4.2 (rhbz#1814032) * Sun Feb 09 2020 Fedora Release Monitoring - 1.4.1-1 - Update to 1.4.1 (#1800993) * Sat Feb 01 2020 David Auer - 1.4.0-1 - New version, see https://github.com/jeromerobert/pdfarranger/releases/tag/1.4.0 - Replace python3-PyPDF2 with python3-pikepdf * Wed Jan 29 2020 Fedora Release Engineering - 1.3.1-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild * Wed Sep 25 2019 David Auer - 1.3.1-2 - replace pdfshuffler on f32+ * Sun Sep 22 2019 David Auer - 1.3.1-1 - New version, see https://github.com/jeromerobert/pdfarranger/releases/tag/1.3.1 * Wed Sep 11 2019 David Auer - 1.3.0-2 - Add missing dependency - Remove unnecessary python_provide macro * Sun Aug 11 2019 David Auer - 1.3.0-1 - New version, see https://github.com/jeromerobert/pdfarranger/releases/tag/1.3.0 - Remove obsolete downstream fixes * Tue Jun 11 2019 David Auer - 1.2.1-8 - Better source URL * Mon May 20 2019 David Auer - 1.2.1-7 - Fix directory ownership - Replace obsolete srcname by name * Mon May 20 2019 David Auer - 1.2.1-6 - Name changed from python-pdfarranger to pdfarranger - Remove shebang in __main__.py * Sat May 18 2019 David Auer - 1.2.1-5 - Fix rpmlint errors and warnings * Sat May 18 2019 David Auer - 1.2.1-4 - Building with wheel to get lang and icons right * Sat May 18 2019 David Auer - 1.2.1-3 - Move Requires to the right location * Sat May 18 2019 David Auer - 1.2.1-2 - Add missing requires * Sat May 18 2019 David Auer - 1.2.1 - Packaging pdfarranger based on pdfshuffler's spec file and https://docs.fedoraproject.org/en-US/packaging-guidelines/Python/#_example_python_spec_file pdfarranger-1.11.0/pdfarranger/000077500000000000000000000000001463504064500163675ustar00rootroot00000000000000pdfarranger-1.11.0/pdfarranger/__init__.py000066400000000000000000000000001463504064500204660ustar00rootroot00000000000000pdfarranger-1.11.0/pdfarranger/__main__.py000066400000000000000000000001301463504064500204530ustar00rootroot00000000000000import sys from pdfarranger import pdfarranger pdfarranger.PdfArranger().run(sys.argv) pdfarranger-1.11.0/pdfarranger/config.py000066400000000000000000000266631463504064500202230ustar00rootroot00000000000000# Copyright (C) 2020 pdfarranger contributors # # pdfarranger 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. import platform import configparser import os import sys import gettext from gi.repository import Gdk from gi.repository import Gtk from .exporter import PrintSettingsWidget _ = gettext.gettext # See https://gitlab.gnome.org/GNOME/gtk/-/blob/3.24.23/gdk/keynames.txt for list of keys _DEFAULT_ACCELS = [ ('delete', 'Delete'), ('page-size', 's'), ('crop', 'c'), ('hide', 'h'), ('rotate(90)', 'Right'), ('rotate(-90)', 'Left'), ('save', 's'), ('save-as', 's'), ('export-selection(2)', 'e'), ('export-all', 'e'), ('print', 'p'), ('close', 'w'), ('quit', 'q'), ('new', 'n'), ('open', 'o'), ('import', 'i'), ('zoom-in', 'plus KP_Add plus KP_Add'), ('zoom-out', 'minus KP_Subtract minus KP_Subtract'), ('zoom-fit', 'f'), ('fullscreen', 'F11'), ('undo', 'z'), ('redo', 'y'), ('cut', 'x'), ('copy', 'c'), ('paste(0)', 'v'), ('paste(1)', 'v'), ('paste(4)', 'o'), ('paste(5)', 'u'), ('select(0)', 'a'), ('select(1)', 'a'), ('main-menu', 'F10'), ('metadata', 'Return'), ('context-menu', 'F10 Menu'), ] class Config(object): """Wrap a ConfigParser object for PDFArranger""" @staticmethod def __get_action_list(m, r): for i in range(m.get_n_items()): it = m.iterate_item_attributes(i) target, action = None, None while it.next(): if it.get_name() == 'target': target = it.get_value() elif it.get_name() == 'action': action = it.get_value() if action is not None: action = action.get_string()[4:] if target is not None: action += "({})".format(target) r.append(action) it = m.iterate_item_links(i) while it.next(): Config.__get_action_list(it.get_value(), r) return r @staticmethod def _config_file(domain): """Return the location of the configuration file""" if os.name == 'nt' and getattr(sys, 'frozen', False): p = os.path.dirname(sys.executable) config_ini = os.path.join(p, 'config.ini') if os.path.isfile(config_ini): return config_ini home = os.path.expanduser("~") if platform.system() == 'Darwin': p = os.path.join(home, 'Library', 'Preferences') elif 'APPDATA' in os.environ: p = os.getenv('APPDATA') elif 'XDG_CONFIG_HOME' in os.environ: p = os.getenv('XDG_CONFIG_HOME') else: p = os.path.join(home, '.config') p = os.path.join(p, domain) os.makedirs(p, exist_ok=True) return os.path.join(p, 'config.ini') def __init__(self, domain): self.domain = domain self.data = configparser.ConfigParser() self.data.add_section('window') self.data.read(Config._config_file(domain)) if 'preferences' not in self.data: self.data.add_section('preferences') if 'print-settings' not in self.data: self.data.add_section('print-settings') if 'accelerators' not in self.data: self.data.add_section('accelerators') a = self.data['accelerators'] if 'enable_custom' not in a: a['enable_custom'] = 'false' enable_custom = a.getboolean('enable_custom') for k, v in _DEFAULT_ACCELS: if not enable_custom or k not in a: a[k] = v self.popup_menu_accels = [ Gtk.accelerator_parse(x) for x in a["context-menu"].split() ] def is_popup_key_event(self, keyevent): for key, mods in self.popup_menu_accels: # `& mods` lets us ignore all other modifiers (e.g. numlock) if keyevent.state & mods == mods and keyevent.keyval == key: return True return False def window_size(self): ds = Gdk.Screen.get_default() return self.data.getint('window', 'width', fallback=int(min(700, ds.get_width() / 2))), \ self.data.getint('window', 'height', fallback=int(min(600, ds.get_height() - 50))) def set_window_size(self, size): self.data.set('window', 'width', str(size[0])) self.data.set('window', 'height', str(size[1])) def set_position(self, position): self.data.set('window', 'root_x', str(position[0])) self.data.set('window', 'root_y', str(position[1])) def position(self): return self.data.getint('window', 'root_x', fallback=10), self.data.getint('window', 'root_y', fallback=10) def maximized(self): return self.data.getboolean('window', 'maximized', fallback=False) def set_maximized(self, maximized): self.data.set('window', 'maximized', str(maximized)) def zoom_level(self): return self.data.getint('preferences', 'zoom-level', fallback=0) def set_zoom_level(self, level): self.data.set('preferences', 'zoom-level', str(level)) def content_loss_warning(self): return self.data.getboolean('preferences', 'content-loss-warning', fallback=True) def set_content_loss_warning(self, enabled): self.data.set('preferences', 'content-loss-warning', str(enabled)) def show_save_warnings(self): return self.data.getboolean('preferences', 'show-save-warnings', fallback=True) def set_show_save_warnings(self, enabled): self.data.set('preferences', 'show-save-warnings', str(enabled)) def language(self): return self.data.get('preferences', 'language', fallback="") def set_language(self, language): self.data.set('preferences', 'language', language) def theme(self): return self.data.get('preferences', 'theme', fallback="") def set_theme(self, theme): self.data.set('preferences', 'theme', theme) def scale_mode(self): return self.data.get('print-settings', 'scale-mode', fallback="PRINTABLE") def set_scale_mode(self, mode): self.data.set('print-settings', 'scale-mode', mode) def auto_rotate(self): return self.data.getboolean('print-settings', 'auto-rotate', fallback=False) def set_auto_rotate(self, enabled): self.data.set('print-settings', 'auto-rotate', str(enabled)) def save(self): conffile = Config._config_file(self.domain) os.makedirs(os.path.dirname(conffile), exist_ok=True) with open(conffile, 'w') as f: self.data.write(f) def set_actions(self, builder): """ Set the list of actions to which shortcuts may be associated. :param builder: A Gtk.Builder from which to get actions """ actions = [] for m in builder.get_objects(): self.__get_action_list(m, actions) actions = set(actions) accels_section = self.data['accelerators'] for a in actions: if a not in accels_section: accels_section[a] = "" # Have accelerators sorted in the .ini file (cosmetic) sortedaccels = [(k, v) for k, v in accels_section.items() if k != 'enable_custom'] sortedaccels = sorted(sortedaccels) enable_custom = accels_section['enable_custom'] accels_section.clear() accels_section['enable_custom'] = enable_custom accels_section.update(sortedaccels) def get_accels(self): """Return the accelerators for each actions.""" return [ (k, v.split()) for k, v in self.data["accelerators"].items() if k != "enable_custom" ] def preferences_dialog(self, parent, localedir, handy_available): """A dialog for some application preferences.""" d = Gtk.Dialog(title=_("Preferences"), parent=parent, flags=Gtk.DialogFlags.MODAL, buttons=( _("_Cancel"), Gtk.ResponseType.CANCEL, _("_OK"), Gtk.ResponseType.OK, ), ) d.set_resizable(False) hbox = Gtk.Box(spacing=6, margin=8) frame = Gtk.Frame(label=_("Language"), margin=8) combo = Gtk.ComboBoxText(margin=8) label = Gtk.Label(_("(Requires restart)")) hbox.pack_start(combo, False, False, 8) hbox.pack_start(label, False, False, 8) frame.add(hbox) d.vbox.pack_start(frame, False, False, 8) hbox2 = Gtk.Box(spacing=6, margin=8) frame2 = Gtk.Frame(label=_("Theme"), margin=8) combo2 = Gtk.ComboBoxText(margin=8) label2 = Gtk.Label("" if handy_available else _("(Libhandy missing)")) hbox2.pack_start(combo2, False, False, 8) hbox2.pack_start(label2, False, False, 8) frame2.add(hbox2) d.vbox.pack_start(frame2, False, False, 8) frame3 = Gtk.Frame(label=_("Printing"), margin=8) psettings = PrintSettingsWidget(self.scale_mode(), self.auto_rotate()) frame3.add(psettings) d.vbox.pack_start(frame3, False, False, 8) t = _("For more options see:") frame4 = Gtk.Frame(label=t, shadow_type=Gtk.ShadowType.NONE, margin=8) label4 = Gtk.Label(self._config_file(self.domain), selectable=True, margin=8) frame4.add(label4) d.vbox.pack_start(frame4, False, False, 8) langs = [] if os.path.isdir(localedir): langs = os.listdir(localedir) langs.append("en") langs.sort() langs.insert(0, _("System setting")) for lan in langs: combo.append(None, lan) lang = self.language() if lang in langs: combo.set_active(langs.index(lang)) else: combo.set_active(0) themes = [_("System setting"), "light", "dark"] for the in themes: combo2.append(None, the) theme = self.theme() if theme in themes: combo2.set_active(themes.index(theme)) else: combo2.set_active(0) combo2.set_sensitive(handy_available) d.show_all() result = d.run() if result == Gtk.ResponseType.OK: num = combo.get_active() language = langs[num] if num != 0 else "" self.set_language(language) num2 = combo2.get_active() theme = themes[num2] if num2 != 0 else "" self.set_theme(theme) self.set_scale_mode(psettings.get_scale_mode()) self.set_auto_rotate(psettings.get_auto_rotate()) d.destroy() pdfarranger-1.11.0/pdfarranger/core.py000066400000000000000000001030701463504064500176720ustar00rootroot00000000000000# Copyright (C) 2020 pdfarranger contributors # # pdfarranger 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. __all__ = [ "img2pdf_supported_img", "Page", "PageAdder", "PDFDoc", "PDFDocError", "PDFRenderer", ] import sys import os import traceback import mimetypes import copy import pathlib import shutil import tempfile import threading import packaging.version as version from typing import NamedTuple, Optional, Tuple, Union import gettext import gi from gi.repository import GObject from gi.repository import GLib from gi.repository import Gtk gi.require_version("Poppler", "0.18") from gi.repository import Poppler # for the rendering of pdf pages import cairo from math import pi try: import img2pdf img2pdf.Image.init() img2pdf_supported_img = [ i for i in img2pdf.Image.MIME.values() if i.split("/")[0] == "image" ] except ImportError: img2pdf_supported_img = [] img2pdf = None _ = gettext.gettext Numeric = Union[float, int] class Sides(NamedTuple): left: Numeric = 0 right: Numeric = 0 top: Numeric = 0 bottom: Numeric = 0 def __neg__(self) -> "Sides": """ Pointwise unary minus Example: >>> -Sides(9, 3, 12, 6) Sides(left=-9, right=-3, top=-12, bottom=-6) """ return Sides(*(-self[i] for i in range(4))) def __add__(self, other: Union["Sides", Numeric]) -> "Sides": """ Pointwise addition Example: >>> Sides(9, 3, 12, 6) + Sides(1, 2, 3, 4) Sides(left=10, right=5, top=15, bottom=10) >>> Sides(9, 3, 12, 6) + 1 Sides(left=10, right=4, top=13, bottom=7) """ if isinstance(other, Sides): return Sides(*(self[i] + other[i] for i in range(4))) else: return Sides(*(self[i] + other for i in range(4))) def __sub__(self, other: Union["Sides", Numeric]) -> "Sides": """ Pointwise subtraction Example: >>> Sides(9, 3, 12, 6) - Sides(1, 2, 3, 4) Sides(left=8, right=1, top=9, bottom=2) >>> Sides(9, 3, 12, 6) - 3 Sides(left=6, right=0, top=9, bottom=3) """ if isinstance(other, Sides): return Sides(*(self[i] - other[i] for i in range(4))) else: return Sides(*(self[i] -+ other for i in range(4))) def __mul__(self, other: Union["Sides", Numeric]) -> "Sides": """ Pointwise multiplication Example: >>> Sides(9, 3, 12, 6) * Sides(1, 2, 3, 4) Sides(left=9, right=6, top=36, bottom=24) >>> Sides(9, 3, 12, 6) * 3 Sides(left=27, right=9, top=36, bottom=18) """ if isinstance(other, Sides): return Sides(*(self[i] * other[i] for i in range(4))) else: return Sides(*(self[i] * other for i in range(4))) def __truediv__(self, other: Union["Sides", Numeric]) -> "Sides": """ Pointwise division Example: >>> Sides(9, 3, 12, 6) / Sides(1, 2, 3, 4) Sides(left=9.0, right=1.5, top=4.0, bottom=1.5) >>> Sides(9, 3, 12, 6) / 3 Sides(left=3.0, right=1.0, top=4.0, bottom=2.0) """ if isinstance(other, Sides): return Sides(*(self[i] / other[i] for i in range(4))) else: return Sides(*(self[i] / other for i in range(4))) def rotated(self, times: int) -> "Sides": """ Rotate 90 degrees counter-clockwise 'times' times Examples: >>> Sides(9,3,12,6).rotated(1) Sides(left=12, right=6, top=3, bottom=9) >>> Sides(9,3,12,6).rotated(-3) == Sides(9,3,12,6).rotated(1) True """ perm = (0, 2, 1, 3) return Sides(*(self[perm[(x + times) % 4]] for x in perm)) class Dims(NamedTuple): width: Numeric height: Numeric def __neg__(self) -> "Dims": """ Pointwise unary minus Example: >>> -Dims(612, 792) Dims(width=-612, height=-792) """ return Dims(*(-self[i] for i in range(2))) def __add__(self, other: Union["Dims", Numeric]) -> "Dims": """ Pointwise addition Example: >>> Dims(612, 792) + Dims(612, 792) Dims(width=1224, height=1584) >>> Dims(612, 792) + 100 Dims(width=712, height=892) """ if isinstance(other, Dims): return Dims(*(self[i] + other[i] for i in range(2))) else: return Dims(*(self[i] + other for i in range(2))) def __sub__(self, other: Union["Dims", Numeric]) -> "Dims": """ Pointwise subtraction Example: >>> Dims(612, 792) - Dims(306, 396) Dims(width=306, height=396) >>> Dims(612, 792) - 100 Dims(width=512, height=692) """ if isinstance(other, Dims): return Dims(*(self[i] - other[i] for i in range(2))) else: return Dims(*(self[i] -+ other for i in range(2))) def __mul__(self, other: Union["Dims", Numeric]) -> "Dims": """ Pointwise multiplication Example: >>> Dims(612, 792) * Dims(0.5, 0.25) Dims(width=306.0, height=198.0) >>> Dims(612, 792) * 2 Dims(width=1224, height=1584) """ if isinstance(other, Dims): return Dims(*(self[i] * other[i] for i in range(2))) else: return Dims(*(self[i] * other for i in range(2))) def __truediv__(self, other: Union["Dims", Numeric]) -> "Dims": """ Pointwise division Example: >>> Dims(612, 792) / Dims(2, 4) Dims(width=306.0, height=198.0) >>> Dims(612, 792) / 2 Dims(width=306.0, height=396.0) """ if isinstance(other, Dims): return Dims(*(self[i] / other[i] for i in range(2))) else: return Dims(*(self[i] / other for i in range(2))) def flipped(self) -> "Dims": """Swap height and width""" return Dims(self.height, self.width) def scaled(self, factor: float) -> "Dims": """Scale by factor""" return Dims(self.width * factor, self.height * factor) def int_scaled(self, factor: float) -> "Dims": """Scale by factor and round to nearest int""" return Dims(int(self.width * factor + 0.5), int(self.height * factor + 0.5)) def cropped(self, crop: Sides) -> "Dims": """Crop using crop array""" return Dims(self.width * (1 - crop.left - crop.right), self.height * (1 - crop.top - crop.bottom)) class BasePage: """Common base class for Page and LayerPage""" def __init__(self, nfile, npage, copyname, angle, scale, crop: Sides, size_orig: Dims): self.nfile = nfile """The ID (from 1 to n) of the PDF file owning the page""" self.npage = npage """The ID (from 1 to n) of the page in its owner PDF document""" self.copyname = copyname """Filepath to the temporary stored file""" self.angle = angle self.scale = scale self.crop = crop """Left, right, top, bottom crop""" self.size_orig = size_orig """Width and height of the original page""" self.size = size_orig if angle in [0, 180] else size_orig.flipped() """Width and height""" def width_in_points(self) -> Numeric: """Return the page width in PDF points.""" return self.size_in_points().width def height_in_points(self) -> Numeric: """Return the page height in PDF points.""" return self.size_in_points().height def size_in_points(self) -> Dims: """Return the page size in PDF points.""" return self.size.scaled(self.scale).cropped(self.crop) def width_in_pixel(self): return self.size_in_pixel().width def height_in_pixel(self): return self.size_in_pixel().height def size_in_pixel(self): return self.size_in_points().int_scaled(self.zoom) @staticmethod def rotate_times(angle: int) -> int: """Convert an angle in degree to a number of 90° rotation (integer).""" return round((-angle / 90) % 4) class Page(BasePage): def __init__(self, nfile, npage, zoom, copyname, angle, scale, crop: Sides, hide: Sides, size_orig: Dims, basename, layerpages): super().__init__(nfile, npage, copyname, angle, scale, Sides(*crop), size_orig) self.zoom = zoom self.hide = Sides(*hide) """Left, right, top, bottom hide""" self.thumbnail = None self.resample = -1 self.preview = None """A low resolution thumbnail""" #: The name of the original file self.basename = basename """The name of the original file""" self.layerpages = list(layerpages) def __repr__(self): return (f"Page({self.nfile}, {self.npage}, {self.zoom}, '{self.copyname}', " f"{self.angle}, {self.scale}, {self.crop}, {self.hide}, " f"{self.size_orig}, '{self.basename}', {self.layerpages})") def description(self): shortname = os.path.splitext(self.basename)[0] return "".join([shortname, "\n", _("page"), " ", str(self.npage)]) def rotate(self, angle: int): rt = self.rotate_times(angle) if rt == 0: return False self.crop = self.crop.rotated(rt) self.hide = self.hide.rotated(rt) self.angle = (self.angle + int(angle)) % 360 self.size = self.size_orig if self.angle in [0, 180] else self.size_orig.flipped() for lp in self.layerpages: lp.rotate(rt) return True def unmodified(self): u = (self.angle == 0 and self.crop == Sides() and self.hide == Sides() and self.scale == 1 and len(self.layerpages) == 0) return u def serialize(self): """Convert to string for copy/past operations.""" lpdata = [lp.serialize() for lp in self.layerpages] ts = [self.copyname, self.npage, self.basename, self.angle, self.scale] ts += list(self.crop) + list(self.hide) + list(lpdata) return "\n".join([str(v) for v in ts]) def duplicate(self, incl_thumbnail=True): r = copy.copy(self) r.layerpages = [lp.duplicate() for lp in r.layerpages] if incl_thumbnail == False: del r.thumbnail # to save ram r.thumbnail = None r.preview = None return r def split(self, vcrops, hcrops): """Split this page into a grid and return all but the top-left page.""" newpages = [] left, right, top, bottom = self.crop # If the page is cropped, adjust the new crop for the visible part of the page. hscale = 1 - (left + right) vscale = 1 - (top + bottom) vcrops = [(l * hscale, r * hscale) for (l, r) in vcrops] hcrops = [ (t * vscale, b * vscale) for (t, b) in hcrops] for (t, b) in reversed(hcrops): topcrop = top + t row_height = b - t bottomcrop = 1 - (topcrop + row_height) for (l, r) in reversed(vcrops): leftcrop = left + l col_width = r - l rightcrop = 1 - (leftcrop + col_width) crop = Sides(leftcrop, rightcrop, topcrop, bottomcrop) if l == 0.0 and t == 0.0: # Update the original page self.crop = crop else: # Create a new cropped page new = self.duplicate() new.crop = crop newpages.append(new) return newpages class LayerPage(BasePage): """Page added as overlay or underlay on a Page.""" def __init__(self, nfile, npage, copyname, angle, scale, crop, offset, laypos, size_orig: Dims): super().__init__(nfile, npage, copyname, angle, scale, Sides(*crop), size_orig) self.offset = Sides(*offset) """Left, right, top, bottom offset from dest page edges""" self.laypos = laypos """OVERLAY or UNDERLAY""" def __repr__(self): return (f"LayerPage({self.nfile}, {self.npage}, '{self.copyname}', {self.angle}, " f"{self.scale}, {self.crop}, {self.offset}, '{self.laypos}', {self.size_orig})") def rotate(self, times: int): if times != 0: self.crop = self.crop.rotated(times) self.offset = self.offset.rotated(times) self.angle = (self.angle - 90 * times) % 360 self.size = self.size if times % 2 == 0 else self.size.flipped() def serialize(self): """Convert to string for copy/past operations.""" ts = [self.copyname, self.npage, self.angle, self.scale, self.laypos] ts += list(self.crop) + list(self.offset) return "\n".join([str(v) for v in ts]) def duplicate(self): r = copy.copy(self) return r class PDFDocError(Exception): def __init__(self, message): self.message = message class _UnknownPasswordException(Exception): pass class PasswordDialog(Gtk.Dialog): def __init__(self, parent, filename): super().__init__( title=_("Password required"), parent=parent, flags=Gtk.DialogFlags.MODAL, buttons=( "_Cancel", Gtk.ResponseType.CANCEL, "_OK", Gtk.ResponseType.OK, ), ) self.set_default_response(Gtk.ResponseType.OK) bottommsg = _("The password will be remembered until you close PDF Arranger.") topmsg = _("The document “{}” is locked and requires a password before it can be opened.") label = Gtk.Label(label=topmsg.format(filename)) label.set_max_width_chars(len(bottommsg)-6) label.set_line_wrap(True) label.set_size_request(0, -1) self.vbox.pack_start(label, False, False, 12) box = Gtk.HBox() self.entry = Gtk.Entry() self.entry.set_visibility(False) self.entry.set_activates_default(True) box.pack_start(Gtk.Label(label=_("Password")), False, False, 6) box.pack_start(self.entry, True, True, 6) self.vbox.pack_start(box, True, True, 0) self.vbox.pack_start(Gtk.Label(label=bottommsg), False, False, 12) self.set_resizable(False) def get_password(self): self.show_all() r = self.run() t = self.entry.props.text self.destroy() if r == Gtk.ResponseType.OK: return t else: raise _UnknownPasswordException() def _img_to_pdf(images, tmp_dir): """Wrap img2pdf.convert to handle some corner cases""" fd, pdf_file_name = tempfile.mkstemp(suffix=".pdf", dir=tmp_dir) os.close(fd) try: # Try to handle invalid EXIF rotation rot = img2pdf.Rotation.ifvalid except AttributeError: # img2pdf is too old so we can't support invalid EXIF rotation rot = None with open(pdf_file_name, "wb") as f: if version.parse(img2pdf.__version__) < version.Version('0.4.2'): for num, image in enumerate(images): if isinstance(image, str): img = img2pdf.Image.open(image) else: img = img2pdf.Image.open(img2pdf.BytesIO(image)) if (img.mode == "LA") or (img.mode != "RGBA" and "transparency" in img.info): # TODO: Find a way to keep image in P or L format and remove transparency. # This will work but converting from 1, L, P to RGB is not optimal. img = img.convert("RGBA") if img.mode == "RGBA": # Remove transparency as old img2pdf doesn't support it bg = img2pdf.Image.new("RGB", img.size, (255, 255, 255)) bg.paste(img, mask=img.split()[-1]) imgio = img2pdf.BytesIO() bg.save(imgio, "PNG") imgio.seek(0) images[num] = imgio try: pdf = img2pdf.convert(images, rotation=rot) except ValueError as e: # Too small or large image raise PDFDocError(e) f.write(pdf) return pdf_file_name class PDFDoc: """Class handling PDF documents.""" def __from_file(self, parent, basename): uri = pathlib.Path(self.copyname).as_uri() askpass = False while True: try: if askpass: self.password = PasswordDialog(parent, basename).get_password() self.document = Poppler.Document.new_from_file(uri, self.password) # When there is no encryption Poppler want None as password # while PikePDF want an empty string self.password = "" if self.password is None else self.password return except GLib.Error as e: askpass = e.message == "Document is encrypted" if not askpass: raise e def __init__(self, filename, basename, blank_size, stat, tmp_dir, parent): self.render_lock = threading.Lock() self.filename = os.path.abspath(filename) self.stat = stat if basename is None: # When importing files self.basename = os.path.basename(filename) else: # When copy-pasting self.basename = basename self.blank_size = blank_size # != None if page is blank self.password = "" filemime = mimetypes.guess_type(self.filename)[0] if not filemime: raise PDFDocError(_("Unknown file format")) if filemime == "application/pdf": if self.filename.startswith(tmp_dir) and basename is None: # In the "Insert Blank Page" we don't need to copy self.filename self.copyname = self.filename self.basename = "" else: fd, self.copyname = tempfile.mkstemp(suffix=".pdf", dir=tmp_dir) os.close(fd) shutil.copy(self.filename, self.copyname) try: self.__from_file(parent, self.basename) except GLib.Error as e: raise PDFDocError(e.message + ": " + filename) elif filemime.split("/")[0] == "image": if not img2pdf: raise PDFDocError(_("Image files are only supported with img2pdf")) if mimetypes.guess_type(filename)[0] in img2pdf_supported_img: self.copyname = _img_to_pdf([filename], tmp_dir) uri = pathlib.Path(self.copyname).as_uri() self.document = Poppler.Document.new_from_file(uri, None) else: raise PDFDocError(_("Image format is not supported by img2pdf")) if filename.startswith(tmp_dir) and filename.endswith(".png"): os.remove(filename) self.basename = _("Clipboard image") else: raise PDFDocError(_("File is neither pdf nor image")) self.transparent_link_annots_removed = [False] * self.document.get_n_pages() def get_page(self, n_page): """Get a page where transparent link annotations are removed. By removing them memory usage will be lower. """ page = self.document.get_page(n_page) if self.transparent_link_annots_removed[n_page]: return page annot_mapping_list = page.get_annot_mapping() for annot_mapping in annot_mapping_list: a = annot_mapping.annot if a.get_annot_type() == Poppler.AnnotType.LINK and a.get_color() is None: page.remove_annot(a) self.transparent_link_annots_removed[n_page] = True return page class PageAdder: """Helper class to add pages to the current model.""" def __init__(self, app): #: A PdfArranger instance self.app = app #: The pages which will be added by the commit method self.pages = [] #: Where to insert pages relatively to treerowref self.before = False #: Where to insert pages. If None pages are inserted at the end self.treerowref = None self.stat_cache = {} self.content = [] self.pdfqueue_used = True def move(self, treerowref, before): """Insert pages at the given location.""" self.before = before self.treerowref = treerowref def get_pdfdoc(self, filename: str, basename: Optional[str] = None, blank_size=None) -> Optional[Tuple[PDFDoc, int, bool]]: """Get the pdfdoc object for the filename. pdfqueue is searched for the filename. If it is not found a pdfdoc is created and added to pdfqueue. Returns: pdfdoc object, it's file number, if a new pdfdoc was created. """ for i, it_pdfdoc in enumerate(self.app.pdfqueue): if filename == it_pdfdoc.copyname: # File of copy-pasted page was found in pdfqueue. # Files in tmp_dir are never modified by the app and are not expected # to be modified by the user either -> files are equal if names match. return it_pdfdoc, i + 1, False if not filename in self.stat_cache: try: s = os.stat(filename) self.stat_cache[filename] = s.st_dev, s.st_ino, s.st_mtime except OSError as e: print(traceback.format_exc()) self.app.error_message_dialog(e) return None for i, it_pdfdoc in enumerate(self.app.pdfqueue): if self.stat_cache[filename] == it_pdfdoc.stat: # Imported file was found in pdfqueue return it_pdfdoc, i + 1, False try: pdfdoc = PDFDoc(filename, basename, blank_size, self.stat_cache[filename], self.app.tmp_dir, self.app.window) except _UnknownPasswordException: return None except PDFDocError as e: print(e.message, file=sys.stderr) self.app.error_message_dialog(e.message) return None self.app.pdfqueue.append(pdfdoc) return pdfdoc, len(self.app.pdfqueue), True def get_layerpages(self, layerdata): """Create LayerPage objects from layerdata.""" layerpages = [] if layerdata is None: return layerpages for filename, npage, angle, scale, laypos, crop, offset in layerdata: doc_data = self.get_pdfdoc(filename) if doc_data is None: return None pdfdoc, nfile, _ = doc_data copyname = pdfdoc.copyname size = Dims(*pdfdoc.get_page(npage - 1).get_size()) ld = nfile, npage, copyname, angle, scale, crop, offset, laypos, size layerpages.append(LayerPage(*ld)) return layerpages def addpages(self, filename, page=-1, basename=None, angle=0, scale=1.0, crop=Sides(0, 0, 0, 0), hide=Sides(0, 0, 0, 0), layerdata=None): c = 'pdf' if page == -1 and os.path.splitext(filename)[1].lower() == '.pdf' else 'other' self.content.append(c) self.pdfqueue_used = len(self.app.pdfqueue) > 0 doc_data = self.get_pdfdoc(filename, basename) if doc_data is None: return pdfdoc, nfile, doc_added = doc_data if (doc_added and pdfdoc.copyname != pdfdoc.filename and basename is None and not (filename.startswith(self.app.tmp_dir) and filename.endswith(".png"))): self.app.import_directory = os.path.split(filename)[0] self.app.export_directory = self.app.import_directory n_end = pdfdoc.document.get_n_pages() n_start = min(n_end, max(1, page)) if page != -1: n_end = max(n_start, min(n_end, page)) layerpages = self.get_layerpages(layerdata) if layerpages is None: return for npage in range(n_start, n_end + 1): page = pdfdoc.document.get_page(npage - 1) self.pages.append( Page( nfile, npage, self.app.zoom_scale, pdfdoc.copyname, angle, scale, crop, hide, Dims(*page.get_size()), pdfdoc.basename, layerpages, ) ) def commit(self, select_added, add_to_undomanager): if len(self.pages) == 0: return False if add_to_undomanager: self.app.undomanager.commit("Add") if self.pdfqueue_used or len(self.content) > 1 or self.content[0] != 'pdf': self.app.set_unsaved(True) self.content = [] if not self.before and self.treerowref: self.pages.reverse() with self.app.render_lock(): for p in self.pages: m = [p, p.description()] if self.treerowref: iter_to = self.app.model.get_iter(self.treerowref.get_path()) if self.before: it = self.app.model.insert_before(iter_to, m) else: it = self.app.model.insert_after(iter_to, m) else: it = self.app.model.append(m) if select_added: path = self.app.model.get_path(it) self.app.iconview.select_path(path) if add_to_undomanager: self.app.update_iconview_geometry() GObject.idle_add(self.app.retitle) self.app.update_max_zoom_level() self.app.silent_render() self.app.update_statusbar() self.scroll() self.pages = [] return True def scroll(self): """Scroll to first added page.""" if len(self.app.model) - len(self.pages) == 0: return if self.treerowref: iref = self.treerowref.get_path().get_indices()[0] else: iref = len(self.app.model) - 1 - len(self.pages) self.before = False if self.before: scroll_path = Gtk.TreePath.new_from_indices([max(iref - len(self.pages), 0)]) else: scroll_path = Gtk.TreePath.new_from_indices([max(iref + 1, 0)]) self.app.iconview.scroll_to_path(scroll_path, False, 0, 0) class PDFRenderer(threading.Thread, GObject.GObject): def __init__(self, model, pdfqueue, visible_range, columns_nr): threading.Thread.__init__(self) GObject.GObject.__init__(self) self.model = model self.pdfqueue = pdfqueue self.visible_start = visible_range[0] self.visible_end = visible_range[1] self.columns_nr = columns_nr self.mem_usage = 0 self.model_lock = threading.Lock() self.quit = False def run(self): """Render thumbnails and less memory consuming previews. Thumbnails are rendered for the visible range and its near area. Memory usage is estimated and if it goes too high distant thumbnails are replaced with previews. Previews will be rendered for all pages. """ for num in range(self.visible_start, self.visible_end + 1): if self.quit: return with self.model_lock: if not 0 <= num < len(self.model): break path = Gtk.TreePath.new_from_indices([num]) ref = Gtk.TreeRowReference.new(self.model, path) p = self.model[path][0].duplicate() if p.resample != 1 / p.zoom: self.update(p, ref, p.zoom, False) mem_limit = False for off in range(1, len(self.model)): for num in self.visible_end + off, self.visible_start - off: if self.quit: return with self.model_lock: if not 0 <= num < len(self.model): continue path = Gtk.TreePath.new_from_indices([num]) ref = Gtk.TreeRowReference.new(self.model, path) p = self.model[path][0].duplicate() if off <= self.columns_nr * 5: # Thumbnail zoom = p.zoom is_preview = False elif mem_limit or p.resample < 0: # Preview. Always render to about 4000 pixels = about 16kb zoom = (1 / p.scale) * (4000 / (p.size[0] * p.size[1])) ** .5 is_preview = True else: # Thumbnail is distant and total mem usage is small # -> don't update thumbnail, just take memory usage into account zoom = 1 / p.resample if p.resample != 1 / zoom: size = self.update(p, ref, zoom, is_preview) else: size = p.thumbnail.get_width(), p.thumbnail.get_height() mem_limit = self.mem_at_limit(size) self.finish() def mem_at_limit(self, size): """Estimate memory usage of rendered thumbnails. Return True when mem_usage > mem_limit.""" mem_limit = 300 # Mb (About. Size will depend on thumbnail content.) if self.mem_usage > mem_limit: return True self.mem_usage += size[0] * size[1] * 4 / (1024 * 1024) # 4 byte/pixel return False def render(self, cr, p): if self.quit: return pdfdoc = self.pdfqueue[p.nfile - 1] page = pdfdoc.get_page(p.npage - 1) with pdfdoc.render_lock: page.render(cr) def update(self, p: Page, ref, zoom, is_preview): """Render and emit updated thumbnails.""" if (is_preview and p.preview) and (p.resample != -1): # Reuse the preview if it exist, unless it is marked for re-render thumbnail = p.preview else: wpoi = p.size.width * (1 - p.crop.left - p.crop.right) hpoi = p.size.height * (1 - p.crop.top - p.crop.bottom) wpix = max(1, int(0.5 + wpoi * p.scale * zoom)) hpix = max(1, int(0.5 + hpoi * p.scale * zoom)) wpix0, hpix0 = (wpix, hpix) if p.angle in [0, 180] else (hpix, wpix) rotation = round((int(p.angle) % 360) / 90) * 90 thumbnail = cairo.ImageSurface(cairo.FORMAT_ARGB32, wpix0, hpix0) cr = cairo.Context(thumbnail) if rotation > 0: cr.translate(wpix0 / 2, hpix0 / 2) cr.rotate(-rotation * pi / 180) cr.translate(-wpix / 2, -hpix / 2) cr.scale(wpix / wpoi, hpix / hpoi) cr.translate(-p.crop.left * p.size.width, -p.crop.top * p.size.height) self.add_layers(cr, p, layer='UNDERLAY') cr.save() if rotation > 0: cr.translate(*p.size.scaled(0.5)) cr.rotate(rotation * pi / 180) cr.translate(*p.size_orig.scaled(-0.5)) self.render(cr, p) cr.restore() self.add_layers(cr, p, layer='OVERLAY') if p.hide != Sides(): cr.set_source_rgb(1, 1, 1) cr.rectangle(0, 0, p.size.width, p.size.height) x = p.size.width * p.hide.left y = p.size.height * p.hide.top w = p.size.width * (1 - p.hide.left - p.hide.right) h = p.size.height * (1 - p.hide.top - p.hide.bottom) cr.rectangle(x, y, w, h) cr.set_fill_rule(cairo.FILL_RULE_EVEN_ODD) cr.fill() if self.quit: return 0, 0 GObject.idle_add( self.emit, "update_thumbnail", ref, thumbnail, zoom, p.scale, is_preview, priority=GObject.PRIORITY_LOW, ) return thumbnail.get_width(), thumbnail.get_height() def add_layers(self, cr, p: Page, layer): layerpages = p.layerpages if layer == 'OVERLAY' else reversed(p.layerpages) for lp in layerpages: if self.quit: return if layer != lp.laypos: continue cr.save() cr.translate(p.size.width * lp.offset.left, p.size.height * lp.offset.top) cr.scale(lp.scale / p.scale, lp.scale / p.scale) x = lp.size.width * lp.crop.left y = lp.size.height * lp.crop.top w = lp.size.width * (1 - lp.crop.left - lp.crop.right) h = lp.size.height * (1 - lp.crop.top - lp.crop.bottom) cr.translate(-x, -y) cr.rectangle(x, y, w, h) cr.clip() rotation = round((int(lp.angle) % 360) / 90) * 90 if rotation > 0: cr.translate(*lp.size.scaled(0.5)) cr.rotate(rotation * pi / 180) cr.translate(*lp.size_orig.scaled(-0.5)) self.render(cr, lp) cr.restore() def finish(self): """Signal rendering ended (for statusbar and malloc_trim).""" GObject.idle_add( self.emit, "update_thumbnail", None, None, 0, 0, False, priority=GObject.PRIORITY_LOW, ) pdfarranger-1.11.0/pdfarranger/exporter.py000066400000000000000000000665221463504064500206240ustar00rootroot00000000000000# Copyright (C) 2008-2017 Konstantinos Poulios, 2018-2019 Jerome Robert # # pdfarranger 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. import pikepdf import os import traceback import sys import warnings import tempfile import io import gi import locale import packaging.version as version from typing import Any, Dict, List from . import metadata from gi.repository import Gtk gi.require_version("Poppler", "0.18") from gi.repository import Poppler import gettext _ = gettext.gettext from .core import Page, Sides # pikepdf.Page.add_overlay()/add_underlay() can't place a page exactly # if for example LC_NUMERIC=fi_FI try: locale.setlocale(locale.LC_NUMERIC, 'C') except locale.Error: pass # Gtk already prints a warning def get_blank_doc(pageadder, pdfqueue, tmpdir, size, npages=1): """Search pdfqueue for a matching pdf with blank pages. Create it if it does not exist. Some notes: Blank pdf documents are created prior to export (vs created as needed at export) because it will keep code simpler. For example rendering of thumbnails require no extra for rendering of a blank page. A document with several blank pages is needed if the page number under thumbnail need to be something else than 1. """ for i, pdfdoc in enumerate(pdfqueue): if size == pdfdoc.blank_size and npages == pdfdoc.document.get_n_pages(): filename = pdfdoc.copyname nfile = i + 1 return filename, nfile filename = _create_blank_page(tmpdir, size, npages) doc_data = pageadder.get_pdfdoc(filename, basename=None, blank_size=size) if doc_data is None: return None, None nfile = doc_data[1] return filename, nfile def _create_blank_page(tmpdir, size, npages=1): """ Create a temporary PDF file with npages empty pages. The size is in PDF unit (1/72 of inch). """ f, filename = make_tmp_file(tmpdir) f.add_blank_page(page_size=size) for __ in range(npages - 1): f.pages.append(f.pages[0]) f.save(filename) return filename def make_tmp_file(tmpdir): fd, filename = tempfile.mkstemp(suffix=".pdf", dir=tmpdir) os.close(fd) f = pikepdf.Pdf.new() return f, filename def _normalize_rectangle(rect): """ PDF Specification 1.7, 7.9.5, although rectangles are conventionally specified by their lower-left and upper-right corners, it is acceptable to specify any two diagonally opposite corners. Applications that process PDF should be prepared to normalize such rectangles in situations where specific corners are required. """ rect = [float(x) for x in rect] if rect[0] > rect[2]: rect[0], rect[2] = rect[2], rect[0] if rect[1] > rect[3]: rect[1], rect[3] = rect[3], rect[1] return rect def _intersect_rectangle(rect1, rect2): return [ max(rect1[0], rect2[0]), max(rect1[1], rect2[1]), min(rect1[2], rect2[2]), min(rect1[3], rect2[3]), ] def _mediabox(page, crop=Sides()): """ Return the media box for a given page. """ # PDF files which do not have mediabox default to Portrait Letter / ANSI A cmb = page.MediaBox if "/MediaBox" in page else [0, 0, 612, 792] cmb = _normalize_rectangle(cmb) if "/CropBox" in page: # PDF specification §14.11.2.1, "If they do, they are effectively # reduced to their intersection with the media box" cmb = _intersect_rectangle(cmb, _normalize_rectangle(page.CropBox)) if crop == Sides(): return cmb angle = page.Rotate if '/Rotate' in page else 0 rotate_times = int(round(((angle) % 360) / 90) % 4) crop_init = crop if rotate_times != 0: perm = [0, 2, 1, 3] for _ in range(rotate_times): perm.append(perm.pop(0)) perm.insert(1, perm.pop(2)) crop = Sides(*(crop_init[perm[side]] for side in range(4))) x1, y1, x2, y2 = [float(x) for x in cmb] x1_new = x1 + (x2 - x1) * crop.left x2_new = x2 - (x2 - x1) * crop.right y1_new = y1 + (y2 - y1) * crop.bottom y2_new = y2 - (y2 - y1) * crop.top return [x1_new, y1_new, x2_new, y2_new] def _set_meta(mdata, pdf_input, pdf_output): ppae = metadata.PRODUCER not in mdata with pdf_output.open_metadata(set_pikepdf_as_editor=ppae) as outmeta: if len(pdf_input) > 0: metadata.load_from_docinfo(outmeta, pdf_input[0]) for k, v in mdata.items(): outmeta[k] = v def _scale(doc, page, factor): """ Scale a page """ if factor == 1: return page rotate = 0 if "/Rotate" in page: # We'll set the rotate attribute on the resulting page so we must # unset it on the input page before rotate = page.Rotate page.Rotate = 0 page_id = len(doc.pages) newmediabox = [factor * float(x) for x in page.MediaBox] content = "q {} 0 0 {} 0 0 cm /p{} Do Q".format(factor, factor, page_id) xobject = pikepdf.Page(page).as_form_xobject() new_page = pikepdf.Dictionary( Type=pikepdf.Name.Page, MediaBox=newmediabox, Contents=doc.make_stream(content.encode()), Resources={'/XObject': {'/p{}'.format(page_id): xobject}}, Rotate=rotate, ) # This was needed for pikepdf <= 2.6.0. See https://github.com/pikepdf/pikepdf/issues/174 # It's also needed with pikepdf 4.2 else we get: # RuntimeError: QPDFPageObjectHelper::getFormXObjectForPage called with a direct object # when calling as_form_xobject in generate_booklet # It's also needed for pikepdf 8.8 but not for pikepdf 6.0.1 new_page = doc.make_indirect(new_page) return new_page def _update_angle(model_page, source_page, output_page): angle = model_page.angle angle0 = source_page.Rotate if '/Rotate' in source_page else 0 if angle != 0: new_angle = angle + angle0 if new_angle >= 360: new_angle -= 360 output_page.Rotate = new_angle def _apply_geom_transform(pdf_output, new_page, row): _update_angle(row, new_page, new_page) new_page.MediaBox = _mediabox(new_page, row.crop) # add_overlay() & add_underlay() will use TrimBox or CropBox if they exist if '/TrimBox' in new_page: del new_page.TrimBox if '/CropBox' in new_page: del new_page.CropBox return pikepdf.Page(_scale(pdf_output, new_page, row.scale)) def _apply_geom_transform_job(pdf_output:pikepdf.Pdf, new_page:pikepdf.Page, page:Page) -> None: new_page.rotate(page.angle, relative=True) new_page.MediaBox = _mediabox(new_page, page.crop) # add_overlay() & add_underlay() will use TrimBox or CropBox if they exist if '/TrimBox' in new_page: del new_page.TrimBox if '/CropBox' in new_page: del new_page.CropBox if page.scale != 1: pdf_output.pages.append(new_page) new_page.obj.emplace(_scale(pdf_output, pdf_output.pages[-1], page.scale)) del(pdf_output.pages[-1]) def _remove_unreferenced_resources(pdfdoc): try: pdfdoc.remove_unreferenced_resources() except RuntimeError: # Catch "RuntimeError: operation for dictionary attempted on object of # type null" with old version PikePDF (observed with 1.17 and 1.19). # Blindly catch all RuntimeError is dangerous as this may catch # unwanted exception so we print it. print(traceback.format_exc()) def warn_dialog(func): """ Decorator which redirect warnings and error messages to a gtk MessageDialog """ class ShowWarning: def __init__(self): self.buffer = "" def __call__(self, message, category, filename, lineno, f=None, line=None): s = warnings.formatwarning(message, category, filename, lineno, line) if sys.stderr is not None: sys.stderr.write(s + '\n') self.buffer += str(message) + '\n' def wrapper(*args, **kwargs): export_msg = args[-1] backup_showwarning = warnings.showwarning warnings.showwarning = ShowWarning() try: func(*args, **kwargs) if len(warnings.showwarning.buffer) > 0: export_msg.put([warnings.showwarning.buffer, Gtk.MessageType.WARNING]) except Exception as e: traceback.print_exc() export_msg.put([e, Gtk.MessageType.ERROR]) finally: warnings.showwarning = backup_showwarning return wrapper def export_process(*args, **kwargs): """Export PDF in a separate process.""" warn_dialog(export)(*args, **kwargs) def _copy_n_transform(pdf_input, pdf_output, pages, quit_flag=None): # all pages must be copied to pdf_output BEFORE applying geometrical # transformation. See https://github.com/pikepdf/pikepdf/issues/271 copied_pages = {} mediaboxes = [] # Copy pages from the input PDF files to the output PDF file for row in pages: if quit_flag is not None and quit_flag.is_set(): return current_page = pdf_input[row.nfile - 1].pages[row.npage - 1] mediaboxes.append(_mediabox(current_page)) _append_page(current_page, copied_pages, pdf_output, row) # Layer pages are temporary added after the page they belong to for lprow in row.layerpages: layer_page = pdf_input[lprow.nfile - 1].pages[lprow.npage - 1] _append_page(layer_page, copied_pages, pdf_output, lprow) # Apply geometrical transformations in the output PDF file i = 0 for row in pages: if quit_flag is not None and quit_flag.is_set(): return pdf_output.pages[i] = _apply_geom_transform(pdf_output, pdf_output.pages[i], row) for lprow in row.layerpages: i += 1 pdf_output.pages[i] = _apply_geom_transform(pdf_output, pdf_output.pages[i], lprow) i += 1 # Add overlays and underlays for i, row in enumerate(pages): # The dest page coordinates and size before geometrical transformations dx1, dy1, dx2, dy2 = mediaboxes[i] dw, dh = dx2 - dx1, dy2 - dy1 dpage = pdf_output.pages[i] dangle0 = dpage.Rotate if '/Rotate' in dpage else 0 rotate_times = int(round(((dangle0) % 360) / 90) % 4) for lprow in row.layerpages: # Rotate the offsets so they are relative to dest page offset = lprow.offset.rotated(rotate_times) offs_left, offs_right, offs_top, offs_bottom = offset x1 = row.scale * (dx1 + dw * offs_left) y1 = row.scale * (dy1 + dh * offs_bottom) x2 = row.scale * (dx1 + dw * (1 - offs_right)) y2 = row.scale * (dy1 + dh * (1 - offs_top)) rect = pikepdf.Rectangle(x1, y1, x2, y2) layer_page = pdf_output.pages[i + 1] if lprow.laypos == 'OVERLAY': pdf_output.pages[i].add_overlay(layer_page, rect) else: pdf_output.pages[i].add_underlay(layer_page, rect) # Remove the temporary added page del pdf_output.pages[i + 1] def _append_page(current_page, copied_pages, pdf_output, row): """Add a page to the output pdf. A page that already exist is duplicated.""" new_page = copied_pages.get((row.nfile, row.npage)) if new_page is None: new_page = current_page # let pdf_output adopt new_page pdf_output.pages.append(new_page) new_page = pdf_output.pages[-1] copied_pages[(row.nfile, row.npage)] = new_page # Ensure annotations are copied rather than referenced # https://github.com/pdfarranger/pdfarranger/issues/437 if pikepdf.Name.Annots in current_page: pdf_temp = pikepdf.Pdf.new() pdf_temp.pages.append(current_page) indirect_annots = pdf_temp.make_indirect(pdf_temp.pages[0].Annots) new_page.Annots = pdf_output.copy_foreign(indirect_annots) def _transform_job(pdf_output: pikepdf.Pdf, pages: List[Page], quit_flag = None) -> None: """ Same as _copy_n_transform, except it doesn't copy. Requires pikepdf >= 8.0 """ # Fix missing MediaBoxes for page in pdf_output.pages: if page.mediabox is None: page.mediabox = pikepdf.Array((0, 0, 612, 792)) # We don't need to call _append_page as the Job interface copies pages / annotations as necessary. mediaboxes:List[pikepdf.Rectangle] = [] i = 0 for page in pages: if quit_flag is not None and quit_flag.is_set(): return mediaboxes.append(pikepdf.Rectangle(pdf_output.pages[i].mediabox)) _apply_geom_transform_job(pdf_output, pdf_output.pages[i], page) for lpage in page.layerpages: i += 1 _apply_geom_transform_job(pdf_output, pdf_output.pages[i], lpage) i += 1 # # Add overlays and underlays for i, page in enumerate(pages): # The dest page coordinates and size before geometrical transformations mb = mediaboxes[i] # Call to rotate in _apply_geom_transform_job ensures /Rotate exists rotate_times = int(round((pdf_output.pages[i].Rotate % 360) / 90) % 4) for lpage in page.layerpages: # Rotate the offsets so they are relative to dest page offset = lpage.offset.rotated(rotate_times) offs_left, offs_right, offs_top, offs_bottom = offset x1 = page.scale * (mb.llx + mb.width * offs_left) y1 = page.scale * (mb.lly + mb.height * offs_bottom) x2 = page.scale * (mb.llx + mb.width * (1 - offs_right)) y2 = page.scale * (mb.lly + mb.height * (1 - offs_top)) rect = pikepdf.Rectangle(x1, y1, x2, y2) if lpage.laypos == 'OVERLAY': pdf_output.pages[i].add_overlay(pdf_output.pages[i + 1], rect) else: pdf_output.pages[i].add_underlay(pdf_output.pages[i + 1], rect) # Remove the temporary added page del pdf_output.pages[i + 1] def export_doc(pdf_input, pages, mdata, files_out, quit_flag, test_mode=False): """Same as export() but with pikepdf.PDF objects instead of files""" pdf_output = pikepdf.Pdf.new() _copy_n_transform(pdf_input, pdf_output, pages, quit_flag) if quit_flag is not None and quit_flag.is_set(): return if isinstance(files_out[0], str): # Only needed when saving to file, not when printing mdata = metadata.merge_doc(mdata, pdf_input) if len(files_out) > 1: for n, page in enumerate(pdf_output.pages): if quit_flag is not None and quit_flag.is_set(): return outpdf = pikepdf.Pdf.new() _set_meta(mdata, pdf_input, outpdf) # works without make_indirect as already applied to this page outpdf.pages.append(page) _remove_unreferenced_resources(outpdf) outpdf.save(files_out[n]) else: if isinstance(files_out[0], str): if not test_mode: _set_meta(mdata, pdf_input, pdf_output) _remove_unreferenced_resources(pdf_output) if test_mode: pdf_output.save(files_out[0], qdf=True, static_id=True, compress_streams=False, stream_decode_level=pikepdf.StreamDecodeLevel.all) else: pdf_output.save(files_out[0]) def _add_json_entries(json: Dict[str, Any], files: List[List[str]], page: Page) -> None: """Create an entry for the job json "pages" list.""" pages_entry = {"file": files[page.nfile - 1][0], # copyname "range": str(page.npage)} if len(files[page.nfile - 1][1]) > 0: pages_entry["password"] = files[page.nfile - 1][1] json["pages"].append(pages_entry) def _create_job(files: List[List[str]], pages: List[Page], files_out: List[str], quit_flag=None, test_mode: bool = False): """ Same as _copy_n_transform, except it use the pikepdf Job interface. Requires pikepdf >= 8.0 """ # Generate the output PDF file including temporary overlay/ underlay pages. We don't need to call # _append_page as the Job interface copies pages / annotations as necessary. We can also delay getting # our MediaBoxes until the transformation stage. json = dict(outputFile=files_out[0], pages=[], removeUnreferencedResources="yes") if test_mode: json.update(qdf="", staticId="", compressStreams="n", decodeLevel="all") if len(files) > 0 and len(files[0][0]) > 0: json["inputFile"] = files[0][0] # We are treating files [0] as the main document if len(files[0][1]) > 0: json["password"] = files[0][1] else: json["inputFile"] = "." for page in pages: if quit_flag is not None and quit_flag.is_set(): return None _add_json_entries(json, files, page) for lpage in page.layerpages: # Layer pages are temporarily added after the page they belong to _add_json_entries(json, files, lpage) return pikepdf.Job(json) def export_doc_job(pdf_input: List[pikepdf.Pdf], files: List[List[str]], pages: List[Page], mdata, files_out: List[str], quit_flag, test_mode: bool = False) -> None: """ Same as export() but uses the pikepdf Job interface. Requires pikedf >= 8.0. """ job = _create_job(files, pages, files_out, quit_flag, test_mode) pdf_output = job.create_pdf() _transform_job(pdf_output, pages, quit_flag) if quit_flag is not None and quit_flag.is_set(): return if isinstance(files_out[0], str): # Only needed when saving to file, not when printing mdata = metadata.merge_doc(mdata, pdf_input) if len(files_out) > 1: for n, page in enumerate(pdf_output.pages): if quit_flag is not None and quit_flag.is_set(): return outpdf = pikepdf.Pdf.new() _set_meta(mdata, pdf_input, outpdf) outpdf.pages.append(page) _remove_unreferenced_resources(outpdf) outpdf.save(files_out[n]) else: if isinstance(files_out[0], str) and not test_mode: _set_meta(mdata, [pdf_output], pdf_output) job.write_pdf(pdf_output) def export(files, pages, mdata, files_out, quit_flag, _export_msg, test_mode=False): pdf_input = [ pikepdf.open(copyname, password=password) for copyname, password in files ] if version.parse(pikepdf.__version__) < version.Version("8.0"): export_doc(pdf_input, pages, mdata, files_out, quit_flag, test_mode) else: export_doc_job(pdf_input, files, pages, mdata, files_out, quit_flag, test_mode) def num_pages(filepath): """Get number of pages for filepath.""" try: pdf = pikepdf.Pdf.open(filepath) except pikepdf._qpdf.PdfError: return None npages = len(pdf.pages) pdf.close() return npages def generate_booklet(pdfqueue, tmp_dir, pages): file, filename = make_tmp_file(tmp_dir) content_dict = pikepdf.Dictionary({}) file_indexes = set() for p in pages: file_indexes.add(p.nfile) for lp in p.layerpages: file_indexes.add(lp.nfile) source_files = {n-1: pikepdf.open(pdfqueue[n - 1].copyname) for n in file_indexes} _copy_n_transform(source_files, file, pages) to_remove = len(file.pages) npages = len(pages) for i in range(npages//2): even = i % 2 == 0 first_id = -i - 1 if even else i second_id = i if even else -i - 1 if first_id < 0: first_id += npages if second_id < 0: second_id += npages first = pages[first_id] second = pages[second_id] first_foreign = file.pages[first_id] second_foreign = file.pages[second_id] second_page_size = second.size_in_points() first_page_size = first.size_in_points() page_size = [max(second_page_size[0], first_page_size[0]) * 2, max(second_page_size[1], first_page_size[1])] content_dict[f'/Page{i*2}'] = pikepdf.Page(first_foreign).as_form_xobject() content_dict[f'/Page{i*2 + 1}'] = pikepdf.Page(second_foreign).as_form_xobject() # See PDF reference section 4.2.3 Transformation Matrices tx1 = -first_foreign.MediaBox[0] ty1 = -first_foreign.MediaBox[1] tx2 = first_page_size[0] - float(second_foreign.MediaBox[0]) ty2 = -second_foreign.MediaBox[1] content_txt = ( f"q 1 0 0 1 {tx1} {ty1} cm /Page{i*2} Do Q " f"q 1 0 0 1 {tx2} {ty2} cm /Page{i*2 + 1} Do Q " ) newpage = pikepdf.Dictionary( Type=pikepdf.Name.Page, MediaBox=[0, 0, *page_size], Resources=pikepdf.Dictionary(XObject=content_dict), Contents=pikepdf.Stream(file, content_txt.encode()) ) file.pages.append(pikepdf.Page(newpage)) for __ in range(to_remove): del file.pages[0] file.save(filename) return filename class PrintSettingsWidget(Gtk.Grid): def __init__(self, scale_mode, auto_rotate): super().__init__(margin=0, row_spacing=6, column_spacing=12, border_width=12) lbl = Gtk.Label(_("Scale mode:"), margin=0) self.combo = Gtk.ComboBoxText(margin=0) self.combo.append("NONE", _("None")) self.combo.append("PRINTABLE", _("Fit to Printable Area")) self.combo.append("FULL", _("Fit to Full Page")) self.combo.set_active_id(scale_mode) self.cb = Gtk.CheckButton(label=_("Auto Rotate"), margin=0) self.cb.set_active(auto_rotate) self.attach(lbl, 0, 1, 1, 1) self.attach(self.combo, 1, 1, 2, 1) self.attach(self.cb, 0, 2, 2, 1) self.show_all() def get_scale_mode(self): return self.combo.get_active_id() def get_auto_rotate(self): return self.cb.get_active() # Adapted from https://stackoverflow.com/questions/28325525/python-gtk-printoperation-print-a-pdf class PrintOperation(Gtk.PrintOperation): MESSAGE=_("Printing…") def __init__(self, app): super().__init__(embed_page_setup=True, support_selection=True) self.app = app self.connect("create-custom-widget", self.create_custom_widget) self.connect("custom-widget-apply", self.custom_widget_apply) self.connect("request-page-setup", self.request_page_setup) self.connect("begin-print", self.begin_print, None) self.connect("end-print", self.end_print, None) self.connect("draw-page", self.draw_page, None) self.connect("preview", self.preview, None) self.pdf_input = None self.message = self.MESSAGE self.scale_mode = self.app.config.scale_mode() self.auto_rotate = self.app.config.auto_rotate() self.set_use_full_page(self.scale_mode != 'PRINTABLE') self.snums = [p.get_indices() for p in reversed(app.iconview.get_selected_items())] self.set_has_selection(len(self.snums) > 0) def create_custom_widget(self, operation): self.set_custom_tab_label(_("Page Handling")) return PrintSettingsWidget(self.scale_mode, self.auto_rotate) def custom_widget_apply(self, operation, widget): self.scale_mode = widget.get_scale_mode() self.auto_rotate = widget.get_auto_rotate() self.set_use_full_page(self.scale_mode != 'PRINTABLE') def request_page_setup(self, operation, print_ctx, page_num, setup): if self.auto_rotate: w_page = self.pages[page_num].width_in_points() h_page = self.pages[page_num].height_in_points() if w_page >= h_page: setup.set_orientation(Gtk.PageOrientation.LANDSCAPE) else: setup.set_orientation(Gtk.PageOrientation.PORTRAIT) def preview(self, operation, preview_op, print_ctx, parent, user_data): self.message = _("Rendering Preview…") def begin_print(self, operation, print_ctx, print_data): self.app.set_export_state(True, self.message) psel = self.get_print_settings().get_print_pages() == Gtk.PrintPages.SELECTION nums = self.snums if psel else range(len(self.app.model)) self.pages = [self.app.model[n][0].duplicate(incl_thumbnail=False) for n in nums] self.app.apply_hide_margins_on_pages(self.pages) self.set_n_pages(len(self.pages)) # Open pikepdf objects for all pages that has been modified nfiles = set() for p in self.pages: if p.unmodified(): continue nfiles.add(p.nfile) for lp in p.layerpages: nfiles.add(lp.nfile) self.pdf_input = [None] * len(self.app.pdfqueue) for nfile in nfiles: pdf = self.app.pdfqueue[nfile - 1] self.pdf_input[nfile - 1] = pikepdf.open(pdf.copyname, password=pdf.password) def end_print(self, operation, print_ctx, print_data): self.app.set_export_state(False) self.message = self.MESSAGE self.app.config.set_scale_mode(self.scale_mode) self.app.config.set_auto_rotate(self.auto_rotate) def draw_page(self, operation, print_ctx, page_num, print_data): cairo_ctx = print_ctx.get_cairo_context() # Poppler context is always 72 dpi cairo_ctx.scale(print_ctx.get_dpi_x() / 72, print_ctx.get_dpi_y() / 72) if page_num >= len(self.app.model): return setup = print_ctx.get_page_setup() if self.scale_mode == 'PRINTABLE': w_paper = setup.get_page_width(Gtk.Unit.POINTS) h_paper = setup.get_page_height(Gtk.Unit.POINTS) else: w_paper = setup.get_paper_width(Gtk.Unit.POINTS) h_paper = setup.get_paper_height(Gtk.Unit.POINTS) w_page = self.pages[page_num].width_in_points() h_page = self.pages[page_num].height_in_points() print_scale = self.get_print_settings().get_scale() / 100 scale = 1 if self.scale_mode != 'NONE': w_scale = w_paper / (w_page * print_scale) h_scale = h_paper / (h_page * print_scale) scale = min(w_scale, h_scale) cairo_ctx.scale(scale, scale) # Center page on paper dx = w_paper / (scale * print_scale) - w_page dy = h_paper / (scale * print_scale) - h_page cairo_ctx.translate(dx / 2, dy / 2) p = self.pages[page_num] if p.unmodified(): pdfdoc = self.app.pdfqueue[p.nfile - 1] page = pdfdoc.document.get_page(p.npage - 1) with pdfdoc.render_lock: page.render_for_printing(cairo_ctx) else: buf = io.BytesIO() export_doc(self.pdf_input, [p], {}, [buf], None) page = Poppler.Document.new_from_data(buf.getvalue()).get_page(0) page.render_for_printing(cairo_ctx) def run(self): result = super().run(Gtk.PrintOperationAction.PRINT_DIALOG, self.app.window) if result == Gtk.PrintOperationResult.ERROR: dialog = Gtk.MessageDialog( self.app.window, 0, Gtk.MessageType.ERROR, Gtk.ButtonsType.CLOSE, self.get_error(), ) dialog.run() dialog.destroy() pdfarranger-1.11.0/pdfarranger/iconview.py000066400000000000000000000460211463504064500205670ustar00rootroot00000000000000# Copyright (C) 2008-2017 Konstantinos Poulios, 2018-2019 Jerome Robert # # pdfarranger 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. from gi.repository import Gtk from gi.repository import Gdk from math import pi class CellRendererImage(Gtk.CellRenderer): def __init__(self): Gtk.CellRenderer.__init__(self) self.th1 = 2. # border thickness self.th2 = 3. # shadow thickness self.page = None def set_page(self, page): self.page = page def get_geometry(self): rotation = int(self.page.angle) % 360 rotation = round(rotation / 90) * 90 w0 = self.page.thumbnail.get_width() h0 = self.page.thumbnail.get_height() if rotation == 90 or rotation == 270: w1, h1 = h0, w0 else: w1, h1 = w0, h0 w2 = self.page.width_in_pixel() h2 = self.page.height_in_pixel() return w0, h0, w1, h1, w2, h2, rotation def do_render(self, window, _widget, _background_area, cell_area, _expose_area): if not self.page.thumbnail: return w0, h0, w1, h1, w2, h2, rotation = self.get_geometry() th = int(2 * self.th1 + self.th2) w = w2 + th h = h2 + th x = cell_area.x y = cell_area.y if cell_area and w > 0 and h > 0: x += self.get_property('xalign') * (cell_area.width - w) y += self.get_property('yalign') * (cell_area.height - h) window.translate(int(0.5 + x), int(0.5 + y)) # shadow window.set_source_rgb(0.5, 0.5, 0.5) window.rectangle(th, th, w2, h2) window.fill() # border window.set_source_rgb(0, 0, 0) window.rectangle(0, 0, w2 + 2 * self.th1, h2 + 2 * self.th1) window.fill() # image window.set_source_rgb(1, 1, 1) window.rectangle(self.th1, self.th1, w2, h2) window.fill_preserve() window.clip() window.translate(self.th1, self.th1) scale = self.page.resample * self.page.zoom window.scale(scale, scale) if rotation > 0: window.translate(w1 / 2, h1 / 2) window.rotate(rotation * pi / 180) window.translate(-w0 / 2, -h0 / 2) window.set_source_surface(self.page.thumbnail) window.paint() def do_get_size(self, _widget, cell_area=None): x = y = 0 th = int(2 * self.th1 + self.th2) w = self.page.width_in_pixel() + th h = self.page.height_in_pixel() + th if cell_area and w > 0 and h > 0: x = self.get_property('xalign') * ( cell_area.width - w - self.get_property('xpad')) y = self.get_property('yalign') * ( cell_area.height - h - self.get_property('ypad')) w += 2 * self.get_property('xpad') h += 2 * self.get_property('ypad') return int(x), int(y), w, h class IconviewCursor(object): """Move cursor, select pages and scroll with navigation keys.""" def __init__(self, app): self.app = app self.model = self.app.iconview.get_model() self.move_cursor = True self.event = None self.iconview = None self.sel_start_page = None self.cursor_page_nr = 0 self.cursor_page_nr_new = 0 self.cursor_is_visible = False def handler(self, iconview, event): """Do all steps involved in cursor moving.""" self.iconview = iconview self.event = event self.set_initial() self.set_selection_start_page() if self.move_cursor: self.move() self.select() self.scroll_iconview() def set_initial(self): """Cursor initial set.""" self.move_cursor = True selection = self.iconview.get_selected_items() if len(selection) == 0: self.cursor_is_visible = False if selection and not self.iconview.get_cursor()[1] in selection: selection.sort(key=lambda x: x.get_indices()[0]) self.iconview.set_cursor(selection[-1], None, False) if self.event.state & Gdk.ModifierType.SHIFT_MASK: self.sel_start_page = Gtk.TreePath.get_indices(selection[-1])[0] self.iconview.unselect_all() elif not self.iconview.get_cursor()[0]: if self.event.keyval == Gdk.KEY_End: self.cursor_page_nr_new = len(self.model) - 1 else: self.cursor_page_nr_new = 0 cursor_path_new = Gtk.TreePath.new_from_indices([self.cursor_page_nr_new]) self.iconview.set_cursor(cursor_path_new, None, False) self.move_cursor = False self.iconview.unselect_all() def set_selection_start_page(self): """Set selection start page when shift + navigation keys are used.""" if self.sel_start_page is None and self.event.state & Gdk.ModifierType.SHIFT_MASK: self.sel_start_page = Gtk.TreePath.get_indices(self.iconview.get_cursor()[1])[0] self.iconview.unselect_all() elif not self.event.state & Gdk.ModifierType.SHIFT_MASK: self.sel_start_page = None def move(self): """Move iconview cursor with navigation keys.""" cursor_path = self.iconview.get_cursor()[1] self.cursor_page_nr = Gtk.TreePath.get_indices(cursor_path)[0] cursor_y = self.iconview.get_cell_rect(cursor_path)[1].y page_size = self.app.sw.get_vadjustment().get_page_size() spacing = self.iconview.get_row_spacing() columns_nr = self.iconview.get_columns() if self.event.keyval == Gdk.KEY_Up: step = 0 if self.cursor_page_nr - columns_nr < 0 else columns_nr self.cursor_page_nr_new = self.cursor_page_nr - step elif self.event.keyval == Gdk.KEY_Down: step = 0 if self.cursor_page_nr + columns_nr > len(self.model) - 1 else columns_nr self.cursor_page_nr_new = self.cursor_page_nr + step elif self.event.keyval == Gdk.KEY_Left: if self.iconview.get_direction() == Gtk.TextDirection.LTR: self.cursor_page_nr_new = max(self.cursor_page_nr - 1, 0) else: self.cursor_page_nr_new = min(self.cursor_page_nr + 1, len(self.model) - 1) elif self.event.keyval == Gdk.KEY_Right: if self.iconview.get_direction() == Gtk.TextDirection.LTR: self.cursor_page_nr_new = min(self.cursor_page_nr + 1, len(self.model) - 1) else: self.cursor_page_nr_new = max(self.cursor_page_nr - 1, 0) elif self.event.keyval == Gdk.KEY_Home: self.cursor_page_nr_new = 0 elif self.event.keyval == Gdk.KEY_End: self.cursor_page_nr_new = len(self.model) - 1 elif self.event.keyval in [Gdk.KEY_Page_Up, Gdk.KEY_KP_Page_Up]: for self.cursor_page_nr_new in range(self.cursor_page_nr, -1, -columns_nr): new_path = Gtk.TreePath.new_from_indices([self.cursor_page_nr_new]) new_y = self.iconview.get_cell_rect(new_path)[1].y if new_y < cursor_y - page_size - spacing: self.cursor_page_nr_new += columns_nr break elif self.event.keyval in [Gdk.KEY_Page_Down, Gdk.KEY_KP_Page_Down]: for self.cursor_page_nr_new in range(self.cursor_page_nr, len(self.model), columns_nr): new_path = Gtk.TreePath.new_from_indices([self.cursor_page_nr_new]) new_y = self.iconview.get_cell_rect(new_path)[1].y if new_y > cursor_y + page_size + spacing: self.cursor_page_nr_new -= columns_nr break self.iconview.unselect_path(cursor_path) if len(self.model) > 1 and not self.cursor_is_visible: step = 1 if self.iconview.get_item_column(cursor_path) == 0 else -1 self.iconview.emit('move-cursor', Gtk.MovementStep.VISUAL_POSITIONS, step) self.cursor_is_visible = True self.iconview.unselect_all() cursor_path_new = Gtk.TreePath.new_from_indices([self.cursor_page_nr_new]) sw_hpos = self.app.sw.get_hadjustment().get_value() self.iconview.set_cursor(cursor_path_new, None, False) self.app.sw.get_hadjustment().set_value(sw_hpos) def select(self): """Select iconview pages with shift + navigation keys.""" if self.event.state & Gdk.ModifierType.SHIFT_MASK: if self.cursor_page_nr_new > self.sel_start_page > self.cursor_page_nr: for page_nr in range(self.cursor_page_nr, self.sel_start_page): path = Gtk.TreePath.new_from_indices([page_nr]) self.iconview.unselect_path(path) elif self.cursor_page_nr_new < self.sel_start_page < self.cursor_page_nr: for page_nr in range(self.sel_start_page, self.cursor_page_nr): path = Gtk.TreePath.new_from_indices([page_nr]) self.iconview.unselect_path(path) elif self.cursor_page_nr_new == self.sel_start_page: self.iconview.unselect_all() step = -1 if self.cursor_page_nr_new < self.sel_start_page else 1 for page_nr in range(self.cursor_page_nr_new, self.cursor_page_nr + step, step): path = Gtk.TreePath.new_from_indices([page_nr]) self.iconview.unselect_path(path) for page_nr in range(self.sel_start_page, self.cursor_page_nr_new + step, step): path = Gtk.TreePath.new_from_indices([page_nr]) self.iconview.select_path(path) else: self.iconview.unselect_all() cursor_path_new = Gtk.TreePath.new_from_indices([self.cursor_page_nr_new]) self.iconview.select_path(cursor_path_new) def scroll_iconview(self): """Scroll in order to keep cursor visible in window.""" sw_vadj = self.app.sw.get_vadjustment() sw_vpos = sw_vadj.get_value() cursor_path_new = Gtk.TreePath.new_from_indices([self.cursor_page_nr_new]) cell_rect = self.iconview.get_cell_rect(cursor_path_new)[1] cell_height = cell_rect.height cell_y = self.iconview.convert_widget_to_bin_window_coords(cell_rect.x, cell_rect.y)[1] sw_height = self.app.sw.get_allocated_height() columns_nr = self.iconview.get_columns() up = self.cursor_page_nr_new < self.cursor_page_nr at_min = self.cursor_page_nr_new - columns_nr < 0 down = self.cursor_page_nr_new > self.cursor_page_nr at_max = self.cursor_page_nr_new + columns_nr > len(self.model) - 1 if up or at_min: sw_vpos = min(max(sw_vpos, cell_y + cell_height - sw_height), cell_y) elif down or at_max: sw_vpos = max(min(sw_vpos, cell_y), cell_y + cell_height - sw_height) sw_vadj.set_value(sw_vpos) class IconviewDragSelect: """ Drag-select when clicking between items and dragging mouse pointer. Click + drag-select selects the range from click location to drag location. Shift + click + drag-select adds more items to selection. Control + click + drag-select toggles selection. """ def __init__(self, app): self.app = app self.iconview = app.iconview self.model = app.iconview.get_model() self.range_start = 0 self.range_end = 0 self.click_location = None self.cursor_name_old = 'default' def click(self, event): """Store the click location.""" if len(self.model) == 0: self.click_location = None return self.click_location = self.get_location(event.x, event.y) if self.click_location: self.set_mouse_cursor('text') self.range_start = int(self.click_location + 0.5) self.range_end = self.range_start self.control_is_pressed = event.state & Gdk.ModifierType.CONTROL_MASK self.shift_is_pressed = event.state & Gdk.ModifierType.SHIFT_MASK if self.control_is_pressed or self.shift_is_pressed: self.selection_list = [] for row in self.model: self.selection_list.append(self.iconview.path_is_selected(row.path)) def motion(self, event=None, step=0): """Get drag location and select or deselect items.""" if not self.click_location: return False sw_vadj = self.app.sw.get_vadjustment() sw_vpos = sw_vadj.get_value() if event: self.event_x = event.x event_y = self.event_y = event.y + step self.sw_vpos = sw_vpos if not event.state & Gdk.ModifierType.CONTROL_MASK: self.control_is_pressed = False if not event.state & Gdk.ModifierType.SHIFT_MASK: self.shift_is_pressed = False else: event_y = self.event_y - self.sw_vpos + sw_vpos + step drag_location = self.get_location(self.event_x, event_y) if drag_location is None: return False selection_changed = self.select(drag_location) return selection_changed def select(self, drag_location): """Select or deselect items between click location and current mouse pointer location.""" range_start_old = self.range_start range_end_old = self.range_end if drag_location > self.click_location: self.range_start = int(self.click_location + 0.5) self.range_end = int(drag_location + 1) else: self.range_start = int(drag_location + 0.5) self.range_end = int(self.click_location + 1) if self.range_start == range_start_old and self.range_end == range_end_old: return False changed_range_start = min(self.range_start, range_start_old) changed_range_end = max(self.range_end, range_end_old) for page_nr in range(changed_range_start, changed_range_end): path = Gtk.TreePath.new_from_indices([page_nr]) if self.control_is_pressed: if page_nr in range(self.range_start, self.range_end): if self.selection_list[page_nr]: self.iconview.unselect_path(path) else: self.iconview.select_path(path) else: if self.selection_list[page_nr]: self.iconview.select_path(path) else: self.iconview.unselect_path(path) elif self.shift_is_pressed: if page_nr in range(self.range_start, self.range_end): self.iconview.select_path(path) elif not self.selection_list[page_nr]: self.iconview.unselect_path(path) else: if page_nr in range(self.range_start, self.range_end): self.iconview.select_path(path) else: self.iconview.unselect_path(path) return True def get_location(self, x, y): """ Get mouse pointer location. E.g. Location is 2.0 when pointer is on item 2. Location is 2.5 when pointer is between item 2 and 3. """ last = self.iconview.get_cell_rect(self.model[-1].path)[1] if last.width < 50: # Avoid seg fault if calling get_path_at_pos before iconview is ready return None last_x, last_y = self.iconview.convert_widget_to_bin_window_coords(last.x, last.y) x_step = last.width - 2 * self.iconview.get_item_padding() - 1 y_step = self.iconview.get_row_spacing() + 2 * self.iconview.get_item_padding() + 1 search_pos = [('XY', x, y), ('Right', x + x_step, y), ('Left', x - x_step, y), ('Below', x, y + y_step), ('Below', x + x_step, y + y_step), ('Below', x - x_step, y + y_step), ('Above', x, y - y_step), ('Above', x + x_step, y - y_step), ('Above', x - x_step, y - y_step), ('Zero', 0, 0)] ind = 0 for pos, x_s, y_s in search_pos: path = self.iconview.get_path_at_pos(x_s, y_s) if path: ind = Gtk.TreePath.get_indices(path)[0] break add = 0.5 if self.iconview.get_direction() == Gtk.TextDirection.LTR else -0.5 if pos == 'XY': location = ind elif pos == 'Right': location = ind - add elif pos == 'Left': location = ind + add elif pos == 'Below': location = ind - self.iconview.get_item_column(path) - add elif pos == 'Above': location = ind + self.iconview.get_columns() - self.iconview.get_item_column(path) - add elif (y > last_y + last.height) or (y > last_y and x > last_x + last.width): location = len(self.model) - add elif y < 0: location = -add else: return None return min(location, len(self.model) - add) def set_mouse_cursor(self, cursor_name): """Set the cursor type specified by cursor_name.""" if cursor_name == self.cursor_name_old: return cursor = Gdk.Cursor.new_from_name(Gdk.Display.get_default(), cursor_name) self.iconview.get_window().set_cursor(cursor) self.cursor_name_old = cursor_name def end(self): self.set_mouse_cursor('default') self.click_location = None class IconviewPanView: """Pan the view when pressing mouse wheel and moving mouse.""" def __init__(self, app): self.iconview = app.iconview self.sw_hadj = app.sw.get_hadjustment() self.sw_vadj = app.sw.get_vadjustment() self.cursor_name = 'default' def click(self, event): self.cursor_name = 'move' cursor = Gdk.Cursor.new_from_name(Gdk.Display.get_default(), self.cursor_name) self.iconview.get_window().set_cursor(cursor) self.click_x = event.x self.click_y = event.y def motion(self, event): if self.cursor_name == 'default': return self.sw_hadj.set_value(self.sw_hadj.get_value() + self.click_x - event.x) self.sw_vadj.set_value(self.sw_vadj.get_value() + self.click_y - event.y) def end(self): if self.cursor_name == 'default': return self.cursor_name = 'default' cursor = Gdk.Cursor.new_from_name(Gdk.Display.get_default(), self.cursor_name) self.iconview.get_window().set_cursor(cursor) pdfarranger-1.11.0/pdfarranger/metadata.py000066400000000000000000000214341463504064500205250ustar00rootroot00000000000000# Copyright (C) 2020 Jerome Robert # # pdfarranger 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. """ PDF meta data edition """ import pikepdf import gettext import re import json import traceback from datetime import datetime from dateutil import parser import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk from gi.repository import Pango _ = gettext.gettext # The producer property can be overridden by pikepdf PRODUCER = '{http://ns.adobe.com/pdf/1.3/}Producer' # Currently the only property which support lists as values. If you add more # please implement a generic mechanism. _CREATOR = '{http://purl.org/dc/elements/1.1/}creator' _CREATED = '{http://ns.adobe.com/xap/1.0/}CreateDate' _MODIFIED = '{http://ns.adobe.com/xap/1.0/}ModifyDate' # List of supported meta data with their user representation # see https://wwwimages2.adobe.com/content/dam/acom/en/devnet/xmp/pdfs/XMP%20SDK%20Release%20cc-2016-08/XMPSpecificationPart1.pdf # if you want to add more _LABELS = { '{http://purl.org/dc/elements/1.1/}title': _('Title'), '{http://purl.org/dc/elements/1.1/}description': _('Subject'), '{http://ns.adobe.com/pdf/1.3/}Keywords': _('Keywords'), PRODUCER: _('Producer'), _CREATOR: _('Creator'), '{http://ns.adobe.com/xap/1.0/}CreatorTool': _('Creator tool'), _CREATED: _('Created'), _MODIFIED: _('Modified'), } def _pikepdf_meta_is_valid(meta): """ Return true if m is a valid PikePDF meta data value. PikePDF pass meta data to re.sub which only accept str or byte-like object. """ if not isinstance(meta, list): meta = [meta] for s in meta: try: re.sub('', '', s) except TypeError: return False return True def load_from_docinfo(meta, doc): """ wrapper of pikepdf.models.PdfMetadata.load_from_docinfo with a workaround for https://github.com/pikepdf/pikepdf/issues/100 & 162 """ try: meta.load_from_docinfo(doc.docinfo) except (NotImplementedError, TypeError): # DocumentInfo cannot be loaded and will be lost. Not a that big issue. traceback.print_exc() def _safeiter(elements): it = iter(elements) while True: try: yield next(it) except StopIteration: break except ValueError: traceback.print_exc() except KeyError: # Workaround for https://github.com/pdfarranger/pdfarranger/issues/1019 pass def merge_doc(metadata, input_docs): """Same as merge but with pikepdf.PDF object instead of files""" r = metadata.copy() for doc in input_docs: with doc.open_metadata() as meta: load_from_docinfo(meta, doc) for k, v in _safeiter(meta.items()): if not _pikepdf_meta_is_valid(v): # workaround for https://github.com/pikepdf/pikepdf/issues/84 del meta[k] elif k not in metadata: r[k] = v return r def merge(metadata, input_files): """Merge current global metadata and each imported files meta data""" docs = [pikepdf.open(copyname, password=password) for copyname, password in input_files] return merge_doc(metadata, docs) def _metatostr(value, name): """ Convert a meta data value from list to string if it's not a string """ if isinstance(value, str): return value elif isinstance(value, list) and name == _CREATOR: if len(value) == 1: return _metatostr(value[0], name) else: return json.dumps(value) return '' def _strtometa(value, name): try: r = json.loads(value) if name == _CREATOR else value if isinstance(r, list): return None if len(r) == 0 else r else: # r is a dict which is not supported so we revert back # to a plain string return value except json.decoder.JSONDecodeError: return value class _EditedEventHandler(object): """ Callbacks to save the data entered into the "Edit properties" fields. For basic saving just the edited method would be needed. The rest is a workaround for Gtk interpreting a lost focus (including clicking "Apply") as a cancelled edit and therefore discarding the edit currently in progress. To avoid that, we need to save the text on each changed event to self.new_text and then save it to the liststore on canceled. We can not save it directly to the liststore since that stops editing after each keypress. """ def __init__(self, liststore): self.liststore = liststore self.path = None self.new_text = None def started(self, _renderer, editable, path): self.path = path editable.connect("changed", self.editable_changed) def editable_changed(self, editable): self.new_text = editable.get_text() @staticmethod def _parse_date(string, parent): try: date = parser.parse(string) return datetime.isoformat(date) # ISO-8601 formatted date except ValueError: if string: msg = _('Invalid date format. Input discarded.') d = Gtk.MessageDialog(parent=parent, flags=Gtk.DialogFlags.MODAL, type=Gtk.MessageType.ERROR, buttons=Gtk.ButtonsType.OK, message_format=msg) d.run() d.destroy() return '' def edited(self, _renderer, path, new_text, parent): date_labels = [_LABELS[l] for l in [_CREATED, _MODIFIED]] if self.liststore[path][0] in date_labels: new_text = self._parse_date(new_text, parent) self.liststore[path][1] = new_text def canceled(self, _renderer): if self.new_text is not None: self.liststore[self.path][1] = self.new_text def edit(metadata, pdffiles, parent): """ Edit the current meta data :param metadata: The dictionary of meta data to modify :param pdffiles: A list of PDF from witch to take the initial meta data :param parent: The parent window """ dialog = Gtk.Dialog(title=_('Edit properties'), parent=parent, flags=Gtk.DialogFlags.MODAL, buttons=("_Cancel", Gtk.ResponseType.CANCEL, "_OK", Gtk.ResponseType.OK)) ok_button = dialog.get_widget_for_response(response_id = Gtk.ResponseType.OK) ok_button.grab_focus() # Property, Value, XMP name (hidden) liststore = Gtk.ListStore(str, str, str) mergedmetadata = merge(metadata, pdffiles) for xlabel, label in _LABELS.items(): metastr = _metatostr(mergedmetadata.get(xlabel, ''), xlabel) liststore.append([label, metastr, xlabel]) treeview = Gtk.TreeView.new_with_model(liststore) for i, v in enumerate([(_("Property"), False), (_("Value")+" "*30, True)]): title, editable = v renderer = Gtk.CellRendererText() if editable: renderer.props.ellipsize = Pango.EllipsizeMode.END renderer.props.width_chars = 50 renderer.set_property("editable", True) handler = _EditedEventHandler(liststore) renderer.connect("editing-started", handler.started) renderer.connect("edited", handler.edited, parent) renderer.connect("editing-canceled", handler.canceled) column = Gtk.TreeViewColumn(title, renderer, text=i) treeview.append_column(column) treeview.props.margin = 12 treeview.set_enable_search(False) treeview.set_cursor(Gtk.TreePath(0), treeview.get_column(1), True) dialog.vbox.pack_start(treeview, True, True, 0) dialog.show_all() result = dialog.run() r = result == Gtk.ResponseType.OK dialog.destroy() if r: for row in liststore: # Capture invalid input when the emission of the edited signal is # bypassed by pressing OK while editing. if row[2] in [_CREATED, _MODIFIED]: row[1] = handler._parse_date(row[1], parent) metadata[row[2]] = _strtometa(row[1], row[2]) return r pdfarranger-1.11.0/pdfarranger/pageutils.py000066400000000000000000001135261463504064500207460ustar00rootroot00000000000000# Copyright (C) 2020 pdfarranger contributors # # pdfarranger 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. from gi.repository import Gtk, Gdk, GObject import gettext import cairo import locale from math import pi from .core import Sides, Dims, PDFRenderer _ = gettext.gettext def scale(model, selection, factor): """Set the scale factor of a selection of pages.""" changed = False try: width, height = factor except TypeError: width, height = None, None for path in selection: it = model.get_iter(path) page = model.get_value(it, 0) page_size = page.size.cropped(page.crop) if width is None: f = factor else: # TODO: allow to change aspect ratio f = max(*Dims(width, height) / page_size) # Page size must be in [72, 14400] (PDF standard requirement) f = max(f, *(Dims(72, 72) / page_size)) f = min(f, *(Dims(14400, 14400) / page_size)) if page.scale != f: changed = True page.resample = page.resample * f / page.scale for lp in page.layerpages: lp.scale = lp.scale * f / page.scale page.scale = f model.set_value(it, 0, page) return changed class _LinkedSpinButton(Gtk.SpinButton): """ A spin button which can be bound to an other button """ def __init__(self, minval, maxval, step, page=None): Gtk.SpinButton.__init__(self) self.set_digits(20) self.set_width_chars(9) self.connect("output", self.__output) self.set_range(minval, maxval) self.set_increments(step, step if page is None else page) self.changing_from_brother = False def __output(self, _user_data): """ output signal handler to remove unneeded 0 """ s = locale.format_string("%.8g", self.get_adjustment().get_value()) self.get_buffer().set_text(s, len(s)) return True class _RadioStackSwitcher(Gtk.Box): """ Same as GtkStackSwitcher but with radio button (i.e different semantic) """ def __init__(self, margin=10): super().__init__() self.props.orientation = Gtk.Orientation.VERTICAL self.set_spacing(margin) self.props.margin = margin self.radiogroup = [] self.stack = Gtk.Stack() self.button_box = Gtk.Box() self.button_box.set_spacing(margin) self.add(self.button_box) self.add(self.stack) self.selected_child = None self.selected_name = None def add_named(self, child, name, title): radio = Gtk.RadioButton.new_with_label(None, title) if len(self.radiogroup) > 0: radio.join_group(self.radiogroup[-1]) self.radiogroup.append(radio) radio.set_hexpand(True) radio.set_halign(Gtk.Align.CENTER) radio.connect("toggled", self.__radio_handler, name) self.button_box.add(radio) self.stack.add_named(child, name) if self.selected_child is None: self.selected_child = child self.selected_name = name def __radio_handler(self, button, name): if button.props.active: self.stack.set_visible_child_name(name) self.selected_name = name self.selected_child = self.stack.get_child_by_name(name) class _RelativeScalingWidget(Gtk.Box): """ A form to specify the relative scaling factor """ def __init__(self, current_scale, margin=10): super().__init__() self.props.spacing = margin self.add(Gtk.Label(label=_("Scale factor"))) # Largest page size is 200 inch and smallest is 1 inch # so we can set a min and max self.entry = _LinkedSpinButton(100 / 200.0, 100 * 200.0, 1, 10) self.entry.set_activates_default(True) self.add(self.entry) self.add(Gtk.Label(label=_("%"))) self.entry.set_value(current_scale * 100) def get_value(self): return self.entry.get_value() / 100 class _ScalingWidget(Gtk.Box): """ A form to specify the page width or height """ def __init__(self, label, default, margin=10): super().__init__() self.props.spacing = margin self.add(Gtk.Label(label=label)) self.entry = _LinkedSpinButton(25.4, 5080, 1, 10) self.entry.set_activates_default(True) self.add(self.entry) self.add(Gtk.Label(label=_("mm"))) # A PDF unit is 1/72 inch self.entry.set_value(default * 25.4 / 72) def get_value(self): return self.entry.get_value() / 25.4 * 72 class _CropHideWidget(Gtk.Frame): sides = ('L', 'R', 'T', 'B') side_names = {'L': _('Left'), 'R': _('Right'), 'T': _('Top'), 'B': _('Bottom')} opposite_sides = {'L': 'R', 'R': 'L', 'T': 'B', 'B': 'T'} def __init__(self, val, margin=12): super().__init__(shadow_type=Gtk.ShadowType.NONE) grid = Gtk.Grid(halign=Gtk.Align.CENTER) grid.set_column_spacing(margin) grid.set_row_spacing(margin) grid.props.margin = margin self.add(grid) label = Gtk.Label( label=_( 'Cropping/hiding does not remove any content ' 'from the PDF file, it only hides it.' ) ) label.props.margin = margin label.set_line_wrap(True) label.set_max_width_chars(38) grid.attach(label, 0, 0, 3, 1) self.spin_changed_callback = None self.spin_list = [] units = 2 * [_('% of width')] + 2 * [_('% of height')] for row, side in enumerate(_CropHideWidget.sides): label = Gtk.Label(label=_CropHideWidget.side_names[side]) label.set_alignment(0.0, 0.5) grid.attach(label, 0, row + 1, 1, 1) adj = Gtk.Adjustment( value=100.0 * val.pop(0), lower=0.0, upper=90.0, step_increment=1.0, page_increment=5.0, page_size=0.0, ) spin = Gtk.SpinButton(adjustment=adj, climb_rate=0, digits=1) spin.set_activates_default(True) spin.connect('value-changed', self.__set_value, self, side) self.spin_list.append(spin) grid.attach(spin, 1, row + 1, 1, 1) label = Gtk.Label(label=units.pop(0)) label.set_alignment(0.0, 0.5) grid.attach(label, 2, row + 1, 1, 1) @staticmethod def __set_value(spinbutton, self, side): opp_side = self.opposite_sides[side] adj = self.spin_list[self.sides.index(opp_side)].get_adjustment() limit = 90.0 - spinbutton.get_value() adj.set_upper(limit) opp_spinner = self.spin_list[self.sides.index(opp_side)] opp_spinner.set_value(min(opp_spinner.get_value(), limit)) if callable(self.spin_changed_callback): self.spin_changed_callback() def set_spinb_changed_callback(self, callback): self.spin_changed_callback = callback def set_val(self, val): for i, spin in enumerate(self.spin_list): spin.set_value(val[i] * 100) def get_val(self): return Sides(*(spin.get_value() / 100.0 for spin in self.spin_list)) class BaseDialog(Gtk.Dialog): def __init__(self, title, parent, prepend_buttons=None): buttons = () if prepend_buttons is None else prepend_buttons buttons += ( _("_Cancel"), Gtk.ResponseType.CANCEL, _("_OK"), Gtk.ResponseType.OK, ) super().__init__( title=title, parent=parent, flags=Gtk.DialogFlags.MODAL, buttons=buttons, ) self.set_default_response(Gtk.ResponseType.OK) class ScaleDialog(BaseDialog): """ A dialog box to define page size or scale factor """ def __init__(self, model, selection, window): super().__init__(title=_("Page size"), parent=window) self.set_resizable(False) page = model.get_value(model.get_iter(selection[-1]), 0) rel_widget = _RelativeScalingWidget(page.scale) width_widget = _ScalingWidget(_("Width"), page.width_in_points()) height_widget = _ScalingWidget(_("Height"), page.height_in_points()) self.scale_stack = _RadioStackSwitcher() self.scale_stack.add_named(rel_widget, "Relative", _("Relative")) self.scale_stack.add_named(width_widget, "Width", _("Width")) self.scale_stack.add_named(height_widget, "Height", _("Height")) pagesizeframe = Gtk.Frame(shadow_type=Gtk.ShadowType.NONE) pagesizeframe.props.margin = 8 pagesizeframe.add(self.scale_stack) self.vbox.pack_start(pagesizeframe, True, True, 0) self.show_all() self.selection = selection def run_get(self): """ Open the dialog and return the size value """ result = self.run() val = None if result == Gtk.ResponseType.OK: val = self.scale_stack.selected_child.get_value() if self.scale_stack.selected_name == "Width": val = val, 0 elif self.scale_stack.selected_name == "Height": val = 0, val # else val is a relative scale so we return it as is self.destroy() return val def white_borders(model, selection, pdfqueue): crop = [] for path in selection: it = model.get_iter(path) p = model.get_value(it, 0) pdfdoc = pdfqueue[p.nfile - 1] page = pdfdoc.document.get_page(p.npage - 1) # Always render pages at 72 dpi whatever the zoom or scale of the page w, h = page.get_size() orig_crop = p.crop.rotated(-p.rotate_times(p.angle)) first_col = int(w * orig_crop.left) last_col = min(int(w), int(w * (1 - orig_crop.right) + 1)) first_row = int(h * orig_crop.top) last_row = min(int(h), int(h * (1 - orig_crop.bottom) + 1)) w = int(w) h = int(h) thumbnail = cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h) cr = cairo.Context(thumbnail) with pdfdoc.render_lock: page.render(cr) data = thumbnail.get_data().cast("i") whitecol = memoryview(b"\0" * (last_row - first_row) * 4).cast("i") whiterow = memoryview(b"\0" * (last_col - first_col) * 4).cast("i") crop_this_page = [0.0, 0.0, 0.0, 0.0] # Left for col in range(first_col, last_col): if data[col::w][first_row:last_row] != whitecol: crop_this_page[0] = (col - 1) / w break # Right for col in range(last_col - 1, first_col - 1, -1): if data[col::w][first_row:last_row] != whitecol: crop_this_page[1] = (w - col - 1) / w break # Top for row in range(first_row, last_row): if data[row * w : (row + 1) * w][first_col:last_col] != whiterow: crop_this_page[2] = (row - 1) / h break # Bottom for row in range(last_row - 1, first_row - 1, -1): if data[row * w : (row + 1) * w][first_col:last_col] != whiterow: crop_this_page[3] = (h - row - 1) / h break crop.append(Sides(*crop_this_page).rotated(p.rotate_times(p.angle))) return crop class BlankPageDialog(BaseDialog): def __init__(self, size, window): super().__init__(title=_("Insert Blank Page"), parent=window) self.set_resizable(False) self.width_widget = _ScalingWidget(_("Width"), size[0]) self.height_widget = _ScalingWidget(_("Height"), size[1]) self.vbox.pack_start(self.width_widget, True, True, 6) self.vbox.pack_start(self.height_widget, True, True, 6) self.width_widget.props.spacing = 6 self.height_widget.props.spacing = 6 self.show_all() def run_get(self): result = self.run() r = None if result == Gtk.ResponseType.OK: r = self.width_widget.get_value(), self.height_widget.get_value() self.destroy() return r class MergePagesDialog(BaseDialog): def __init__(self, window, size, equal): super().__init__(title=_("Merge Pages"), parent=window) self.size = size self.set_resizable(False) max_margin = int(((14400 - max(*size)) / 2) * 25.4 / 72) self.marg = Gtk.SpinButton.new_with_range(0, max_margin, 1) self.marg.set_activates_default(True) self.marg.connect('value-changed', self.on_sb_value_changed) self.cols = Gtk.SpinButton.new_with_range(1, 2, 1) self.cols.set_activates_default(True) self.cols.connect('value-changed', self.on_sb_value_changed) self.rows = Gtk.SpinButton.new_with_range(1, 1, 1) self.rows.set_activates_default(True) self.rows.connect('value-changed', self.on_sb_value_changed) marg_lbl1 = Gtk.Label(_("Margin"), halign=Gtk.Align.START) marg_lbl2 = Gtk.Label(_("mm"), halign=Gtk.Align.START) cols_lbl1 = Gtk.Label(_("Columns"), halign=Gtk.Align.START) rows_lbl1 = Gtk.Label(_("Rows"), halign=Gtk.Align.START) grid1 = Gtk.Grid(column_spacing=12, row_spacing=12, margin=12, halign=Gtk.Align.CENTER) grid1.attach(marg_lbl1, 0, 1, 1, 1) grid1.attach(self.marg, 1, 1, 1, 1) grid1.attach(marg_lbl2, 2, 1, 1, 1) grid1.attach(cols_lbl1, 0, 2, 1, 1) grid1.attach(self.cols, 1, 2, 1, 1) grid1.attach(rows_lbl1, 0, 3, 1, 1) grid1.attach(self.rows, 1, 3, 1, 1) self.vbox.pack_start(grid1, False, False, 8) self.hor = Gtk.RadioButton(label=_("Horizontal"), group=None) vrt = Gtk.RadioButton(label=_("Vertical"), group=self.hor) self.l_r = Gtk.RadioButton(label=_("Left to Right"), group=None) r_l = Gtk.RadioButton(label=_("Right to Left"), group=self.l_r) self.t_b = Gtk.RadioButton(label=_("Top to Bottom"), group=None) b_t = Gtk.RadioButton(label=_("Bottom to Top"), group=self.t_b) grid2 = Gtk.Grid(column_spacing=6, row_spacing=12, margin=12, halign=Gtk.Align.CENTER) grid2.attach(self.hor, 0, 1, 1, 1) grid2.attach(vrt, 1, 1, 1, 1) grid2.attach(self.l_r, 0, 2, 1, 1) grid2.attach(r_l, 1, 2, 1, 1) grid2.attach(self.t_b, 0, 3, 1, 1) grid2.attach(b_t, 1, 3, 1, 1) frame1 = Gtk.Frame(label=_("Page Order"), margin=8) frame1.add(grid2) self.vbox.pack_start(frame1, False, False, 0) t = "" if equal else _("Non-uniform page size - using max size") warn_lbl = Gtk.Label(t, margin=8, wrap=True, width_chars=36, max_width_chars=36) self.vbox.pack_start(warn_lbl, False, False, 0) self.size_lbl = Gtk.Label(halign=Gtk.Align.CENTER, margin_bottom=16) self.vbox.pack_start(self.size_lbl, False, False, 0) self.show_all() def size_with_margin(self): width = self.size[0] + 2 * self.marg.get_value() * 72 / 25.4 height = self.size[1] + 2 * self.marg.get_value() * 72 / 25.4 return width, height def on_sb_value_changed(self, _button): width, height = self.size_with_margin() self.cols.set_range(1, 14400 // width) self.rows.set_range(1, 14400 // height) cols = int(self.cols.get_value()) rows = int(self.rows.get_value()) width = str(round(cols * width * 25.4 / 72, 1)) height = str(round(rows * height * 25.4 / 72, 1)) t = _("Merged page size:") + " " + width + _("mm") + " \u00D7 " + height + _("mm") self.size_lbl.set_label(t) def run_get(self): self.cols.set_value(2) result = self.run() if result != Gtk.ResponseType.OK: self.destroy() return None cols = int(self.cols.get_value()) rows = int(self.rows.get_value()) range_cols = range(cols) if self.l_r.get_active() else range(cols)[::-1] range_rows = range(rows) if self.t_b.get_active() else range(rows)[::-1] if self.hor.get_active(): order = [(row, col) for row in range_rows for col in range_cols] else: order = [(row, col) for col in range_cols for row in range_rows] self.destroy() return cols, rows, order, self.size_with_margin() class _OffsetWidget(Gtk.Frame): def __init__(self, offset, dpage, lpage): super().__init__(shadow_type=Gtk.ShadowType.NONE) self.spinb_x = Gtk.SpinButton.new_with_range(0, 100, 1) self.spinb_x.set_activates_default(True) self.spinb_x.set_digits(1) self.spinb_x.connect('value-changed', self.spinb_val_changed) self.spinb_y = Gtk.SpinButton.new_with_range(0, 100, 1) self.spinb_y.set_activates_default(True) self.spinb_y.set_digits(1) self.spinb_y.connect('value-changed', self.spinb_val_changed) self.spinb_changed_callback = None lbl1_x = Gtk.Label(_("Horizontal offset"), halign=Gtk.Align.START) lbl2_x = Gtk.Label(_("%"), halign=Gtk.Align.START) lbl1_y = Gtk.Label(_("Vertical offset"), halign=Gtk.Align.START) lbl2_y = Gtk.Label(_("%"), halign=Gtk.Align.START) grid = Gtk.Grid(column_spacing=12, row_spacing=12, margin=12, halign=Gtk.Align.CENTER) grid.attach(lbl1_x, 0, 1, 1, 1) grid.attach(self.spinb_x, 1, 1, 1, 1) grid.attach(lbl2_x, 2, 1, 1, 1) grid.attach(lbl1_y, 0, 2, 1, 1) grid.attach(self.spinb_y, 1, 2, 1, 1) grid.attach(lbl2_y, 2, 2, 1, 1) self.add(grid) self.spinb_x.set_value(offset[0] * 100) self.spinb_y.set_value(offset[1] * 100) self.set_scale(dpage, lpage) def spinb_val_changed(self, spinbutton): if callable(self.spinb_changed_callback): self.spinb_changed_callback() def set_spinb_changed_callback(self, callback): self.spinb_changed_callback = callback def set_val(self, values): self.spinb_x.set_value(values.left * self.scale.left) self.spinb_y.set_value(values.top * self.scale.top) def get_val(self): """Get left, right, top, bottom offset from dest page edges.""" xval = self.spinb_x.get_value() yval = self.spinb_y.get_value() return Sides(xval, 100 - xval, yval, 100 - yval) / self.scale def get_diff_offset(self): """Get the fraction of page size differenace at top-left.""" return self.spinb_x.get_value() / 100, self.spinb_y.get_value() / 100 def set_scale(self, dpage, lpage): """Set scale between 'destination page edge offset' and 'page size diff offset'.""" dw, dh = dpage.size_in_pixel() lw, lh = lpage.size_in_pixel() scalex = 100 * dw / (dw - lw) if dw - lw != 0 else 1e10 scaley = 100 * dh / (dh - lh) if dh - lh != 0 else 1e10 self.scale = Sides(scalex, scalex, scaley, scaley) class DrawingAreaWidget(Gtk.Box): """A widget which draws a page. It has tools for editing a rectangle (crop/hide/offset).""" def __init__(self, page, pdfqueue, spinbutton_widget=None, draw_on_page_func=None): super().__init__(orientation=Gtk.Orientation.VERTICAL) page = page.duplicate() page.thumbnail = page.thumbnail if page.crop == Sides() else None page.resample = -1 self.damodel = Gtk.ListStore(GObject.TYPE_PYOBJECT) self.damodel.append([page]) self.pdfqueue = pdfqueue self.spinbutton_widget = spinbutton_widget self.padding = 25 # Around thumbnail self.click_pos = 0, 0 self.click_val = [0] * 4 self.x_po_rel_thmb = 0 self.y_po_rel_thmb = 0 self.x_po_rel_sw = 0 self.y_po_rel_sw = 0 self.cursor_name = 'default' self.rendering_thread = None self.render_id = None self.surface = None self.adjust_rect = [0] * 4 self.allow_adjust_rect_resize = True self.handle_move_limits = True self.draw_on_page = draw_on_page_func self.da = Gtk.DrawingArea() self.da.set_events(self.da.get_events() | Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK) self.da.connect('draw', self.on_draw) self.da.connect('button-press-event', self.button_press_event) self.da.connect('button-release-event', self.button_release_event) self.da.connect('motion-notify-event', self.motion_notify_event) self.da.connect('size_allocate', self.size_allocate) self.sw = Gtk.ScrolledWindow() self.sw.set_size_request(self.padding + 100, self.padding + 100) self.sw.add(self.da) self.sw.connect('size_allocate', self.draw_page) self.sw.connect('scroll_event', self.sw_scroll_event) self.sw.connect('leave_notify_event', self.sw_leave_notify_event) self.pack_start(self.sw, True, True, 0) if self.spinbutton_widget is not None: self.spinbutton_widget.set_spinb_changed_callback(self.draw_page) self.pack_start(self.spinbutton_widget, False, False, 0) cb = Gtk.CheckButton(label=_("Show values"), margin=12, halign=Gtk.Align.CENTER) cb.connect('toggled', self.cb_show_val_toggled) cb.connect('realize', self.cb_realize) self.pack_start(cb, False, False, 0) def cb_realize(self, _cb): self.spinbutton_widget.hide() def cb_show_val_toggled(self, cb): self.spinbutton_widget.set_visible(cb.get_active()) def store_pointer_location(self, sw, event): """Store pointer location relative to thumbnail and scrolled window.""" ha = sw.get_hadjustment() thmb_x = event.x - self.padding + ha.get_value() self.x_po_rel_thmb = thmb_x / (ha.get_upper() - self.padding * 2) self.x_po_rel_sw = event.x / ha.get_page_size() va = sw.get_vadjustment() thmb_y = event.y - self.padding + va.get_value() self.y_po_rel_thmb = thmb_y / (va.get_upper() - self.padding * 2) self.y_po_rel_sw = event.y / va.get_page_size() def sw_scroll_event(self, sw, event): if not event.state & Gdk.ModifierType.CONTROL_MASK: return Gdk.EVENT_PROPAGATE w = max(p.width_in_pixel() for [p] in self.damodel) h = max(p.height_in_pixel() for [p] in self.damodel) maxfactor = (80000000 / (w * h)) ** .5 # Limit zoom at about 304Mb if event.direction == Gdk.ScrollDirection.SMOOTH: factor = round(min(1 - event.get_scroll_deltas()[2] * 0.3, maxfactor), 2) elif event.direction == Gdk.ScrollDirection.UP: factor = round(min(1.3, maxfactor), 2) elif event.direction == Gdk.ScrollDirection.DOWN: factor = 0.7 else: return Gdk.EVENT_PROPAGATE self.store_pointer_location(sw, event) dpage = self.damodel[0][0] self.da.set_size_request((dpage.width_in_pixel() + self.padding * 2) * factor, (dpage.height_in_pixel() + self.padding * 2) * factor) return Gdk.EVENT_STOP def size_allocate(self, _da, da_rect): self.set_adjustment_values() self.set_zoom(da_rect) self.init_surface() self.silent_render() def set_adjustment_values(self): """Update adjustment values so it does zoom in at cursor.""" ha = self.sw.get_hadjustment() thmb_x = (ha.get_upper() - self.padding * 2) * self.x_po_rel_thmb sw_x = ha.get_page_size() * self.x_po_rel_sw ha.set_value(self.padding + thmb_x - sw_x) va = self.sw.get_vadjustment() thmb_y = (va.get_upper() - self.padding * 2) * self.y_po_rel_thmb sw_y = va.get_page_size() * self.y_po_rel_sw va.set_value(self.padding + thmb_y - sw_y) def set_zoom(self, da_rect): dpage = self.damodel[0][0] thmb_max_w = da_rect.width - self.padding * 2 thmb_max_h = da_rect.height - self.padding * 2 zoom_x = thmb_max_w / dpage.width_in_points() zoom_y = thmb_max_h / dpage.height_in_points() for [page] in self.damodel: page.zoom = min(zoom_x, zoom_y) def silent_render(self): if self.render_id: GObject.source_remove(self.render_id) self.render_id = GObject.timeout_add(149, self.render) def quit_rendering(self): if self.rendering_thread is None: return False self.rendering_thread.quit = True self.rendering_thread.join(timeout=0.01) return self.rendering_thread.is_alive() def render(self): self.render_id = None alive = self.quit_rendering() if alive: self.silent_render() return self.rendering_thread = PDFRenderer(self.damodel, self.pdfqueue, [0, 1] , 1) self.rendering_thread.connect('update_thumbnail', self.update_thumbnail) self.rendering_thread.start() def update_thumbnail(self, _obj, ref, thumbnail, _zoom, _scale, _is_preview): if thumbnail is None: return path = ref.get_path() page = self.damodel[path][0] page.thumbnail = thumbnail self.draw_page() def button_press_event(self, _darea, event): self.click_pos = event.x, event.y if event.button == 2: self.set_cursor('move') elif event.button == 1 and self.spinbutton_widget is not None: self.click_val = self.spinbutton_widget.get_val() def button_release_event(self, _darea, event): sc = self.get_suggested_cursor(event) self.set_cursor(sc) def get_suggested_cursor(self, event): """Get appropriate cursor when moving mouse over adjust rect (crop/hide/offset).""" margin = 5 r = self.adjust_rect if self.allow_adjust_rect_resize: w = r[0] - margin < event.x < r[0] + margin e = r[0] + r[2] - margin < event.x < r[0] + r[2] + margin n = r[1] - margin < event.y < r[1] + margin s = r[1] + r[3] - margin < event.y < r[1] + r[3] + margin else: w = e = n = s = False x_area = r[0] + margin < event.x < r[0] + r[2] - margin y_area = r[1] + margin < event.y < r[1] + r[3] - margin if n and w: cursor_name = 'nw-resize' elif s and w: cursor_name = 'sw-resize' elif s and e: cursor_name = 'se-resize' elif n and e: cursor_name = 'ne-resize' elif w and y_area: cursor_name = 'w-resize' elif e and y_area: cursor_name = 'e-resize' elif n and x_area: cursor_name = 'n-resize' elif s and x_area: cursor_name = 's-resize' elif x_area and y_area: cursor_name = 'move' else: cursor_name = 'default' return cursor_name def set_cursor(self, cursor_name): if cursor_name != self.cursor_name: self.cursor_name = cursor_name cursor = Gdk.Cursor.new_from_name(Gdk.Display.get_default(), cursor_name) self.get_window().set_cursor(cursor) def motion_notify_event(self, _darea, event): if event.state & Gdk.ModifierType.BUTTON2_MASK: self.pan_view(event) self.set_cursor('move') elif event.state & Gdk.ModifierType.BUTTON1_MASK: self.adjust_val(event) else: sc = self.get_suggested_cursor(event) self.set_cursor(sc) def pan_view(self, event): ha = self.sw.get_hadjustment() va = self.sw.get_vadjustment() ha.set_value(ha.get_value() + self.click_pos[0] - event.x) va.set_value(va.get_value() + self.click_pos[1] - event.y) def adjust_val(self, event): if self.spinbutton_widget is None: return left, right, top, bottom = self.spinbutton_widget.get_val() page = self.damodel[0][0] if self.cursor_name in ['w-resize', 'nw-resize', 'sw-resize', 'move']: left = self.click_val[0] + ((event.x - self.click_pos[0]) / page.width_in_pixel()) if self.cursor_name in ['e-resize', 'ne-resize', 'se-resize', 'move']: right = self.click_val[1] - ((event.x - self.click_pos[0]) / page.width_in_pixel()) if self.cursor_name in ['n-resize', 'nw-resize', 'ne-resize', 'move']: top = self.click_val[2] + ((event.y - self.click_pos[1]) / page.height_in_pixel()) if self.cursor_name in ['s-resize', 'sw-resize', 'se-resize', 'move']: bottom = self.click_val[3] - ((event.y - self.click_pos[1]) / page.height_in_pixel()) v = Sides(left, right, top, bottom) if self.cursor_name in ['move'] and self.handle_move_limits: v += Sides(*(min(0, v[i]) for i in [1, 0, 3, 2])) self.spinbutton_widget.set_spinb_changed_callback(None) self.spinbutton_widget.set_val(v) self.spinbutton_widget.set_spinb_changed_callback(self.draw_page) self.draw_page() def sw_leave_notify_event(self, _sw, event): if event.state & Gdk.ModifierType.BUTTON1_MASK: return self.set_cursor('default') def init_surface(self): aw = self.da.get_allocated_width() ah = self.da.get_allocated_height() self.surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, aw, ah) def on_draw(self, _darea, cr): if self.surface is not None: cr.set_source_surface(self.surface, 0, 0) cr.paint() def draw_page(self, _widget=None, _rect=None): """Draw the 'destination' thumbnail page.""" if len(self.damodel) == 0 or self.surface is None: return dpage = self.damodel[0][0] if dpage.thumbnail is None: return cr = cairo.Context(self.surface) aw = self.da.get_allocated_width() ah = self.da.get_allocated_height() # Destination page rectangle dw = dpage.width_in_pixel() dh = dpage.height_in_pixel() dx = int(.5 + (aw - dw) / 2) dy = int(.5 + (ah - dh) / 2) # Page border cr.set_source_rgb(0, 0, 0) cr.rectangle(dx - 2, dy - 2, dw + 4, dh + 4) cr.fill_preserve() cr.clip() # Fill white paper cr.set_source_rgb(1, 1, 1) cr.rectangle(dx, dy, dw, dh) cr.fill() # Add the thumbnail (dw0, dh0) = (dh, dw) if dpage.angle in [90, 270] else (dw, dh) cr.translate(dx, dy) if dpage.angle > 0: cr.translate(dw / 2, dh / 2) cr.rotate(dpage.angle * pi / 180) cr.translate(-dw0 / 2, -dh0 / 2) tw, th = dpage.thumbnail.get_width(), dpage.thumbnail.get_height() tw, th = (th, tw) if dpage.angle in [90, 270] else (tw, th) cr.scale(dw / tw, dh / th) cr.set_source_surface(dpage.thumbnail) cr.get_source().set_filter(cairo.FILTER_FAST) cr.paint() cr.identity_matrix() cr.set_line_width(1) if dpage.hide != Sides(): # Draw the hide rectangle. For the Hide dialog this will be the crop rectangle dwfull = dpage.scale * dpage.size.width * dpage.zoom dhfull = dpage.scale * dpage.size.height * dpage.zoom rx = round(dx + (dpage.hide.left - dpage.crop.left) * dwfull) - .5 ry = round(dy + (dpage.hide.top - dpage.crop.top) * dhfull) - .5 rw = round(dwfull * (1 - dpage.hide.left - dpage.hide.right)) + 1 rh = round(dhfull * (1 - dpage.hide.top - dpage.hide.bottom)) + 1 hide_rect = [rx, ry, rw, rh] cr.set_source_rgba(1, 1, 1, .7) cr.rectangle(*hide_rect) cr.stroke() cr.set_source_rgba(0, 0, 0, .3) cr.set_dash([8, 8]) cr.rectangle(*hide_rect) cr.stroke() # Darken the area outside of rectangle cr.set_source_rgba(0, 0, 0, .3) cr.rectangle(dx, dy, dw, dh) cr.rectangle(*hide_rect) cr.set_fill_rule(cairo.FILL_RULE_EVEN_ODD) cr.fill() if callable(self.draw_on_page): self.adjust_rect = self.draw_on_page(cr, dx, dy, dw, dh, self.damodel) # Draw the adjust rectangle cr.identity_matrix() cr.set_source_rgb(1, 1, 1) cr.set_dash([]) cr.rectangle(*self.adjust_rect) cr.stroke() cr.set_source_rgb(0, 0, 0) cr.set_dash([4.0, 4.0]) cr.rectangle(*self.adjust_rect) cr.stroke() # Invalidate region ha = self.sw.get_hadjustment() va = self.sw.get_vadjustment() r = ha.get_value(), va.get_value(), ha.get_page_size(), va.get_page_size() self.da.queue_draw_area(*r) class CropHideDialog(): def __init__(self, window, selection, model, pdfqueue, is_unsaved, mode, update_val_func): title = _("Crop Margins") if mode == 'CROP' else _("Hide Margins") init_values = [getattr(model[row][0], mode.lower()) for row in selection] self.updated_values = init_values self.spinbutton_widget = _CropHideWidget(list(init_values[-1]), margin=8) page = model[selection[-1]][0] dawidget = DrawingAreaWidget(page, pdfqueue, self.spinbutton_widget, self.draw_on_page) page = dawidget.damodel[0][0] page.hide = page.crop if mode == 'HIDE' else page.hide page.crop = Sides() prepend_butt = (_("_Revert"), Gtk.ResponseType.REJECT, _("_Apply"), Gtk.ResponseType.APPLY) d = BaseDialog(title, window, prepend_butt) d.connect('response', self.on_response, selection, init_values, is_unsaved, update_val_func) d.vbox.pack_start(dawidget, True, True, 0) d.set_size_request(350, 500) d.show_all() def draw_on_page(self, cr, dx, dy, dw, dh, _damodel): """Draw on the thumbnail page.""" v = self.spinbutton_widget.get_val() rx = round(dx + v.left * dw) - .5 ry = round(dy + v.top * dh) - .5 rw = round(dw * (1 - v.left - v.right)) + 1 rh = round(dh * (1 - v.top - v.bottom)) + 1 # Darken area outside of crop or hide rectangle cr.set_source_rgba(0, 0, 0, .3) cr.set_dash([]) cr.rectangle(dx, dy, dw, dh) cr.rectangle(rx, ry, rw, rh) cr.set_fill_rule(cairo.FILL_RULE_EVEN_ODD) cr.fill() return [rx, ry, rw, rh] def on_response(self, dialog, response, selection, init_values, is_unsaved, update_val_func): if response == Gtk.ResponseType.REJECT: self.spinbutton_widget.set_val(init_values[-1]) self.updated_values = init_values update_val_func(self.updated_values, selection, is_unsaved) return if response in [Gtk.ResponseType.OK, Gtk.ResponseType.APPLY]: new_val = self.spinbutton_widget.get_val() if any([new_val != val for val in self.updated_values]): self.updated_values = [new_val] * len(selection) update_val_func(self.updated_values, selection, True) if response == Gtk.ResponseType.APPLY: return dialog.destroy() class PastePageLayerDialog(): def __init__(self, window, dpage, lpage_stack, model, pdfqueue, mode, layer_pos): title = _("Overlay") if mode == 'OVERLAY' else _("Underlay") lpage = lpage_stack[0].duplicate() lpage.layerpages = [lp.duplicate() for lp in lpage_stack[1:]] lpage.zoom = dpage.zoom lpage.resample = -1 lpage.thumbnail = None lpage.hide = Sides() self.spinbutton_widget = _OffsetWidget(layer_pos, dpage, lpage) dawidget = DrawingAreaWidget(dpage, pdfqueue, self.spinbutton_widget, self.draw_on_page) dawidget.allow_adjust_rect_resize = False dawidget.handle_move_limits = False dawidget.damodel.append([lpage]) self.dialog = BaseDialog(title, window) self.dialog.vbox.pack_start(dawidget, True, True, 0) self.dialog.set_size_request(350, 500) self.dialog.show_all() def draw_on_page(self, cr, dx, dy, dw, dh, damodel): """Draw on the thumbnail page.""" dpage, lpage = [page for [page] in damodel] if lpage.thumbnail is None: return [0] * 4 self.spinbutton_widget.set_scale(dpage, lpage) # Layer page rectangle offset = self.spinbutton_widget.get_val() lx = round(dx + dw * offset.left) ly = round(dy + dh * offset.top) lw = round(lpage.zoom * lpage.width_in_points()) lh = round(lpage.zoom * lpage.height_in_points()) # Add the overlay/underlay (pw0, ph0) = (lh, lw) if lpage.angle in [90, 270] else (lw, lh) cr.translate(lx, ly) if lpage.angle > 0: cr.translate(lw / 2, lh / 2) cr.rotate(lpage.angle * pi / 180) cr.translate(-pw0 / 2, -ph0 / 2) ltw, lth = lpage.thumbnail.get_width(), lpage.thumbnail.get_height() ltw, lth = (lth, ltw) if lpage.angle in [90, 270] else (ltw, lth) cr.scale(lw / ltw, lh / lth) cr.set_source_surface(lpage.thumbnail) cr.get_source().set_filter(cairo.FILTER_FAST) cr.paint() return [lx - .5, ly - .5, lw + 1, lh + 1] def get_offset(self): """Get layer page x and y offset from top-left edge of the destination page. The offset is the fraction of space positioned at left and top of the pasted layer, where space is the difference in width and height between the layer and the page. """ result = self.dialog.run() r = None if result == Gtk.ResponseType.OK: r = self.spinbutton_widget.get_diff_offset() self.dialog.destroy() return r pdfarranger-1.11.0/pdfarranger/pdfarranger.py000066400000000000000000003561611463504064500212500ustar00rootroot00000000000000# Copyright (C) 2008-2017 Konstantinos Poulios, 2018-2019 Jerome Robert # # pdfarranger 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. import os import ctypes if os.name == 'nt': try: ctypes.windll.kernel32.SetDefaultDllDirectories(0x1000) except AttributeError: # Windows too old KB2533623 pass import shutil # for file operations like whole directory deletion import sys # for processing of command line args import tempfile import signal import mimetypes import multiprocessing import locale # for multilanguage support import gettext import gc import subprocess import pikepdf import hashlib from urllib.request import url2pathname from functools import lru_cache from math import log multiprocessing.freeze_support() # Does nothing in Linux sharedir = os.path.join(sys.prefix, 'share') basedir = '.' if getattr(sys, 'frozen', False): basedir = os.path.dirname(sys.executable) sharedir = os.path.join(basedir, 'share') elif sys.argv[0]: execdir = os.path.dirname(os.path.realpath(sys.argv[0])) basedir = os.path.dirname(execdir) sharedir = os.path.join(basedir, 'share') if not os.path.exists(sharedir): sharedir = basedir localedir = os.path.join(sharedir, 'locale') if not os.path.exists(localedir): # Assume we are in development mode localedir = os.path.join(basedir, 'build', 'mo') try: locale.setlocale(locale.LC_ALL, '') except locale.Error: pass # Gtk already prints a warning DOMAIN = 'pdfarranger' ICON_ID = 'com.github.jeromerobert.' + DOMAIN if hasattr(locale, 'bindtextdomain'): # glibc locale.bindtextdomain(DOMAIN, localedir) # https://docs.gtk.org/glib/i18n.html locale.bind_textdomain_codeset(DOMAIN, 'UTF-8') else: # Windows or musl libintl = ctypes.cdll['libintl-8' if os.name == 'nt' else 'libintl.so.8'] libintl.bindtextdomain(DOMAIN.encode(), localedir.encode(sys.getfilesystemencoding())) libintl.bind_textdomain_codeset(DOMAIN.encode(), 'UTF-8'.encode()) del libintl APPNAME = 'PDF Arranger' VERSION = '1.11.0' WEBSITE = 'https://github.com/pdfarranger/pdfarranger' if os.name == 'nt': import darkdetect import keyboard # to get control key state when drag to other instance # Add support for dnd to other instance and insert file at drop location in Windows os.environ['GDK_WIN32_USE_EXPERIMENTAL_OLE2_DND'] = 'true' # Use client side decorations. Will also enable window moving with Win + left/right os.environ['GTK_CSD'] = '1' import gi # check that we don't need GObject.threads_init() gi.check_version('3.10.2') gi.require_version('Gtk', '3.0') from gi.repository import Gtk try: gi.require_version('Handy', '1') from gi.repository import Handy except ValueError: Handy = None if Gtk.check_version(3, 20, 0): raise Exception('You do not have the required version of GTK+ installed. ' + 'Installed GTK+ version is ' + '.'.join([str(Gtk.get_major_version()), str(Gtk.get_minor_version()), str(Gtk.get_micro_version())]) + '. Required GTK+ version is 3.20 or higher.') from gi.repository import Gdk from gi.repository import GObject # for using custom signals from gi.repository import Gio # for inquiring mime types information from gi.repository import GLib from gi.repository import Pango from .config import Config from .core import Sides, _img_to_pdf def _set_language_locale(): lang = Config(DOMAIN).language() if os.name == 'nt': if not lang: winlang = ctypes.windll.kernel32.GetUserDefaultUILanguage() lang = locale.windows_locale[winlang] os.environ['LANG'] = lang elif lang: if locale.getlocale(locale.LC_MESSAGES)[0] is None and lang != 'en': print('LC_MESSAGES = "C" or not valid. Translations may not work properly.') os.environ['LANGUAGE'] = lang _set_language_locale() gettext.bindtextdomain(DOMAIN, localedir) gettext.textdomain(DOMAIN) _ = gettext.gettext from . import undo from . import exporter from . import metadata from . import pageutils from . import splitter from .iconview import CellRendererImage, IconviewCursor, IconviewDragSelect, IconviewPanView from .core import img2pdf_supported_img, PageAdder, PDFDocError, PDFRenderer GObject.type_register(CellRendererImage) def _install_workaround_bug29(): """ Install a workaround for https://gitlab.gnome.org/GNOME/pygobject/issues/29 """ try: gi.check_version('3.29.2') except ValueError: def func(self, entries): # simplified version of https://gitlab.gnome.org/GNOME/pygobject/commit/d0b219c for d in entries: param_type = None if len(d) < 3 else GLib.VariantType.new(d[2]) action = Gio.SimpleAction(name=d[0], parameter_type=param_type) action.connect("activate", d[1], None) self.add_action(action) Gtk.ApplicationWindow.add_action_entries = func _install_workaround_bug29() def malloc_trim(): """Release free memory from the heap.""" if os.name == 'nt': return mtrim = malloc_trim_available() if mtrim: mtrim() @lru_cache() def malloc_trim_available(): try: ctypes.CDLL('libc.so.6').malloc_trim(0) except (FileNotFoundError, AttributeError, OSError): print('malloc_trim not available. Application may not release memory properly.') return None def mtrim(): ctypes.CDLL('libc.so.6').malloc_trim(0) return mtrim def get_file_path_from_uri(uri): """Extracts the path from an uri""" uri = uri[5:] # remove 'file:' path = url2pathname(uri) # escape special chars path = path.strip('\r\n\x00\x2F') # remove \r\n and NULL and \ if os.name == 'posix': path = '/' + path return path class PdfArranger(Gtk.Application): # Drag and drop ID for pages coming from the same pdfarranger instance MODEL_ROW_INTERN = 1001 # Drag and drop ID for pages coming from an other pdfarranger instance MODEL_ROW_EXTERN = 1002 # Drag and drop ID for pages coming from a non-pdfarranger application TEXT_URI_LIST = 1003 TARGETS_IV = [Gtk.TargetEntry.new('MODEL_ROW_INTERN', Gtk.TargetFlags.SAME_WIDGET, MODEL_ROW_INTERN), Gtk.TargetEntry.new('MODEL_ROW_EXTERN', Gtk.TargetFlags.OTHER_APP, MODEL_ROW_EXTERN)] TARGETS_SW = [Gtk.TargetEntry.new('text/uri-list', 0, TEXT_URI_LIST), Gtk.TargetEntry.new('MODEL_ROW_EXTERN', Gtk.TargetFlags.OTHER_APP, MODEL_ROW_EXTERN)] def __init__(self, *args, **kwargs): super().__init__(*args, application_id="com.github.jeromerobert.pdfarranger", flags=Gio.ApplicationFlags.NON_UNIQUE | Gio.ApplicationFlags.HANDLES_COMMAND_LINE, **kwargs) GLib.set_application_name(APPNAME) GLib.set_prgname('com.github.jeromerobert.pdfarranger') # Create the temporary directory self.tmp_dir = tempfile.mkdtemp(DOMAIN) os.chmod(self.tmp_dir, 0o700) # Defining instance attributes # The None values will be set later in do_activate self.config = Config(DOMAIN) self.uiXML = None self.window = None self.sw = None self.model = None self.undomanager = None self.iconview = None self.cellthmb = None self.status_bar = None self.popup = None self.is_unsaved = False self.zoom_level = None self.zoom_level_old = 0 self.zoom_level_limits = [-10, 80] self.zoom_scale = None self.zoom_fit_page = False self.render_id = None self.id_scroll_to_sel = None self.target_is_intern = True self.export_directory = os.path.expanduser('~') self.import_directory = None self.nfile = 0 self.iv_auto_scroll_timer = None self.pdfqueue = [] self.metadata = {} self.pressed_button = None self.click_path = None self.scroll_path = None self.rendering_thread = None self.export_process = None self.post_action = None self.save_file = None self.export_file = None self.drag_path = None self.drag_pos = Gtk.IconViewDropPosition.DROP_RIGHT self.window_width_old = 0 self.set_iv_visible_id = None self.vadj_percent = None self.end_rubberbanding = False self.disable_quit = False multiprocessing.set_start_method('spawn') self.quit_flag = multiprocessing.Event() self.layer_pos = 0.5, 0.5 # Clipboard for cut copy paste self.clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) self.add_arguments() def add_arguments(self): self.set_option_context_summary(_( "PDF Arranger is a small python-gtk application, which helps the " "user to merge or split pdf documents and rotate, crop and rearrange " "their pages using an interactive and intuitive graphical interface. " "It is a frontend for pikepdf." )) self.add_main_option( "version", ord("v"), GLib.OptionFlags.NONE, GLib.OptionArg.NONE, _("Print the version of PDF Arranger and exit"), None, ) self.add_main_option( GLib.OPTION_REMAINING, 0, GLib.OptionFlags.NONE, GLib.OptionArg.STRING_ARRAY, _("File(s) to open"), "[FILES]", ) @staticmethod def __resource_path(path): """ Return the path of a resource file """ # TODO: May be we could use Application.set_resource_base_path and # get_menu_by_id in place of that # Trying different possible locations f = os.path.join(basedir, 'share', DOMAIN, path) if not os.path.exists(f): f = os.path.join(basedir, 'data', path) if not os.path.exists(f): f = '/usr/share/{}/{}'.format(DOMAIN, path) if not os.path.exists(f): f = '/usr/local/share/{}/{}'.format(DOMAIN, path) return f def set_color_scheme(self): if Handy: try: scheme = Handy.ColorScheme.PREFER_LIGHT if os.name == 'nt' and darkdetect.isDark(): scheme = Handy.ColorScheme.PREFER_DARK theme = self.config.theme() if theme == 'dark': scheme = Handy.ColorScheme.FORCE_DARK elif theme == 'light': scheme = Handy.ColorScheme.FORCE_LIGHT Handy.StyleManager.get_default().set_color_scheme(scheme) except AttributeError: # This libhandy is too old. 1.5.90 needed ? pass def __create_main_window(self): """Create the Gtk.ApplicationWindow or Handy.ApplicationWindow""" b = Gtk.Builder() b.set_translation_domain(DOMAIN) with open(self.__resource_path(DOMAIN + ".ui")) as ff: s = ff.read() if Handy: Handy.init() s = s.replace("GtkHeaderBar", "HdyHeaderBar") b.add_from_string(s) b.connect_signals(self) self.uiXML = b self.window = self.uiXML.get_object("main_window") if Handy: self.set_color_scheme() # Add an intermediate vertical box box = Gtk.Box() box.props.orientation = Gtk.Orientation.VERTICAL hd = self.uiXML.get_object("header_bar") mb = self.uiXML.get_object("main_box") self.window.remove(hd) self.window.remove(mb) # Replace the Gtk.ApplicationWindow by the Handy one self.window = Handy.ApplicationWindow() box.add(hd) mb.props.expand = True box.add(mb) self.window.add(box) self.window.set_default_icon_name(ICON_ID) return b def __create_menus(self): b = Gtk.Builder() b.set_translation_domain(DOMAIN) b.add_from_file(self.__resource_path("menu.ui")) b.connect_signals(self) self.config.set_actions(b) self.popup = Gtk.Menu.new_from_model(b.get_object("popup_menu")) self.popup.attach_to_widget(self.window, None) main_menu = self.uiXML.get_object("main_menu_button") main_menu.set_menu_model(b.get_object("main_menu")) def __create_actions(self): # Both Handy.ApplicationWindow and Gtk.Application are Gio.ActionMap. Some action are window # related some other are application related. As pdfarrager is a single window app does not # matter that much. self.actions = [ ('rotate', self.rotate_page_action, 'i'), ('delete', self.on_action_delete), ('duplicate', self.duplicate), ('page-size', self.page_size_dialog), ('crop', self.crop_dialog), ('hide', self.hide_dialog), ('crop-white-borders', self.crop_white_borders), ('export-selection', self.choose_export_selection_pdf_name, 'i'), ('export-all', self.on_action_export_all), ('reverse-order', self.reverse_order), ('save', self.on_action_save), ('save-as', self.on_action_save_as), ('new', self.on_action_new), ('open', self.on_action_open), ('import', self.on_action_import), ('zoom-in', self.on_action_zoom_in), ('zoom-out', self.on_action_zoom_out), ('zoom-fit', self.on_action_zoom_fit), ('fullscreen', self.on_action_fullscreen), ('close', self.on_action_close), ('quit', self.on_quit), ('undo', self.undomanager.undo), ('redo', self.undomanager.redo), ('split', self.split_pages), ('merge', self.merge_pages), ('metadata', self.edit_metadata), ('cut', self.on_action_cut), ('copy', self.on_action_copy), ('explode-images', self.on_action_explode_into_images), ('extract', self.on_action_extract, 'i'), ('paste', self.on_action_paste, 'i'), ('select', self.on_action_select, 'i'), ('select-same-file', self.on_action_select, 'i'), ('select-same-format', self.on_action_select, 'i'), ('about', self.about_dialog), ("insert-blank-page", self.insert_blank_page), ("generate-booklet", self.generate_booklet), ("preferences", self.on_action_preferences), ("print", self.on_action_print), ] self.window.add_action_entries(self.actions) self.main_menu = self.uiXML.get_object("main_menu_button") self.window.add_action(Gio.PropertyAction.new("main-menu", self.main_menu, "active")) for a, k in self.config.get_accels(): self.set_accels_for_action("win." + a, [k] if isinstance(k, str) else k) # Disable actions self.iv_selection_changed_event() self.window_focus_in_out_event() self.undomanager.set_actions(self.window.lookup_action('undo'), self.window.lookup_action('redo')) def insert_blank_page(self, _action, _option, _unknown): size = (21 / 2.54 * 72, 29.7 / 2.54 * 72) # A4 by default selection = self.iconview.get_selected_items() selection.sort() model = self.iconview.get_model() if len(selection) > 0: size = model[selection[-1]][0].size_in_points() page_size = pageutils.BlankPageDialog(size, self.window).run_get() if page_size is not None: adder = PageAdder(self) if len(selection) > 0: adder.move(Gtk.TreeRowReference.new(model, selection[-1]), False) file, _ = exporter.get_blank_doc(adder, self.pdfqueue, self.tmp_dir, page_size) if file is None: return adder.addpages(file) adder.commit(select_added=False, add_to_undomanager=True) def generate_booklet(self, _action, _option, _unknown): self.undomanager.commit("generate booklet") model = self.iconview.get_model() selection = self.iconview.get_selected_items() selection.sort(key=lambda x: x.get_indices()[0]) ref_list = [Gtk.TreeRowReference.new(model, path) for path in selection] pages = [model.get_value(model.get_iter(ref.get_path()), 0) for ref in ref_list] self.apply_hide_margins_on_pages(pages) # Need uniform page size. p1w, p1h = pages[0].size_in_points() for page in pages[1:]: pw, ph = page.size_in_points() if abs(p1w-pw) > 1e-2 or abs(p1h-ph) > 1e-2: msg = _('All pages must have the same size.') self.error_message_dialog(msg) return # We need a multiple of 4 blank_page_count = 0 if len(pages) % 4 == 0 else 4 - len(pages) % 4 if blank_page_count > 0: adder = PageAdder(self) a = adder, self.pdfqueue, self.tmp_dir, pages[0].size_in_points() file, _npage = exporter.get_blank_doc(*a) if file is None: return for __ in range(blank_page_count): adder.addpages(file) pages += adder.pages adder = PageAdder(self) booklet = exporter.generate_booklet(self.pdfqueue, self.tmp_dir, pages) adder.move(Gtk.TreeRowReference.new(self.model, selection[0]), True) adder.addpages(booklet) adder.commit(select_added=False, add_to_undomanager=False) self.clear_selected(add_to_undomanager=False) self.silent_render() def on_action_preferences(self, _action, _option, _unknown): handy_available = True if Handy else False self.config.preferences_dialog(self.window, localedir, handy_available) self.set_color_scheme() def on_action_print(self, _action, _option, _unknown): exporter.PrintOperation(self).run() @staticmethod def __create_filters(file_type_list): filter_list = [] f_supported = Gtk.FileFilter() f_supported.set_name(_('All supported files')) filter_list.append(f_supported) if 'pdf' in file_type_list: f_pdf = Gtk.FileFilter() f_pdf.set_name(_('PDF files')) for f in [f_pdf, f_supported]: f.add_pattern('*.pdf') if os.name != 'nt': f.add_mime_type('application/pdf') filter_list.append(f_pdf) if 'all' in file_type_list: f = Gtk.FileFilter() f.set_name(_('All files')) f.add_pattern('*') filter_list.append(f) if 'img2pdf' in file_type_list: f_img = Gtk.FileFilter() f_img.set_name(_('Supported image files')) for f in [f_img, f_supported]: for mime in img2pdf_supported_img: if os.name != 'nt': f.add_mime_type(mime) for extension in mimetypes.guess_all_extensions(mime): f.add_pattern('*' + extension) filter_list.append(f_img) return filter_list def set_title(self, title, subtitle = None): self.uiXML.get_object('header_bar').set_title(title) self.uiXML.get_object('header_bar').set_subtitle(subtitle) def do_activate(self): """ https://lazka.github.io/pgi-docs/Gio-2.0/classes/Application.html#Gio.Application.do_activate """ # TODO: huge method that should be split iconsdir = os.path.join(sharedir, 'icons') if not os.path.exists(iconsdir): iconsdir = os.path.join(sharedir, 'data', 'icons') Gtk.IconTheme.get_default().append_search_path(iconsdir) self.__create_main_window() self.set_title(APPNAME) self.window.set_border_width(0) self.window.set_application(self) if self.config.maximized(): self.window.maximize() self.window.set_default_size(*self.config.window_size()) self.window.move(*self.config.position()) self.window.connect('delete_event', self.on_quit) self.window.connect('focus_in_event', self.window_focus_in_out_event) self.window.connect('focus_out_event', self.window_focus_in_out_event) self.window.connect('configure_event', self.window_configure_event) if hasattr(GLib, "unix_signal_add"): GLib.unix_signal_add(GLib.PRIORITY_DEFAULT, signal.SIGINT, self.close_application) # Create a scrolled window to hold the thumbnails-container self.sw = self.uiXML.get_object('scrolledwindow') self.sw.drag_dest_set(Gtk.DestDefaults.HIGHLIGHT | Gtk.DestDefaults.DROP, self.TARGETS_SW, Gdk.DragAction.COPY) self.sw.connect('drag_data_received', self.sw_dnd_received_data) self.sw.connect('button_press_event', self.sw_button_press_event) self.sw.connect('scroll_event', self.sw_scroll_event) # Create ListStore model and IconView self.model = Gtk.ListStore(GObject.TYPE_PYOBJECT, str) self.undomanager = undo.Manager(self) self.zoom_set(self.config.zoom_level()) self.iconview = Gtk.IconView(self.model) self.iconview.clear() self.iconview.set_item_width(-1) self.cellthmb = CellRendererImage() self.cellthmb.set_padding(3, 3) self.cellthmb.set_alignment(0.5, 0.5) self.iconview.pack_start(self.cellthmb, False) self.iconview.set_cell_data_func(self.cellthmb, self.set_cellrenderer_data, None) self.iconview.set_text_column(1) cell_text_renderer = self.iconview.get_cells()[1] cell_text_renderer.props.ellipsize = Pango.EllipsizeMode.MIDDLE self.iconview.set_selection_mode(Gtk.SelectionMode.MULTIPLE) self.iconview.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK, self.TARGETS_IV, Gdk.DragAction.COPY | Gdk.DragAction.MOVE) self.iconview.enable_model_drag_dest(self.TARGETS_IV, Gdk.DragAction.COPY | Gdk.DragAction.MOVE) self.iconview.connect('drag_begin', self.iv_drag_begin) self.iconview.connect('drag_data_get', self.iv_dnd_get_data) self.iconview.connect('drag_data_received', self.iv_dnd_received_data) self.iconview.connect('drag_data_delete', self.iv_dnd_data_delete) self.iconview.connect('drag_motion', self.iv_dnd_motion) self.iconview.connect('drag_leave', self.iv_dnd_leave_end) self.iconview.connect('drag_end', self.iv_dnd_leave_end) self.iconview.connect('button_press_event', self.iv_button_press_event) self.iconview.connect('motion_notify_event', self.iv_motion) self.iconview.connect('button_release_event', self.iv_button_release_event) self.iconview.connect('style_updated', self.set_text_renderer_cell_height) self.id_selection_changed_event = self.iconview.connect('selection_changed', self.iv_selection_changed_event) self.iconview.connect('key_press_event', self.iv_key_press_event) self.iconview.connect('size_allocate', self.iv_size_allocate) self.sw.add(self.iconview) # Status bar to the left self.status_bar = self.uiXML.get_object('statusbar') # Status bar to the right self.status_bar2 = self.uiXML.get_object('statusbar2') # Vertical scrollbar vscrollbar = self.sw.get_vscrollbar() vscrollbar.connect('value_changed', self.vscrollbar_value_changed) vscrollbar.props.adjustment.step_increment = 75 self.window.show_all() # Change iconview color background style_context_sw = self.sw.get_style_context() color_selected = self.iconview.get_style_context() \ .get_background_color(Gtk.StateFlags.SELECTED) color_prelight = color_selected.copy() color_prelight.alpha = 0.3 for state in (Gtk.StateFlags.NORMAL, Gtk.StateFlags.ACTIVE): self.iconview.override_background_color( state, style_context_sw.get_background_color(state)) self.iconview.override_background_color(Gtk.StateFlags.SELECTED, color_selected) self.iconview.override_background_color(Gtk.StateFlags.PRELIGHT, color_prelight) # Set cursor look and hide overshoot gradient style_provider = Gtk.CssProvider() css_data = """ iconview { outline-color: alpha(currentColor, 0.8); outline-style: dashed; outline-offset: -2px; outline-width: 2px; -gtk-outline-radius: 2px; } scrolledwindow overshoot { background: none; } """ style_provider.load_from_data(bytes(css_data.encode())) Gtk.StyleContext.add_provider_for_screen( Gdk.Screen.get_default(), style_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION) GObject.type_register(PDFRenderer) GObject.signal_new('update_thumbnail', PDFRenderer, GObject.SignalFlags.RUN_FIRST, None, [GObject.TYPE_PYOBJECT, GObject.TYPE_PYOBJECT, GObject.TYPE_PYOBJECT, GObject.TYPE_PYOBJECT, GObject.TYPE_BOOLEAN]) self.set_unsaved(False) self.__create_actions() self.__create_menus() self.iv_cursor = IconviewCursor(self) self.iv_drag_select = IconviewDragSelect(self) self.iv_pan_view = IconviewPanView(self) if self.config.content_loss_warning(): self.content_loss_warning() def do_command_line(self, command_line): options = command_line.get_options_dict() # Print PDF Arranger version and exit if options.contains("version"): print(APPNAME + "-" + VERSION) print("pikepdf-" + pikepdf.__version__) print("libqpdf-" + pikepdf.__libqpdf_version__) return 0 self.activate() if options.lookup_value(GLib.OPTION_REMAINING): files = [Gio.File.new_for_commandline_arg(i) for i in options.lookup_value(GLib.OPTION_REMAINING)] GObject.idle_add(self.add_files, files) return 0 def add_files(self, files): """Add files passed as command line arguments.""" a = PageAdder(self) for f in files: try: a.addpages(f.get_path()) except FileNotFoundError as e: print(e, file=sys.stderr) self.error_message_dialog(e) a.commit(select_added=False, add_to_undomanager=True) @staticmethod def set_text_renderer_cell_height(iconview): """Update text renderer cell height on style update. Having a fixed height will improve speed. Cell height is: "number of rows" * "text height" + 2 * padding At start cell will have the height of 1 row + paddings. """ cell_text_renderer = iconview.get_cells()[1] cell_text_renderer.set_fixed_size(-1, -1) paddy = cell_text_renderer.get_padding()[1] natural_height = cell_text_renderer.get_preferred_height(iconview)[1] text = cell_text_renderer.props.text height = 2 * (natural_height - paddy) if text is None else natural_height cell_text_renderer.set_fixed_size(-1, height) @staticmethod def set_cellrenderer_data(_column, cell, model, it, _data=None): cell.set_page(model.get_value(it, 0)) def render(self): self.render_id = None if not self.sw.is_sensitive(): return alive = self.quit_rendering() if alive: self.silent_render() return self.visible_range = self.get_visible_range2() columns_nr = self.iconview.get_columns() self.rendering_thread = PDFRenderer(self.model, self.pdfqueue, self.visible_range , columns_nr) self.rendering_thread.connect('update_thumbnail', self.update_thumbnail) self.rendering_thread.start() ctxt_id = self.status_bar2.get_context_id("rendering") self.status_bar2.push(ctxt_id, _('Rendering…')) def quit_rendering(self): """Quit rendering.""" if self.rendering_thread is None: return False self.rendering_thread.quit = True # If thread is busy with page.render(cr) it might take some time for thread to quit. # Therefore set a timeout here so app continues to stay responsive. self.rendering_thread.join(timeout=0.15) return self.rendering_thread.is_alive() def silent_render(self): """Render when silent i.e. when no call for last 149ms. Improves app responsiveness by not calling render too frequently. """ if self.render_id: GObject.source_remove(self.render_id) self.render_id = GObject.timeout_add(149, self.render) def render_lock(self): """Acquire/release a lock (before any add/delete/reorder).""" class __RenderLock: def __init__(self, app): self.app = app def _th(self): return self.app.rendering_thread def __enter__(self): if self._th(): self._th().model_lock.acquire() def __exit__(self, _exc_type, _exc_value, _traceback): if self._th() and self._th().model_lock.locked(): self._th().model_lock.release() return __RenderLock(self) def vscrollbar_value_changed(self, _vscrollbar): """Render when vertical scrollbar value has changed.""" self.silent_render() def window_configure_event(self, _window, event): """Handle window size and position changes.""" if self.window_width_old not in [0, event.width] and len(self.model) > 0: if self.set_iv_visible_id: GObject.source_remove(self.set_iv_visible_id) self.set_iv_visible_id = GObject.timeout_add(500, self.set_iconview_visible) self.iconview.set_visible(False) self.window_width_old = event.width if len(self.model) > 1: # Don't trigger extra render after first page is inserted self.silent_render() def set_iconview_visible(self): self.set_iv_visible_id = None if len(self.iconview.get_selected_items()) == 0: self.vadj_percent_handler(store=True) self.update_iconview_geometry() self.scroll_to_selection() self.sw.set_visible(False) self.sw.set_visible(True) GObject.idle_add(self.iconview.set_visible, True) self.iconview.grab_focus() self.silent_render() def set_save_file(self, file): if file != self.save_file: self.save_file = file self.set_unsaved(True) def set_unsaved(self, flag): self.is_unsaved = flag GObject.idle_add(self.retitle) def retitle(self): subtitle = None if self.save_file: subtitle, title = os.path.split(self.save_file) else: title = _('untitled') if self.is_unsaved: title += '*' all_files = set(os.path.splitext(doc.basename)[0] for doc in self.pdfqueue) all_files.discard('') if len(all_files) > 0: title += ' [' + ', '.join(sorted(all_files)) + ']' title += ' – ' + APPNAME self.set_title(title, subtitle) return False def update_thumbnail(self, _obj, ref, thumbnail, zoom, scale, is_preview): """Update thumbnail emitted from rendering thread.""" if ref is None: # Rendering ended ctxt_id = self.status_bar2.get_context_id("rendering") self.status_bar2.remove_all(ctxt_id) malloc_trim() return path = ref.get_path() if path is None: # Page no longer exist return if (self.visible_range[0] <= path.get_indices()[0] <= self.visible_range[1] and zoom != self.zoom_scale): # Thumbnail is in the visible range but is not rendered for current zoom level self.silent_render() return page = self.model[path][0] if page.scale != scale: # Page scale was changed while page was rendered -> trash & rerender self.silent_render() return page.thumbnail = thumbnail page.resample = 1 / zoom if is_preview: page.preview = thumbnail # Let iconview refresh the thumbnail (only) by selecting it with GObject.signal_handler_block(self.iconview, self.id_selection_changed_event): if self.iconview.path_is_selected(path): self.iconview.unselect_path(path) self.iconview.select_path(path) else: self.iconview.select_path(path) self.iconview.unselect_path(path) ac = self.iconview.get_accessible().ref_accessible_child(path.get_indices()[0]) ac.set_description(page.description()) def get_visible_range2(self): """Get range of items visible in window. A item is considered visible if more than 50% of item is visible. """ vr = self.iconview.get_visible_range() if vr is None: return -1, -1 first_ind = vr[0].get_indices()[0] last_ind = vr[1].get_indices()[0] first_cell = self.iconview.get_cell_rect(vr[0])[1] last_cell = self.iconview.get_cell_rect(vr[1])[1] sw_height = self.sw.get_allocated_height() if first_cell.y + first_cell.height * 0.5 < 0: columns_nr = self.iconview.get_columns() first_ind = min(first_ind + columns_nr, len(self.model) - 1) if last_cell.y + last_cell.height * 0.5 > sw_height: last_item_col = self.iconview.get_item_column(vr[1]) last_ind = max(last_ind - last_item_col - 1, 0) return min(first_ind, last_ind), max(first_ind, last_ind) def hide_horizontal_scrollbar(self): """Hide horizontal scrollbar when not needed.""" sw_hadj = self.sw.get_hadjustment() hscrollbar = self.sw.get_hscrollbar() if sw_hadj.get_upper() <= self.sw.get_allocated_width(): hscrollbar.hide() else: hscrollbar.show() def update_iconview_geometry(self): """Set iconview cell size, margins, number of columns and spacing.""" if len(self.model) > 0: item_width = max(row[0].width_in_pixel() for row in self.model) item_padding = self.iconview.get_item_padding() cellthmb_xpad, cellthmb_ypad = self.cellthmb.get_padding() border_and_shadow = 7 # 2*th1+th2 set in iconview.py # cell width min limit 50 is set in gtkiconview.c cell_width = max(item_width + 2 * cellthmb_xpad + border_and_shadow, 50) cell_height = -1 if self.zoom_fit_page: item_height = max(row[0].height_in_pixel() for row in self.model) cell_height = item_height + 2 * cellthmb_ypad + border_and_shadow self.cellthmb.set_fixed_size(cell_width, cell_height) padded_cell_width = cell_width + 2 * item_padding min_col_spacing = 5 min_margin = 11 iw_width = self.sw.get_allocation().width # 2 * min_margin + col_num * padded_cell_width # + min_col_spacing * (col_num+1) = iw_width col_num = (iw_width - 2 * min_margin - min_col_spacing) //\ (padded_cell_width + min_col_spacing) spacing = (iw_width - col_num * padded_cell_width - 2 * min_margin) // (col_num + 1) margin = (iw_width - col_num * (padded_cell_width + spacing) + spacing) // 2 if col_num == 0: col_num = 1 margin = 6 self.iconview.set_columns(col_num) self.iconview.set_column_spacing(spacing) self.iconview.set_margin(margin) def vadj_percent_handler(self, store=False, restore=False): """Store and restore adjustment percentual value.""" sw_vadj = self.sw.get_vadjustment() lower_limit = sw_vadj.get_lower() upper_limit = sw_vadj.get_upper() page_size = sw_vadj.get_page_size() sw_vpos = sw_vadj.get_value() vadj_range = upper_limit - lower_limit - page_size if store and self.vadj_percent is None and vadj_range > 0: self.vadj_percent = (sw_vpos - lower_limit) / vadj_range if restore and self.vadj_percent is not None: sw_vadj.set_value(self.vadj_percent * vadj_range + lower_limit) self.vadj_percent = None def iv_size_allocate(self, _iconview, _allocation): self.hide_horizontal_scrollbar() self.set_adjustment_limits() if self.vadj_percent is not None and not self.zoom_fit_page: self.vadj_percent_handler(restore=True) if self.scroll_path: GObject.idle_add(self.scroll_to_path2, self.scroll_path) self.scroll_path = None def set_adjustment_limits(self): hscrollbar = self.sw.get_hscrollbar() vscrollbar = self.sw.get_vscrollbar() if len(self.model) == 0: # Hide scrollbars https://gitlab.gnome.org/GNOME/gtk/-/issues/4370 ? hscrollbar.set_range(0, 0) vscrollbar.set_range(0, 0) else: # Remove margins at top and bottom of iconview lower_limit = self.iconview.get_margin() - 6 upper_limit = vscrollbar.props.adjustment.get_upper() - lower_limit vscrollbar.set_range(lower_limit, upper_limit) def confirm_dialog(self, msg, action): """A dialog for confirmation of an action.""" d = Gtk.MessageDialog(self.window, 0, Gtk.MessageType.WARNING, Gtk.ButtonsType.NONE, msg) d.add_buttons(action, 1, _('_Cancel'), 2) response = d.run() d.destroy() return response == 1 def save_changes_dialog(self, msg): """A dialog which ask if changes should be saved.""" d = Gtk.MessageDialog(self.window, 0, Gtk.MessageType.WARNING, Gtk.ButtonsType.NONE, msg) d.format_secondary_markup(_("Your changes will be lost if you don’t save them.")) d.add_buttons(_('Do_n’t Save'), 1, _('_Cancel'), 2, _('_Save'), 3) response = d.run() d.destroy() return response def on_action_close(self, _action, _param, _unknown): """Close all files and restore initial state.""" if self.is_unsaved: if len(self.model) == 0: msg = _('Discard changes and close?') confirm = self.confirm_dialog(msg, action=_('_Close')) if not confirm: return else: if self.save_file: msg = _('Save changes to “{}” before closing?') msg = msg.format(os.path.basename(self.save_file)) else: msg = _('Save changes before closing?') response = self.save_changes_dialog(msg) if response == 3: self.post_action = 'CLEAR_DATA' self.save_or_choose() return elif response != 1: return self.clear_data() def clear_data(self): self.iconview.unselect_all() with self.render_lock(): self.model.clear() self.pdfqueue = [] self.metadata = {} self.undomanager.clear() self.set_save_file(None) self.export_file = None self.set_unsaved(False) self.update_statusbar() malloc_trim() def on_quit(self, _action, _param=None, _unknown=None): if self.disable_quit: return Gdk.EVENT_STOP elif self.is_unsaved: if len(self.model) == 0: msg = _('Discard changes and quit?') confirm = self.confirm_dialog(msg, action=_('_Quit')) if not confirm: return Gdk.EVENT_STOP else: if self.save_file: msg = _('Save changes to “{}” before quitting?') msg = msg.format(os.path.basename(self.save_file)) else: msg = _('Save changes before quitting?') response = self.save_changes_dialog(msg) if response == 3: self.post_action = 'CLOSE_APPLICATION' self.save_or_choose() return Gdk.EVENT_STOP elif response != 1: return Gdk.EVENT_STOP self.close_application() return Gdk.EVENT_STOP def close_application(self, _widget=None, _event=None, _data=None): """Termination""" self.quit_flag.set() if self.rendering_thread: self.rendering_thread.quit = True self.rendering_thread.join() self.rendering_thread.pdfqueue = [] if self.export_process: self.export_process.join(timeout=2) if self.export_process.is_alive(): self.export_process.terminate() self.export_process.join() # Prevent gtk errors when closing with everything selected self.iconview.unselect_all() self.iconview.get_model().clear() # Release Poppler.Document instances to unlock all temporary files self.pdfqueue = [] gc.collect() self.config.set_window_size(self.window.get_size()) self.config.set_maximized(self.window.is_maximized()) self.config.set_zoom_level(round(self.zoom_level)) self.config.set_position(self.window.get_position()) self.config.save() if os.path.isdir(self.tmp_dir): shutil.rmtree(self.tmp_dir) self.quit() @staticmethod def get_cnt_filename(f, need_cnt=False): """Get a filename where the value at end is incremented by 1.""" shortname, ext = os.path.splitext(f) if ext.lower() != ".pdf": ext = ".pdf" cnt = "" for char in reversed(shortname): if char.isdigit(): cnt = char + cnt else: break if cnt != "": name_part = shortname[:-len(cnt)] cnt_part = str(int(cnt) + 1).zfill(len(cnt)) f = name_part + cnt_part + ext elif need_cnt: f = shortname + "-002" + ext return f def choose_export_pdf_name(self, exportmode): """Handles choosing a name for exporting """ title = _('Save As…') if exportmode == 'ALL_TO_SINGLE' else _('Export…') chooser = Gtk.FileChooserNative.new(title=title, parent=self.window, action=Gtk.FileChooserAction.SAVE, accept_label=_("_Save"), cancel_label=_("_Cancel")) chooser.set_do_overwrite_confirmation(True) if len(self.pdfqueue) > 0: f = self.save_file or self.pdfqueue[0].filename f_dir, basename = os.path.split(f) tempdir = f_dir.startswith(tempfile.gettempdir()) and f_dir.endswith(DOMAIN) if exportmode == 'ALL_TO_SINGLE': if f.endswith(".pdf") and not tempdir: chooser.set_filename(f) # Set name to existing file else: shortname, ext = os.path.splitext(basename) if self.export_file is None and tempdir: shortname = "" f = self.export_file or shortname + "-000" + ext f = self.get_cnt_filename(f) chooser.set_current_name(f) # Set name to new file chooser.set_current_folder(self.export_directory) filter_list = self.__create_filters(['pdf', 'all']) for f in filter_list[1:]: chooser.add_filter(f) response = chooser.run() file_out = chooser.get_filename() chooser.destroy() if response == Gtk.ResponseType.ACCEPT: root, ext = os.path.splitext(file_out) if ext.lower() != '.pdf': ext = '.pdf' file_out = file_out + ext files_out = [file_out] if exportmode in ['ALL_TO_MULTIPLE', 'SELECTED_TO_MULTIPLE']: s = self.iconview.get_selected_items() len_files = len(self.model) if exportmode == 'ALL_TO_MULTIPLE' else len(s) for i in range(1, len_files): files_out.append(self.get_cnt_filename(files_out[-1], need_cnt=True)) if os.path.exists(files_out[i]): msg = (_('A file named "%s" already exists. Do you want to replace it?') % os.path.split(files_out[i])[1]) replace = self.confirm_dialog(msg, _("Replace")) if not replace: return self.save(exportmode, files_out) else: self.post_action = None def open_dialog(self, title): chooser = Gtk.FileChooserNative.new(title=title, parent=self.window, action=Gtk.FileChooserAction.OPEN, accept_label=_("_Open"), cancel_label=_("_Cancel")) if self.import_directory is not None: chooser.set_current_folder(self.import_directory) chooser.set_select_multiple(True) file_type_list = ['all', 'pdf'] if len(img2pdf_supported_img) > 0: file_type_list = ['all', 'img2pdf', 'pdf'] filter_list = self.__create_filters(file_type_list) for f in filter_list: chooser.add_filter(f) return chooser.run(), chooser def on_action_new(self, _action=None, _param=None, _unknown=None, filenames=None): """Start a new instance.""" filenames = filenames or [] if os.name == 'nt': args = [str(sys.executable)] for filename in filenames: args.append(filename) if sys.executable.find('python3.exe') != -1: args.insert(1, '-mpdfarranger') subprocess.Popen(args) else: display = Gdk.Display.get_default() launch_context = display.get_app_launch_context() desktop_file = "%s.desktop"%(self.get_application_id()) try: app_info = Gio.DesktopAppInfo.new(desktop_file) launch_files = [] for filename in filenames: launch_file = Gio.File.new_for_path(filename) launch_files.append(launch_file) app_info.launch(launch_files, launch_context) except TypeError: args = [str(sys.executable), '-mpdfarranger'] for filename in filenames: args.append(filename) subprocess.Popen(args) def on_action_open(self, _action, _param, _unknown): """Open new file(s).""" response, chooser = self.open_dialog(_('Open…')) if response == Gtk.ResponseType.ACCEPT: if len(self.pdfqueue) > 0 or len(self.metadata) > 0: self.on_action_new(filenames=chooser.get_filenames()) else: adder = PageAdder(self) filenames = chooser.get_filenames() filenames = reversed(filenames) if os.name == 'nt' else filenames for filename in filenames: adder.addpages(filename) adder.commit(select_added=False, add_to_undomanager=True) chooser.destroy() def on_action_save(self, _action, _param, _unknown): self.save_or_choose() def save_or_choose(self): """Saves to the previously exported file or shows the export dialog if there was none.""" savemode = 'ALL_TO_SINGLE' if self.save_file: self.save(savemode, [self.save_file]) else: self.choose_export_pdf_name(savemode) def on_action_save_as(self, _action, _param, _unknown): self.choose_export_pdf_name('ALL_TO_SINGLE') def save(self, exportmode, files_out): """Saves to the specified file.""" if exportmode in ['SELECTED_TO_SINGLE', 'SELECTED_TO_MULTIPLE']: selection = reversed(self.iconview.get_selected_items()) pages = [self.model[row][0].duplicate(incl_thumbnail=False) for row in selection] else: pages = [row[0].duplicate(incl_thumbnail=False) for row in self.model] self.apply_hide_margins_on_pages(pages) if exportmode == 'ALL_TO_SINGLE': self.set_save_file(files_out[0]) else: self.export_file = os.path.split(files_out[-1])[1] self.export_directory = os.path.split(files_out[0])[0] files = [(pdf.copyname, pdf.password) for pdf in self.pdfqueue] export_msg = multiprocessing.Queue() a = files, pages, self.metadata, files_out, self.quit_flag, export_msg self.export_process = multiprocessing.Process(target=exporter.export_process, args=a) self.export_process.start() GObject.timeout_add(300, self.export_finished, exportmode, export_msg) self.set_export_state(True) def save_warning_dialog(self, msg): d = Gtk.MessageDialog( type=Gtk.MessageType.WARNING, parent=self.window, text=_("Saving produced some warnings"), secondary_text=_("Despite the warnings the document(s) should have no visible issues."), buttons=Gtk.ButtonsType.OK ) sw = Gtk.ScrolledWindow(margin=6) label = Gtk.Label(msg, wrap=True, margin=6, xalign=0.0, selectable=True) sw.add(label) d.vbox.pack_start(sw, False, False, 0) cb = Gtk.CheckButton(_("Don't show warnings when saving again."), margin=6, can_focus=False) d.vbox.pack_start(cb, False, False, 0) d.show_all() sw.set_min_content_height(min(150, label.get_allocated_height())) cb.set_can_focus(True) d.run() self.config.set_show_save_warnings(not cb.get_active()) d.destroy() def export_finished(self, exportmode, export_msg): """Check if export finished. Show any messages. Run any post action.""" if self.export_process.is_alive(): return True # continue polling self.set_export_state(False) msg_type = None if not export_msg.empty(): msg, msg_type = export_msg.get() if exportmode == 'ALL_TO_SINGLE' and msg_type != Gtk.MessageType.ERROR: self.set_unsaved(False) if msg_type == Gtk.MessageType.ERROR: self.error_message_dialog(msg) elif msg_type == Gtk.MessageType.WARNING and self.config.show_save_warnings(): self.save_warning_dialog(msg) if not self.is_unsaved: if self.post_action == 'CLEAR_DATA': self.clear_data() elif self.post_action == 'CLOSE_APPLICATION': self.close_application() self.post_action = None return False # cancel timer def set_export_state(self, enable, message=_("Saving…")): """Enable/disable app export state. When enabled app is moveable, resizable and closeable but does not respond to other input. """ if self.quit_flag.is_set(): return self.sw.set_sensitive(not enable) self.main_menu.set_sensitive(not enable) self.disable_quit = enable for a in self.actions: self.window.lookup_action(a[0]).set_enabled(not enable) ctxt_id = self.status_bar2.get_context_id("saving") if enable: self.status_bar2.push(ctxt_id, message) cursor = Gdk.Cursor.new_from_name(Gdk.Display.get_default(), 'wait') self.quit_rendering() else: self.status_bar2.remove_all(ctxt_id) cursor = Gdk.Cursor.new_from_name(Gdk.Display.get_default(), 'default') self.window_focus_in_out_event() self.iv_selection_changed_event() self.silent_render() self.iconview.grab_focus() self.iconview.get_window().set_cursor(cursor) def choose_export_selection_pdf_name(self, _action, mode, _unknown): exportmodes = {0: 'ALL_TO_SINGLE', 1: 'ALL_TO_MULTIPLE', 2: 'SELECTED_TO_SINGLE', 3: 'SELECTED_TO_MULTIPLE'} exportmode = exportmodes[mode.get_int32()] self.choose_export_pdf_name(exportmode) def on_action_export_all(self, _action, _param, _unknown): self.choose_export_pdf_name('ALL_TO_MULTIPLE') def on_action_import(self, _action, _param, _unknown): """Import doc""" response, chooser = self.open_dialog(_('Import…')) if response == Gtk.ResponseType.ACCEPT: adder = PageAdder(self) filenames = chooser.get_filenames() filenames = reversed(filenames) if os.name == 'nt' else filenames for filename in filenames: adder.addpages(filename) adder.commit(select_added=False, add_to_undomanager=True) chooser.destroy() def clear_selected(self, add_to_undomanager=True): """Removes the selected elements in the IconView""" if add_to_undomanager: self.undomanager.commit("Delete") model = self.iconview.get_model() selection = self.iconview.get_selected_items() selection.sort(reverse=True) self.set_unsaved(True) with GObject.signal_handler_block(self.iconview, self.id_selection_changed_event): with self.render_lock(): for path in selection: model.remove(model.get_iter(path)) path = selection[-1] self.iconview.select_path(path) if not self.iconview.path_is_selected(path): if len(model) > 0: # select the last row row = model[-1] path = row.path self.iconview.select_path(path) self.scroll_path = path self.update_iconview_geometry() self.iv_selection_changed_event() self.iconview.grab_focus() self.silent_render() self.update_max_zoom_level() malloc_trim() def scroll_to_path2(self, path): """scroll_to_path() with modifications. * Don't scroll to a oversized page that already is filling window * Scroll only vertically """ cell = self.iconview.get_cell_rect(path)[1] if cell.y <= 0 and cell.y + cell.height >= self.sw.get_allocated_height(): return sw_hadj = self.sw.get_hadjustment() sw_hpos = sw_hadj.get_value() self.iconview.scroll_to_path(path, False, 0, 0) sw_hadj.set_value(sw_hpos) def copy_pages(self, add_hash=True): """Collect data from selected pages""" model = self.iconview.get_model() selection = self.iconview.get_selected_items() selection.sort(key=lambda x: x.get_indices()[0]) data = [] for path in selection: it = model.get_iter(path) data.append(model.get_value(it, 0).serialize()) if data: data = '\n;\n'.join(data) if add_hash: h = hashlib.sha256(data.encode('utf-8')).hexdigest() data = h + '\n' + data return data def paste_pages(self, data, before, ref_to, select_added): """Paste pages to iconview""" pageadder = PageAdder(self) if ref_to: pageadder.move(ref_to, before) for d in data: pageadder.addpages(*d) return pageadder.commit(select_added, add_to_undomanager=True) def paste_files(self, filepaths, before, ref_to): """Paste files to iconview.""" pageadder = PageAdder(self) for filepath in filepaths: pageadder.move(ref_to, before) pageadder.addpages(filepath) pageadder.commit(select_added=False, add_to_undomanager=True) def paste_pages_interleave(self, data, before, ref_to): """Paste pages or files interleved to iconview.""" pageadder = PageAdder(self) model = self.iconview.get_model() scroll = len(model) > 0 iter_to = None iref = ref_to.get_path().get_indices()[0] if ref_to else 0 self.undomanager.commit("Paste") self.set_unsaved(True) for d in data: pageadder.addpages(*d) pageadder.move(ref_to, before) pageadder.commit(select_added=False, add_to_undomanager=False) if ref_to: path = ref_to.get_path() iter_to = model.get_iter(path) iter_to = model.iter_next(iter_to) if not before: iter_to = model.iter_next(iter_to) if iter_to: path = model.get_path(iter_to) ref_to = Gtk.TreeRowReference.new(model, path) else: ref_to = None if scroll: iscroll = iref if before else iref + 1 scroll_path = Gtk.TreePath.new_from_indices([iscroll]) self.iconview.scroll_to_path(scroll_path, False, 0, 0) def on_action_delete(self, _action, _parameter, _unknown): """Removes the selected elements in the IconView""" self.clear_selected() def on_action_cut(self, _action, _param, _unknown): """Cut selected pages to clipboard.""" data = self.copy_pages() self.clipboard.set_text('pdfarranger-clipboard\n' + data, -1) self.clear_selected() self.window.lookup_action("paste").set_enabled(True) def on_action_copy(self, _action, _param, _unknown): """Copy selected pages to clipboard.""" data = self.copy_pages() self.clipboard.set_text('pdfarranger-clipboard\n' + data, -1) self.window.lookup_action("paste").set_enabled(True) def on_action_paste(self, _action, mode, _unknown): """Paste pages, file paths or an image from clipboard.""" data, data_is_filepaths = self.read_from_clipboard() if not data: return pastemodes = {0: 'AFTER', 1: 'BEFORE', 2: 'ODD', 3: 'EVEN', 4: 'OVERLAY', 5: 'UNDERLAY'} pastemode = pastemodes[mode.get_int32()] ref_to, before = self.set_paste_location(pastemode) if pastemode in ['AFTER', 'BEFORE']: if data_is_filepaths: self.paste_files(data, before, ref_to) else: self.paste_pages(data, before, ref_to, select_added=False) elif pastemode in ['ODD', 'EVEN']: if data_is_filepaths: # Generate data to send to paste_pages_interleave filepaths = [] try: for filepath in data: filemime = mimetypes.guess_type(filepath)[0] if not filemime: raise PDFDocError(filepath + ':\n' + _('Unknown file format')) if filemime == 'application/pdf': num_pages = exporter.num_pages(filepath) if num_pages is None: raise PDFDocError(filepath + ':\n' + _('PDF document is damaged')) for page in range(1, num_pages + 1): filepaths.append((filepath, page)) elif filemime.split('/')[0] == 'image': filepaths.append((filepath, 1)) else: raise PDFDocError(filepath + ':\n' + _('File is neither pdf nor image')) except PDFDocError as e: print(e.message, file=sys.stderr) self.error_message_dialog(e.message) return data = filepaths self.paste_pages_interleave(data, before, ref_to) self.update_iconview_geometry() GObject.idle_add(self.retitle) self.iv_selection_changed_event() self.update_max_zoom_level() self.silent_render() elif pastemode in ['OVERLAY', 'UNDERLAY'] and not data_is_filepaths: selection = self.iconview.get_selected_items() self.paste_as_layer(data, selection, laypos=pastemode) def paste_as_layer(self, data, destination, laypos, offset_xy=None): page_stack = [] pageadder = PageAdder(self) for filename, npage, _basename, angle, scale, crop, hide, layerdata in data: d = [[filename, npage, angle, scale, laypos, crop, Sides()]] + layerdata lps = pageadder.get_layerpages(d) self.apply_hide_margins_on_layerpages(lps, hide) page_stack.append(lps) if page_stack[-1] is None: return if not self.is_paste_layer_available(destination): return dpage = self.model[destination[-1]][0] lpage_stack = page_stack[0] if offset_xy is None: a = self.window, dpage, lpage_stack, self.model, self.pdfqueue, laypos, self.layer_pos offset_xy = pageutils.PastePageLayerDialog(*a).get_offset() if offset_xy is None: return self.layer_pos = offset_xy self.undomanager.commit("Add Layer") self.set_unsaved(True) off_x, off_y = offset_xy # Fraction of the page size difference at left & top for num, row in enumerate(reversed(destination)): dpage = self.model[row][0] layerpage_stack = page_stack[num % len(page_stack)] # Add the "main" pasted page lp0 = layerpage_stack[0].duplicate() dwidth, dheight = dpage.size[0] * dpage.scale, dpage.size[1] * dpage.scale scalex = (dpage.width_in_points() - lp0.width_in_points()) / dwidth scaley = (dpage.height_in_points() - lp0.height_in_points()) / dheight left = dpage.crop.left + off_x * scalex top = dpage.crop.top + off_y * scaley lp0.offset = Sides(left=left, right=1 - left - lp0.width_in_points() / dwidth, top=top, bottom=1 - top - lp0.height_in_points() / dheight) dpage.layerpages.append(lp0) # Add layers from the pasted page nfirst = len(dpage.layerpages) - 1 scalex = (lp0.size[0] * lp0.scale) / (dpage.size[0] * dpage.scale) scaley = (lp0.size[1] * lp0.scale) / (dpage.size[1] * dpage.scale) sm1 = Sides(scalex, scalex, scaley, scaley) for lp in layerpage_stack[1:]: lp = lp.duplicate() scalex = (lp0.size[0] * lp0.scale) / (lp.size[0] * lp.scale) scaley = (lp0.size[1] * lp0.scale) / (lp.size[1] * lp.scale) sm2 = Sides(scalex, scalex, scaley, scaley) # Crop layer area outside of the old parent mediabox outside = Sides(*(max(0, lp0.crop[i] - lp.offset[i]) for i in range(4))) lp.crop += outside * sm2 lp.offset += outside # Recalculate the offset relative to the new destination page lp.offset = lp0.offset + (lp.offset - lp0.crop) * sm1 if lp.crop.left + lp.crop.right > 1 or lp.crop.top + lp.crop.bottom > 1: # The layer is outside of the visible area continue # Mark as OVERLAY or UNDERLAY and add the layer at right place in stack if lp.laypos != laypos: lp.laypos = laypos dpage.layerpages.insert(nfirst, lp) else: dpage.layerpages.append(lp) dpage.resample = -1 self.silent_render() def is_paste_layer_available(self, selection): return len(selection) > 0 def read_from_clipboard(self): """Read and pre-process data from clipboard. If an image is found it is stored as a temporary png file. If id "pdfarranger-clipboard" is found pages is expected to be in clipboard, else file paths. """ if len(img2pdf_supported_img) > 0 and self.clipboard.wait_is_image_available(): data_is_filepaths = True image = self.clipboard.wait_for_image() if image is None: data = '' else: fd, filename = tempfile.mkstemp(suffix=".png", dir=self.tmp_dir) os.close(fd) image.savev(filename, "png", [], []) data = [filename] else: data = self.clipboard.wait_for_text() if not data: data = '' data_is_filepaths = False if data.startswith('pdfarranger-clipboard\n'): data = data.replace('pdfarranger-clipboard\n', '', 1) try: copy_hash = data[:data.index('\n')] except ValueError: copy_hash = None else: data = data.replace(copy_hash + '\n', '', 1) paste_hash = hashlib.sha256(data.encode('utf-8')).hexdigest() if copy_hash is not None and copy_hash == paste_hash: data = self.deserialize(data.split('\n;\n')) else: message = _("Pasted data not valid. Aborting paste.") self.error_message_dialog(message) data = [] else: data_is_filepaths = True if os.name == 'posix' and data.startswith('x-special/nautilus-clipboard\ncopy'): data = data.replace('x-special/nautilus-clipboard\ncopy', '', 1) rows = data.split('\n') rows = filter(None, rows) data = [] for row in rows: if os.name == 'posix' and row.startswith('file:///'): # Dolphin, Nautilus row = get_file_path_from_uri(row) elif os.name == 'nt' and row.startswith('"') and row.endswith('"'): row = row[1:-1] if os.path.isfile(row): data.append(row) else: data = [] break return data, data_is_filepaths @staticmethod def deserialize(data): """Deserialize data from copy & paste or drag & drop operation.""" d = [] while data: tmp = data.pop(0).split('\n') filename = tmp[0] npage = int(tmp[1]) if len(tmp) < 3: # Only when paste files interleaved d.append((filename, npage)) else: basename = tmp[2] angle = int(tmp[3]) scale = float(tmp[4]) crop = [float(side) for side in tmp[5:9]] hide = [float(side) for side in tmp[9:13]] layerdata = [] i = 13 while i < len(tmp): # If page has overlay/underlay lfilename = tmp[i] lnpage = int(tmp[i + 1]) langle = int(tmp[i + 2]) lscale = float(tmp[i + 3]) laypos = tmp[i + 4] lcrop = [float(side) for side in tmp[i + 5:i + 9]] loffset = [float(offs) for offs in tmp[i + 9:i + 13]] layerdata.append([lfilename, lnpage, langle, lscale, laypos, lcrop, loffset]) i += 13 d.append((filename, npage, basename, angle, scale, crop, hide, layerdata)) return d def set_paste_location(self, pastemode): """Sets reference where pages should be pasted and if before or after that.""" model = self.iconview.get_model() selection = self.iconview.get_selected_items() selection.sort(key=lambda x: x.get_indices()[0]) if len(model) == 0: before = True ref_to = None elif pastemode == 'AFTER': last_row = model[-1] before = False if len(selection) == 0 or selection[-1] == last_row.path: ref_to = None else: ref_to = Gtk.TreeRowReference.new(model, selection[-1]) else: if pastemode == 'EVEN': before = False else: # BEFORE or ODD before = True if len(selection) == 0: ref_to = Gtk.TreeRowReference.new(model, Gtk.TreePath(0)) else: ref_to = Gtk.TreeRowReference.new(model, selection[0]) return ref_to, before def get_nimages_in_page(self, page): """Return number of images in page, including in overlays/underlays.""" nimages = 0 page_list = [page] + [lp for lp in page.layerpages] for p in page_list: poppler_page = self.pdfqueue[p.nfile - 1].get_page(p.npage - 1) imaps = poppler_page.get_image_mapping() nimages += len(imaps) return nimages def get_images_in_page(self, page): """Return list of all images in page, including in overlays/underlays.""" images = [] page_list = [page] + [lp for lp in page.layerpages] for p in page_list: poppler_page = self.pdfqueue[p.nfile - 1].get_page(p.npage - 1) imaps = poppler_page.get_image_mapping() for imap in imaps: image = poppler_page.get_image(imap.image_id) if image is not None: w, h = image.get_width(), image.get_height() # img2pdf.py: dpi = 96, pt = 1/72″, min pt = 3, max pt = 14400 # -> (96 / 72) * 14400 = 19200 # -> (96 / 72) * 3 = 4 if 19200 >= w >= 4 and 19200 >= h >= 4: images.append(image) return images def get_text_in_page(self, page): """Return all text in page, including in overlays/underlays.""" text = "" page_list = [page] + [lp for lp in page.layerpages] for p in page_list: poppler_page = self.pdfqueue[p.nfile - 1].get_page(p.npage - 1) text += poppler_page.get_text() + "\n" return text[:-1] def on_action_extract(self, _action, option, _unknown): """Copy image or text in selected page to clipboard.""" s = self.iconview.get_selected_items() page = self.model[s[-1]][0] if option.get_int32() == 0: # Image nimages = self.get_nimages_in_page(page) if nimages == 0: return if nimages > 1: d = Gtk.MessageDialog( parent=self.window, text=_('The page has several images. Use "Explode into Images" first."'), buttons=Gtk.ButtonsType.OK ) d.run() d.destroy() return im = self.get_images_in_page(page) if len(im) == 0: return pixbuf = Gdk.pixbuf_get_from_surface(im[0], 0, 0, im[0].get_width(), im[0].get_height()) if pixbuf is not None: self.clipboard.set_image(pixbuf) elif option.get_int32() == 1: # Text text = self.get_text_in_page(page) self.clipboard.set_text(text, -1) @staticmethod def process_pending_events(): while Gtk.events_pending(): Gtk.main_iteration() def on_action_explode_into_images(self, _action, _param, _unknown): """Add all images in selected pages as new pages.""" if len(img2pdf_supported_img) == 0: msg = _("Img2pdf missing.") self.error_message_dialog(msg) return self.set_export_state(True, _("Exploding into images…")) self.process_pending_events() s = self.iconview.get_selected_items() imgbufs = [] for row in reversed(s): page = self.model[row][0] images = self.get_images_in_page(page) for im in images: pixbuf = Gdk.pixbuf_get_from_surface(im, 0, 0, im.get_width(), im.get_height()) success, imgbuf = pixbuf.save_to_bufferv('png') if success: imgbufs.append(imgbuf) if len(imgbufs) > 0: pdf_file_name = _img_to_pdf(imgbufs, self.tmp_dir) ref_to, before = self.set_paste_location(pastemode='AFTER') self.paste_files([pdf_file_name], before, ref_to) self.set_export_state(False) def on_action_select(self, _action, option, _unknown): """Selects items according to selected option.""" selectoptions = {0: 'ALL', 1: 'DESELECT', 2: 'ODD', 3: 'EVEN', 4: 'SAME_FILE', 5: 'SAME_FORMAT', 6:'INVERT'} selectoption = selectoptions[option.get_int32()] model = self.iconview.get_model() with GObject.signal_handler_block(self.iconview, self.id_selection_changed_event): if selectoption == 'ALL': self.iconview.select_all() elif selectoption == 'DESELECT': self.iconview.unselect_all() elif selectoption == 'ODD': for page_number, row in enumerate(model, start=1): if page_number % 2: self.iconview.select_path(row.path) else: self.iconview.unselect_path(row.path) elif selectoption == 'EVEN': for page_number, row in enumerate(model, start=1): if page_number % 2: self.iconview.unselect_path(row.path) else: self.iconview.select_path(row.path) elif selectoption == 'SAME_FILE': selection = self.iconview.get_selected_items() copynames = set(model[row][0].copyname for row in selection) for page_number, row in enumerate(model): if model[page_number][0].copyname in copynames: self.iconview.select_path(row.path) elif selectoption == 'SAME_FORMAT': selection = self.iconview.get_selected_items() formats = set(model[row][0].size_in_points() for row in selection) # Chop digits to detect same page format on rotated cropped pages formats = [(round(w, 8), round(h, 8)) for (w, h) in formats] for row in model: page = model[row.path][0] w, h = page.size_in_points() if (round(w, 8), round(h, 8)) in formats: self.iconview.select_path(row.path) elif selectoption == 'INVERT': for row in model: if self.iconview.path_is_selected(row.path): self.iconview.unselect_path(row.path) else: self.iconview.select_path(row.path) self.iv_selection_changed_event() @staticmethod def iv_drag_begin(iconview, context): """Sets custom drag icon.""" selected_count = len(iconview.get_selected_items()) stock_icon = "gtk-dnd-multiple" if selected_count > 1 else "gtk-dnd" iconview.stop_emission('drag_begin') Gtk.drag_set_icon_name(context, stock_icon, 16, 16) def iv_dnd_get_data(self, _iconview, _context, selection_data, _target_id, _etime): """Handles requests for data by drag and drop in iconview""" target = str(selection_data.get_target()) if target == 'MODEL_ROW_INTERN': self.target_is_intern = True selection = self.iconview.get_selected_items() selection.sort(key=lambda x: x.get_indices()[0]) data = [] for path in selection: data.append(str(path[0])) if data: data = '\n;\n'.join(data) elif target == 'MODEL_ROW_EXTERN': self.target_is_intern = False data = self.copy_pages(add_hash=False) else: return selection_data.set(selection_data.get_target(), 8, data.encode()) def iv_dnd_received_data(self, iconview, context, _x, _y, selection_data, _target_id, etime): """Handles received data by drag and drop in iconview""" model = iconview.get_model() data = selection_data.get_data() if not data: return data = data.decode().split('\n;\n') if self.drag_path and len(model) > 0: ref_to = Gtk.TreeRowReference.new(model, self.drag_path) else: ref_to = None if self.iconview.get_direction() == Gtk.TextDirection.LTR: before = self.drag_pos == Gtk.IconViewDropPosition.DROP_LEFT else: before = self.drag_pos == Gtk.IconViewDropPosition.DROP_RIGHT target = selection_data.get_target().name() if target == 'MODEL_ROW_INTERN': move = context.get_selected_action() & Gdk.DragAction.MOVE self.undomanager.commit("Move" if move else "Copy") self.set_unsaved(True) data.sort(key=int, reverse=not before) ref_from_list = [Gtk.TreeRowReference.new(model, Gtk.TreePath(p)) for p in data] iter_to = self.model.get_iter(ref_to.get_path()) with self.render_lock(): for ref_from in ref_from_list: iterator = model.get_iter(ref_from.get_path()) page = model.get_value(iterator, 0).duplicate() if before: it = model.insert_before(iter_to, [page, page.description()]) else: it = model.insert_after(iter_to, [page, page.description()]) path = model.get_path(it) iconview.select_path(path) if move: for ref_from in ref_from_list: model.remove(model.get_iter(ref_from.get_path())) GObject.idle_add(self.render) elif target == 'MODEL_ROW_EXTERN': data = self.deserialize(data) changed = self.paste_pages(data, before, ref_to, select_added=True) if changed and context.get_selected_action() & Gdk.DragAction.MOVE: context.finish(True, True, etime) def iv_dnd_data_delete(self, _widget, _context): """Delete pages from a pdfarranger instance after they have been moved to another instance.""" if self.target_is_intern and os.name == 'nt': # Workaround for windows # On Windows this method is in some situations triggered even for drag & drop # within the same pdfarranger instance return selection = self.iconview.get_selected_items() self.undomanager.commit("Move") self.set_unsaved(True) model = self.iconview.get_model() ref_del_list = [Gtk.TreeRowReference.new(model, path) for path in selection] with self.render_lock(): for ref_del in ref_del_list: path = ref_del.get_path() model.remove(model.get_iter(path)) self.update_iconview_geometry() GObject.idle_add(self.render) malloc_trim() def iv_dnd_motion(self, iconview, context, x, y, etime): """Handles drag motion: autoscroll, select move or copy, select drag cursor location.""" # Block dnd when a modal dialog is open for w in self.window.list_toplevels(): if w.get_modal(): iconview.stop_emission('drag_motion') return Gdk.EVENT_PROPAGATE x, y = iconview.convert_widget_to_bin_window_coords(x, y) # Auto-scroll when drag up/down self.iv_autoscroll(x, y, autoscroll_area=40) # Select move or copy dragAction drag_move_posix = os.name == 'posix' and context.get_actions() & Gdk.DragAction.MOVE drag_move_nt = os.name == 'nt' and not keyboard.is_pressed('control') if drag_move_posix or drag_move_nt: Gdk.drag_status(context, Gdk.DragAction.MOVE, etime) else: Gdk.drag_status(context, Gdk.DragAction.COPY, etime) # By default 5 drag & drop positions are possible: into, left, right, above and below. # We override default behaviour and only allow drag & drop to left or right. # When drag location is a valid drop location True is returned. model = iconview.get_model() if len(model) == 0: return Gdk.EVENT_STOP cell_width, _cell_height = self.cellthmb.get_fixed_size() row_distance = iconview.get_row_spacing() + 2 * iconview.get_item_padding() column_distance = iconview.get_column_spacing() + 2 * iconview.get_item_padding() search_positions = [('XY', x, y), ('Right', x + column_distance / 2, y), ('Left', x - column_distance / 2, y), ('Below', x, y + row_distance / 2), ('Above', x, y - row_distance / 2), ('Left-Above', x - column_distance, y - row_distance), ('Right-Far', x + cell_width, y), ('Left-Far', x - cell_width, y), ('Right-Below-Far', x + cell_width, y + row_distance), ('Left-Below-Far', x - cell_width, y + row_distance), ('Below-Far', x, y + row_distance)] for search_pos, x_s, y_s in search_positions: path = iconview.get_path_at_pos(x_s, y_s) if path: break if search_pos in ['XY', 'Right', 'Left', 'Below', 'Above']: self.drag_path = path if path == iconview.get_path_at_pos(x_s + cell_width * 0.6, y_s): self.drag_pos = Gtk.IconViewDropPosition.DROP_LEFT elif path == iconview.get_path_at_pos(x_s - cell_width * 0.6, y_s): self.drag_pos = Gtk.IconViewDropPosition.DROP_RIGHT elif search_pos == 'Left-Above' and iconview.get_drag_dest_item()[0]: return Gdk.EVENT_STOP elif not path or (path == model[-1].path and x_s < x): self.drag_path = model[-1].path if self.iconview.get_direction() == Gtk.TextDirection.LTR: self.drag_pos = Gtk.IconViewDropPosition.DROP_RIGHT else: self.drag_pos = Gtk.IconViewDropPosition.DROP_LEFT else: iconview.stop_emission('drag_motion') return Gdk.EVENT_PROPAGATE iconview.set_drag_dest_item(self.drag_path, self.drag_pos) return Gdk.EVENT_STOP def iv_autoscroll(self, x, y, autoscroll_area): """Iconview auto-scrolling.""" sw_vadj = self.sw.get_vadjustment() if y < sw_vadj.get_value() + autoscroll_area: if not self.iv_auto_scroll_timer: self.iv_auto_scroll_timer = GObject.timeout_add(150, self.iv_auto_scroll, 'UP') elif y > sw_vadj.get_page_size() + sw_vadj.get_value() - autoscroll_area: if not self.iv_auto_scroll_timer: self.iv_auto_scroll_timer = GObject.timeout_add(150, self.iv_auto_scroll, 'DOWN') elif self.iv_auto_scroll_timer: GObject.source_remove(self.iv_auto_scroll_timer) self.iv_auto_scroll_timer = None def iv_dnd_leave_end(self, _widget, _context, _ignored=None): """Ends the auto-scroll during DND""" if self.iv_auto_scroll_timer: GObject.source_remove(self.iv_auto_scroll_timer) self.iv_auto_scroll_timer = None def iv_auto_scroll(self, direction): """Timeout routine for auto-scroll""" sw_vadj = self.sw.get_vadjustment() step = sw_vadj.get_step_increment() step = -step if direction == "UP" else step with GObject.signal_handler_block(self.iconview, self.id_selection_changed_event): sw_vadj.set_value(sw_vadj.get_value() + step) if not self.click_path: changed = self.iv_drag_select.motion(step=step) if changed: self.iv_selection_changed_event() return True # call me again def iv_motion(self, iconview, event): """Manages mouse movement on the iconview.""" # Pan the view when pressing mouse wheel and moving mouse if event.state & Gdk.ModifierType.BUTTON2_MASK: self.iv_pan_view.motion(event) # Detect drag and drop events if self.pressed_button: if iconview.drag_check_threshold(self.pressed_button.x, self.pressed_button.y, event.x, event.y): iconview.drag_begin_with_coordinates(Gtk.TargetList.new(self.TARGETS_IV), Gdk.DragAction.COPY | Gdk.DragAction.MOVE, self.pressed_button.button, event, -1, -1) self.pressed_button = None # Drag-select when clicking between items and dragging mouse if event.state & Gdk.ModifierType.BUTTON1_MASK and self.iv_drag_select.click_location: self.iv_autoscroll(event.x, event.y, autoscroll_area=4) if not self.click_path: with GObject.signal_handler_block(iconview, self.id_selection_changed_event): changed = self.iv_drag_select.motion(event) if changed: self.iv_selection_changed_event() def iv_button_release_event(self, iconview, event): """Manages mouse releases on the iconview""" if self.end_rubberbanding: self.end_rubberbanding = False return self.iv_drag_select.end() self.iv_pan_view.end() if self.pressed_button: # Button was pressed and released on a previously selected item # without causing a drag and drop. path = iconview.get_path_at_pos(event.x, event.y) if not path: return if event.state & Gdk.ModifierType.CONTROL_MASK: # Deselect the clicked item. iconview.unselect_path(path) else: # Deselect everything except the clicked item. iconview.unselect_all() iconview.select_path(path) self.pressed_button = None # Stop drag-select autoscrolling when button is released if self.iv_auto_scroll_timer: GObject.source_remove(self.iv_auto_scroll_timer) self.iv_auto_scroll_timer = None def iv_button_press_event(self, iconview, event): """Manages mouse clicks on the iconview""" # Switch between zoom_fit and zoom_set on double-click if event.button == 1 and event.type == Gdk.EventType._2BUTTON_PRESS and self.click_path: self.pressed_button = None self.on_action_zoom_fit() return Gdk.EVENT_STOP # Change to 'move' cursor when pressing mouse wheel if event.button == 2: self.iv_pan_view.click(event) click_path_old = self.click_path self.click_path = iconview.get_path_at_pos(event.x, event.y) # On shift-click, select all items from cursor up to the shift-clicked item. # On shift-ctrl-click, toggle selection for single items. # IconView's built-in multiple-selection mode performs rubber-band # (rectangular) selection, which is not what we want. We override # it by handling the shift-click here. if event.button == 1 and self.click_path and event.state & Gdk.ModifierType.SHIFT_MASK: cursor_path = iconview.get_cursor()[1] if event.state & Gdk.ModifierType.CONTROL_MASK: if iconview.path_is_selected(self.click_path): iconview.unselect_path(self.click_path) else: iconview.select_path(self.click_path) elif cursor_path: i_cursor = cursor_path[0] i_click = self.click_path[0] i_click_old = click_path_old[0] if click_path_old else i_click range_start = min(i_cursor, i_click, i_click_old) range_end = max(i_cursor, i_click, i_click_old) with GObject.signal_handler_block(iconview, self.id_selection_changed_event): for i in range(range_start, range_end + 1): path = Gtk.TreePath.new_from_indices([i]) if min(i_cursor, i_click) <= i <= max(i_cursor, i_click): iconview.select_path(path) else: iconview.unselect_path(path) self.iv_selection_changed_event() return Gdk.EVENT_STOP # Forget where cursor was when shift was pressed if event.button == 1 and not event.state & Gdk.ModifierType.SHIFT_MASK: self.iv_cursor.sel_start_page = None # Do not deselect when clicking an already selected item for drag and drop if event.button == 1: selection = iconview.get_selected_items() if self.click_path and self.click_path in selection: self.pressed_button = event if iconview.get_cursor()[1] != self.click_path: self.iconview.set_cursor(self.click_path, None, False) return Gdk.EVENT_STOP # prevent propagation i.e. (de-)selection # Display right click menu if event.button == 3 and not self.iv_auto_scroll_timer: self.iv_drag_select.end() self.iv_pan_view.end() if self.click_path: selection = iconview.get_selected_items() if self.click_path not in selection: iconview.unselect_all() iconview.select_path(self.click_path) else: iconview.unselect_all() iconview.grab_focus() self.popup.popup(None, None, None, None, event.button, event.time) return Gdk.EVENT_STOP # Go into drag-select mode if clicked between items if not self.click_path: if event.button == 1: self.iv_drag_select.click(event) if event.state & Gdk.ModifierType.SHIFT_MASK: return Gdk.EVENT_STOP # Don't deselect all # Let iconview hide cursor. Then stop rubberbanding with the release event self.end_rubberbanding = True release_event = event.copy() release_event.type = Gdk.EventType.BUTTON_RELEASE release_event.put() return Gdk.EVENT_PROPAGATE def iv_key_press_event(self, iconview, event): """Manages keyboard press events on the iconview.""" if event.state & Gdk.ModifierType.BUTTON1_MASK: return Gdk.EVENT_STOP if event.keyval in [Gdk.KEY_Up, Gdk.KEY_Down, Gdk.KEY_Left, Gdk.KEY_Right, Gdk.KEY_Home, Gdk.KEY_End, Gdk.KEY_Page_Up, Gdk.KEY_Page_Down, Gdk.KEY_KP_Page_Up, Gdk.KEY_KP_Page_Down]: # Move cursor, select pages and scroll with navigation keys with GObject.signal_handler_block(iconview, self.id_selection_changed_event): self.iv_cursor.handler(iconview, event) self.iv_selection_changed_event(None, move_cursor_event=True) return Gdk.EVENT_STOP if self.config.is_popup_key_event(event): self.popup.popup(None, None, None, None, 0, event.time) return Gdk.EVENT_STOP return Gdk.EVENT_PROPAGATE def iv_selection_changed_event(self, _iconview=None, move_cursor_event=False): selection = self.iconview.get_selected_items() ne = len(selection) > 0 for a, e in [ ("reverse-order", self.reverse_order_available(selection)), ("delete", ne), ("duplicate", ne), ("page-size", ne), ("crop", ne), ("hide", ne), ("rotate", ne), ("export-selection", ne), ("cut", ne), ("copy", ne), ("extract", len(selection) == 1), ("explode-images", ne), ("split", ne), ("merge", ne), ("select-same-file", ne), ("select-same-format", ne), ("crop-white-borders", ne), ("generate-booklet", ne), ]: self.window.lookup_action(a).set_enabled(e) self.update_statusbar() if selection and not move_cursor_event: self.iv_cursor.cursor_is_visible = False def window_focus_in_out_event(self, _widget=None, _event=None): """Keyboard focus enter or leave window.""" # Enable or disable paste actions based on clipboard content text = self.clipboard.wait_is_text_available() image = len(img2pdf_supported_img) > 0 and self.clipboard.wait_is_image_available() if self.window.lookup_action("paste"): # Prevent error when closing with Alt+F4 if self.sw.is_sensitive(): self.window.lookup_action("paste").set_enabled(text or image) def sw_dnd_received_data(self, _scrolledwindow, _context, _x, _y, selection_data, target_id, _etime): """Handles received data by drag and drop in scrolledwindow""" if target_id == self.TEXT_URI_LIST: pageadder = PageAdder(self) model = self.iconview.get_model() ref_to = Gtk.TreeRowReference.new(model, self.drag_path) if len(model) > 0 else None if self.iconview.get_direction() == Gtk.TextDirection.LTR: before = self.drag_pos == Gtk.IconViewDropPosition.DROP_LEFT else: before = self.drag_pos == Gtk.IconViewDropPosition.DROP_RIGHT pageadder.move(ref_to, before) for uri in selection_data.get_uris(): filename = get_file_path_from_uri(uri) pageadder.addpages(filename) pageadder.commit(select_added=False, add_to_undomanager=True) self.iv_selection_changed_event() def sw_button_press_event(self, _scrolledwindow, event): """Unselects all items in iconview on mouse click in scrolledwindow""" # TODO most likely unreachable code if event.button == 1: self.iconview.unselect_all() def sw_scroll_event(self, _scrolledwindow, event): """Manages mouse scroll events in scrolledwindow""" if event.state & Gdk.ModifierType.SHIFT_MASK: # Scroll horizontally return Gdk.EVENT_PROPAGATE if event.direction == Gdk.ScrollDirection.SMOOTH: dy = event.get_scroll_deltas()[2] elif event.direction == Gdk.ScrollDirection.UP: dy = -1 elif event.direction == Gdk.ScrollDirection.DOWN: dy = 1 else: return Gdk.EVENT_PROPAGATE if event.state & Gdk.ModifierType.CONTROL_MASK: # Zoom self.zoom_set(self.zoom_level - dy) else: # Scroll. Also drag-select if mouse button is pressed sw_vadj = self.sw.get_vadjustment() step = max(20, sw_vadj.get_step_increment()) * dy with GObject.signal_handler_block(self.iconview, self.id_selection_changed_event): sw_vadj.set_value(sw_vadj.get_value() + step) if event.state & Gdk.ModifierType.BUTTON1_MASK: changed = self.iv_drag_select.motion(event, step=step) if changed: self.iv_selection_changed_event() return Gdk.EVENT_STOP def enable_zoom_buttons(self, out_enable, in_enable): if self.window.lookup_action("zoom-out"): self.window.lookup_action("zoom-out").set_enabled(out_enable) self.window.lookup_action("zoom-in").set_enabled(in_enable) def update_max_zoom_level(self): """Update upper zoom level limit so thumbnails are max 6000000 pixels.""" if len(self.model) == 0: return max_pixels = 6000000 # 6000000 pixels * 4 byte/pixel -> 23Mb max_page_size = max(p.width_in_points() * p.height_in_points() for p, _ in self.model) max_zoom_scale = (max_pixels / max_page_size) ** .5 self.zoom_level_limits[1] = min(int(log(max_zoom_scale / .2) / log(1.1)), 80) self.zoom_set(self.zoom_level) def zoom_set(self, level): """Sets the zoom level""" lower, upper = self.zoom_level_limits self.zoom_level = min(max(level, lower), upper) int_zoom_level = round(self.zoom_level) self.enable_zoom_buttons(int_zoom_level != lower, int_zoom_level != upper) zoom_scale = 0.2 * (1.1 ** int_zoom_level) if zoom_scale == self.zoom_scale: return self.zoom_scale = zoom_scale self.vadj_percent_handler(store=True) if self.id_scroll_to_sel: GObject.source_remove(self.id_scroll_to_sel) self.zoom_fit_page = False self.quit_rendering() # For performance reasons for row in self.model: row[0].zoom = self.zoom_scale if len(self.model) > 0: self.update_iconview_geometry() self.model[0][0] = self.model[0][0] # Let iconview refresh itself self.id_scroll_to_sel = GObject.timeout_add(400, self.scroll_to_selection, False) self.silent_render() def zoom_fit(self, path): """Zoom and scroll to path.""" item_padding = self.iconview.get_item_padding() cell_image_renderer, cell_text_renderer = self.iconview.get_cells() image_padding = cell_image_renderer.get_padding() text_rect = self.iconview.get_cell_rect(path, cell_text_renderer)[1] text_rect_height = text_rect.height # cell_text_renderer padding is included here border_and_shadow = 7 # 2*th1+th2 set in iconview.py cell_extraX = 2 * (item_padding + image_padding[0]) + border_and_shadow cell_extraY = 2 * (item_padding + image_padding[1]) + text_rect_height + border_and_shadow sw_width = self.sw.get_allocated_width() sw_height = self.sw.get_allocated_height() page_width = max(p.width_in_points() for p, _ in self.model) page_height = max(p.height_in_points() for p, _ in self.model) margins = 12 # leave 6 pixel at left and 6 pixel at right zoom_scaleX_new = max(1, (sw_width - cell_extraX - margins)) / page_width zoom_scaleY_new = max(1, (sw_height - cell_extraY)) / page_height zoom_scale = min(zoom_scaleY_new, zoom_scaleX_new) lower, upper = self.zoom_level_limits self.zoom_level = min(max(int(log(zoom_scale / .2) / log(1.1)), lower), upper) if self.zoom_level in [lower, upper]: zoom_scale = 0.2 * (1.1 ** self.zoom_level) self.zoom_scale = zoom_scale self.enable_zoom_buttons(self.zoom_level != lower, self.zoom_level != upper) for page, _ in self.model: page.zoom = self.zoom_scale self.model[0][0] = self.model[0][0] self.update_iconview_geometry() self.iconview.scroll_to_path(path, True, 0.5, 0.5) def on_action_zoom_in(self, _action, _param, _unknown): self.zoom_set(self.zoom_level + 5) def on_action_zoom_out(self, _action, _param, _unknown): self.zoom_set(self.zoom_level - 5) def on_action_zoom_fit(self, _action=None, _param=None, _unknown=None): """Switch between zoom_fit and zoom_set.""" if len(self.model) == 0: return if self.zoom_fit_page: self.zoom_set(self.zoom_level_old) else: self.vadj_percent_handler(store=True) selection = self.iconview.get_selected_items() if len(selection) > 0: path = selection[-1] else: path = Gtk.TreePath.new_from_indices([self.get_visible_range2()[0]]) self.iconview.select_path(path) self.iconview.set_cursor(path, None, False) self.zoom_level_old = self.zoom_level self.zoom_fit_page = True self.zoom_fit(path) def on_action_fullscreen(self, _action, _param, _unknown): """Toggle fullscreen mode.""" header_bar = self.uiXML.get_object('header_bar') if header_bar.get_visible(): self.window.fullscreen() header_bar.hide() else: self.window.unfullscreen() header_bar.show() def scroll_to_selection(self, center=True): """Scroll iconview so that selection is in center of window.""" self.id_scroll_to_sel = None selection = self.iconview.get_selected_items() if len(selection) > 0: path = selection[len(selection) // 2] self.iconview.scroll_to_path(path, center, 0.5, 0.5) def rotate_page_action(self, _action, angle, _unknown): """Rotates the selected page in the IconView""" self.undomanager.commit("Rotate") angle = angle.get_int32() selection = self.iconview.get_selected_items() if self.rotate_page(selection, angle): self.set_unsaved(True) self.update_statusbar() def rotate_page(self, selection, angle): model = self.iconview.get_model() rotated = False page_width_old = max(p.width_in_points() for p, _ in self.model) page_height_old = max(p.height_in_points() for p, _ in self.model) for path in selection: treeiter = model.get_iter(path) p = model.get_value(treeiter, 0) if p.rotate(angle): rotated = True model.set_value(treeiter, 0, p) self.update_iconview_geometry() page_width_new = max(p.width_in_points() for p, _ in self.model) page_height_new = max(p.height_in_points() for p, _ in self.model) if page_width_old != page_width_new or page_height_old != page_height_new: self.scroll_to_selection() return rotated def split_pages(self, _action, _parameter, _unknown): """ Split selected pages """ diag = splitter.Dialog(self.window) leftcrops, topcrops = diag.run_get() if leftcrops is None or topcrops is None: return model = self.iconview.get_model() self.set_unsaved(True) self.undomanager.commit("Split") # selection is a list of 1-tuples, not in order selection = self.iconview.get_selected_items() selection.sort(key=lambda x: x.get_indices()[0]) ref_list = [Gtk.TreeRowReference.new(model, path) for path in selection] with self.render_lock(): for ref in ref_list: iterator = model.get_iter(ref.get_path()) page = model.get_value(iterator, 0) page.resample = -1 newpages = page.split(leftcrops, topcrops) for p in newpages: p.resample = -1 model.insert_after(iterator, [p, p.description()]) model.set_value(iterator, 0, page) self.update_iconview_geometry() self.iv_selection_changed_event() self.update_max_zoom_level() GObject.idle_add(self.render) def get_size_info(self, selection): sizes = [self.model[row][0].size_in_points() for row in reversed(selection)] max_width = max(s[0] for s in sizes) min_width = min(s[0] for s in sizes) max_height = max(s[1] for s in sizes) min_height = min(s[1] for s in sizes) equal = max_width == min_width and max_height == min_height return sizes, (max_width, max_height), equal def merge_pages(self, _action, _parameter, _unknown): """Merge selected pages.""" selection = self.iconview.get_selected_items() if not self.is_paste_layer_available(selection): return data = self.copy_pages(add_hash=False) data = self.deserialize(data.split('\n;\n')) sizes, max_size, equal = self.get_size_info(selection) r = pageutils.MergePagesDialog(self.window, max_size, equal).run_get() if r is None: return cols, rows, add_order, size = r self.undomanager.commit("Merge") self.set_unsaved(True) self.clear_selected() self.iconview.unselect_all() ndpage = selection[-1].get_indices()[0] before = ndpage < len(self.model) ref = Gtk.TreeRowReference.new(self.model, selection[-1]) if before else None wdpage, hdpage = size[0] * cols, size[1] * rows ndpages = -(len(data) // -(cols * rows)) adder = PageAdder(self) a = adder, self.pdfqueue, self.tmp_dir, (wdpage, hdpage), ndpages file, _ = exporter.get_blank_doc(*a) if file is None: return adder.move(ref, before) adder.addpages(file) with GObject.signal_handler_block(self.iconview, self.id_selection_changed_event): adder.commit(select_added=True, add_to_undomanager=False) nlpage = 0 while ndpage < len(self.model) and nlpage < len(data): for row, col in add_order: wlpage, hlpage = sizes[nlpage] wdiff, hdiff = wdpage - wlpage, hdpage - hlpage off_x = off_y = 0.5 if wdiff != 0: off_x = (col * wdpage / cols + 0.5 * wdpage / cols - wlpage / 2) / wdiff if hdiff != 0: off_y = (row * hdpage / rows + 0.5 * hdpage / rows - hlpage / 2) / hdiff dest = self.model[ndpage].path self.paste_as_layer([data[nlpage]], dest, 'OVERLAY', (off_x, off_y)) nlpage += 1 if nlpage > len(data) - 1: break ndpage += 1 self.update_iconview_geometry() self.iv_selection_changed_event() self.update_max_zoom_level() def edit_metadata(self, _action, _parameter, _unknown): files = [(pdf.copyname, pdf.password) for pdf in self.pdfqueue] if metadata.edit(self.metadata, files, self.window): self.set_unsaved(True) def page_size_dialog(self, _action, _parameter, _unknown): """Opens a dialog box to define page size.""" selection = self.iconview.get_selected_items() diag = pageutils.ScaleDialog(self.iconview.get_model(), selection, self.window) newscale = diag.run_get() if newscale is None: return self.undomanager.commit("Size") if not pageutils.scale(self.model, selection, newscale): return self.set_unsaved(True) self.update_statusbar() self.update_iconview_geometry() self.update_max_zoom_level() GObject.idle_add(self.render) def crop_dialog(self, _action, _parameter, _unknown): """Opens a dialog box to define margins for page cropping.""" s = self.iconview.get_selected_items() a = self.window, s, self.model, self.pdfqueue, self.is_unsaved, 'CROP', self.update_crop pageutils.CropHideDialog(*a) def update_crop(self, crops, selection, is_unsaved): self.undomanager.commit("Crop") self.crop(selection, crops) self.set_unsaved(is_unsaved) self.update_statusbar() self.update_iconview_geometry() self.update_max_zoom_level() GObject.idle_add(self.render) def hide_dialog(self, _action, _parameter, _unknown): """Opens a dialog box to define margins for page hiding.""" s = self.iconview.get_selected_items() if not self.is_paste_layer_available(s): return a = self.window, s, self.model, self.pdfqueue, self.is_unsaved, 'HIDE', self.update_hide pageutils.CropHideDialog(*a) def update_hide(self, hide, selection, is_unsaved): """Step 1 in update hide. This make hiding work in iconview. Step 2 does the 'real' hiding. This is done with: apply_hide_margins_on_pages() (at export and generate_booklet). apply_hide_margins_on_layerpages() (at paste_as_layer). """ self.undomanager.commit("Hide") for num, row in enumerate(selection): page = self.model[row][0] page.hide = Sides(*hide[num]) page.resample = -1 self.set_unsaved(is_unsaved) self.update_statusbar() self.update_iconview_geometry() self.update_max_zoom_level() GObject.idle_add(self.render) def apply_hide_margins_on_pages(self, pages): """Step 2, does the "real" hiding of margins: * Add a full size blank page under the layer stack * Crop & offset the stack so that nothing is in the hidden margin area """ pageadder = PageAdder(self) for p in pages: if all([p.hide[i] <= p.crop[i] for i in range(4)]): continue self.hide_layer_margins(p, p.layerpages, p.hide) filename, nfile = exporter.get_blank_doc(pageadder, self.pdfqueue, self.tmp_dir, p.size) if filename is None: return d = [[p.copyname, p.npage, p.angle, p.scale, 'OVERLAY', p.hide, p.hide]] lp = pageadder.get_layerpages(d) p.layerpages.insert(0, lp[0]) p.nfile = nfile p.npage = 1 p.copyname = filename p.hide = Sides() p.angle = 0 def apply_hide_margins_on_layerpages(self, layerpages, hide): """Step 2, hide margins on a layer stack. (called from paste_as_layer())""" p = layerpages[0] if all([hide[i] <= p.crop[i] for i in range(4)]): return self.hide_layer_margins(p, layerpages[1:], hide) pageadder = PageAdder(self) filename, _nfile = exporter.get_blank_doc(pageadder, self.pdfqueue, self.tmp_dir, p.size) d = [[filename, 1, 0, p.scale, 'OVERLAY', p.crop, Sides()]] lp = pageadder.get_layerpages(d) p.crop = Sides(*hide) p.offset = Sides(*hide) layerpages.insert(0, lp[0]) @staticmethod def hide_layer_margins(p, layerpages, hide): """Crop and offset layers that are in the hidden margin.""" fully_hidden_layers = [] for num, lp in enumerate(layerpages): scalex = (p.size.width * p.scale) / (lp.size.width * lp.scale) scaley = (p.size.height * p.scale) / (lp.size.height * lp.scale) sm = Sides(scalex, scalex, scaley, scaley) outside = Sides(*(max(0, hide[i] - lp.offset[i]) for i in range(4))) lp.crop += outside * sm lp.offset = Sides(*(max(lp.offset[i], hide[i]) for i in range(4))) if lp.crop.left + lp.crop.right >= 1 or lp.crop.top + lp.crop.bottom >= 1: fully_hidden_layers.append(num) for num in reversed(fully_hidden_layers): layerpages.pop(num) def crop_white_borders(self, _action, _parameter, _unknown): selection = self.iconview.get_selected_items() crop = pageutils.white_borders(self.iconview.get_model(), selection, self.pdfqueue) self.undomanager.commit("Crop white Borders") if self.crop(selection, crop): self.set_unsaved(True) self.update_statusbar() self.update_max_zoom_level() GObject.idle_add(self.render) def crop(self, selection, newcrop): changed = False model = self.iconview.get_model() for id_sel, path in enumerate(selection): pos = model.get_iter(path) page = model.get_value(pos, 0) if page.crop != Sides(*newcrop[id_sel]): page.crop = Sides(*newcrop[id_sel]) page.resample = -1 changed = True model.set_value(pos, 0, page) self.update_iconview_geometry() return changed def duplicate(self, _action, _parameter, _unknown): """Duplicates the selected elements""" self.set_unsaved(True) self.undomanager.commit("Duplicate") model = self.iconview.get_model() # selection is a list of 1-tuples, not in order selection = self.iconview.get_selected_items() selection.sort(key=lambda x: x.get_indices()[0]) ref_list = [Gtk.TreeRowReference.new(model, path) for path in selection] with self.render_lock(): for ref in ref_list: iterator = model.get_iter(ref.get_path()) page = model.get_value(iterator, 0).duplicate() model.insert_after(iterator, [page, page.description()]) self.iv_selection_changed_event() GObject.idle_add(self.render) @staticmethod def reverse_order_available(selection): """Determine whether the selection is suitable for the reverse-order command: the selection must be a multiple and contiguous range of pages. """ if len(selection) < 2: return False # selection is a list of 1-tuples, not in order indices = sorted([i[0] for i in selection]) first = indices[0] last = indices[-1] contiguous = (len(indices) == last - first + 1) return contiguous def reverse_order(self, _action, _parameter, _unknown): """Reverses the selected elements in the IconView""" model = self.iconview.get_model() selection = self.iconview.get_selected_items() # selection is a list of 1-tuples, not in order indices = sorted([i[0] for i in selection]) first = indices[0] last = indices[-1] self.set_unsaved(True) indices.reverse() new_order = list(range(first)) + indices + list(range(last + 1, len(model))) self.undomanager.commit("Reorder") with self.render_lock(): model.reorder(new_order) GObject.idle_add(self.render) def content_loss_warning(self): d = Gtk.Dialog(_("Note"), parent=self.window, flags=Gtk.DialogFlags.MODAL, buttons=("_OK", Gtk.ResponseType.OK), resizable=False ) m1 = _("Note the limitations:") m2 = _("Cropping/hiding does not remove any content from the PDF file, it only hides it.") m3 = _("Outlines and links can be preserved only in certain cases.") link = "https://github.com/pdfarranger/pdfarranger/wiki/User-Manual" section = "#preserving-of-outlines-and-links" markup = (m1 + "\n\n" + m2 + "\n\n" + m3 + " " + _("For more info see") + " " + '' + _("User Manual") + "") label = Gtk.Label(label=markup, use_markup=True, max_width_chars=50, wrap=True, margin=12) cb = Gtk.CheckButton(_("Do not show this dialog again."), can_focus=False, margin=12) d.vbox.pack_start(label, False, False, 6) d.vbox.pack_start(cb, False, False, 6) d.show_all() cb.set_can_focus(True) d.run() self.config.set_content_loss_warning(not cb.get_active()) d.destroy() def about_dialog(self, _action, _parameter, _unknown): about_dialog = Gtk.AboutDialog() about_dialog.set_transient_for(self.window) about_dialog.set_modal(True) about_dialog.set_name(APPNAME) about_dialog.set_program_name(APPNAME) about_dialog.set_version(VERSION) pike = pikepdf.__version__ qpdf = pikepdf.__libqpdf_version__ gtkv = "{}.{}.{}".format( Gtk.get_major_version(), Gtk.get_minor_version(), Gtk.get_micro_version() ) pyv = "{}.{}.{}".format( sys.version_info.major, sys.version_info.minor, sys.version_info.micro ) about_dialog.set_comments( "".join( ( _("%s is a tool for rearranging and modifying PDF files.") % APPNAME, "\n \n", _("It uses libqpdf %s, pikepdf %s, GTK %s and Python %s.") % (qpdf, pike, gtkv, pyv), ) ) ) about_dialog.set_authors(['Konstantinos Poulios']) about_dialog.add_credit_section(_('Maintainers and contributors'), [ 'https://github.com/pdfarranger/pdfarranger/graphs/contributors']) about_dialog.set_website(WEBSITE) about_dialog.set_website_label(WEBSITE) about_dialog.set_logo_icon_name(ICON_ID) about_dialog.set_license(_('GNU General Public License (GPL) Version 3.')) about_dialog.connect('response', lambda w, *args: w.destroy()) about_dialog.connect('delete_event', lambda w, *args: w.destroy()) about_dialog.show_all() def update_statusbar(self): selection = self.iconview.get_selected_items() selected_pages = sorted([p.get_indices()[0] + 1 for p in selection]) # Compact the representation of the selected page range jumps = [[l, r] for l, r in zip(selected_pages, selected_pages[1:]) if l + 1 < r] ranges = list(selected_pages[0:1] + sum(jumps, []) + selected_pages[-1:]) display = [] for lo, hi in zip(ranges[::2], ranges[1::2]): range_str = '{}-{}'.format(lo,hi) if lo < hi else '{}'.format(lo) display.append(range_str) ctxt_id = self.status_bar.get_context_id("selected_pages") num_pages = len(self.model) msg = _("Selected pages: ") + ", ".join(display) + " / " + str(num_pages) if len(selection) == 1: model = self.iconview.get_model() pagesize = model[selection[0]][0].size_in_points() pagesize = [x * 25.4 / 72 for x in pagesize] msg += " | "+_("Page Size:")+ " {:.1f}mm \u00D7 {:.1f}mm".format(*pagesize) self.status_bar.push(ctxt_id, msg) for a in ["save", "save-as", "select", "export-all", "zoom-fit", "print"]: self.window.lookup_action(a).set_enabled(num_pages > 0) def error_message_dialog(self, msg): error_msg_dlg = Gtk.MessageDialog(flags=Gtk.DialogFlags.MODAL, type=Gtk.MessageType.ERROR, parent=self.window, message_format=str(msg), buttons=Gtk.ButtonsType.OK) response = error_msg_dlg.run() if response == Gtk.ResponseType.OK: error_msg_dlg.destroy() def main(): PdfArranger().run(sys.argv) pdfarranger-1.11.0/pdfarranger/splitter.py000066400000000000000000000215551463504064500206170ustar00rootroot00000000000000# Copyright (C) 2020 pdfarranger contributors # # pdfarranger 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. from gi.repository import Gtk import gettext _ = gettext.gettext class Dialog(Gtk.Dialog): """ A dialog box to split pages into a grid of pages""" def __init__(self, window): super().__init__( title=_("Split Pages"), parent=window, flags=Gtk.DialogFlags.MODAL, buttons=( "_Cancel", Gtk.ResponseType.CANCEL, "_OK", Gtk.ResponseType.OK, ), ) buttonbox = self.get_action_area() buttons = buttonbox.get_children() self.set_focus(buttons[1]) self.set_resizable(False) self.split_count = {'vertical' : 2, 'horizontal' : 1} self.even_splits = {'vertical' : True, 'horizontal' : True} self.vmodel = Gtk.ListStore(int, int) self.hmodel = Gtk.ListStore(int, int) self.model = {'vertical' : self.vmodel, 'horizontal' : self.hmodel} self.vspin = Gtk.SpinButton() self.hspin = Gtk.SpinButton() self.spinbuttons = {'vertical' : self.vspin, 'horizontal' : self.hspin} self.vcheck = Gtk.CheckButton() self.hcheck = Gtk.CheckButton() self.checkbuttons = {'vertical' : self.vcheck, 'horizontal' : self.hcheck} hbox = Gtk.HBox() self.vbox.pack_start(hbox, True, True, 0) for direction in ['vertical', 'horizontal']: frame = self._build_frame(direction) hbox.pack_start(frame, True, True, 0) self.show_all() def _build_frame(self, direction): frame_txt = {'vertical' : _("Columns"), 'horizontal' : _("Rows")} label_txt = {'vertical' : _("Vertical Splits"), 'horizontal' : _("Horizontal Splits")} checkbutton_txt = {'vertical' : _("Equal column width"), 'horizontal' : _("Equal row height")} frame = Gtk.Frame(label=frame_txt[direction]) frame.props.margin = 8 frame.props.margin_bottom = 0 grid = Gtk.Grid() frame.add(grid) label = Gtk.Label(label_txt[direction]) label.set_alignment(0.0, 0.5) label.props.margin = 8 label.props.margin_bottom = 6 grid.attach(label, 0, 0, width=1, height=1) adjustment = Gtk.Adjustment(value=self.split_count[direction], lower=1, upper=10, step_incr=1) self.spinbuttons[direction].set_adjustment(adjustment) self.spinbuttons[direction].connect("value-changed", self._update_split, direction) grid.attach(self.spinbuttons[direction], 1, 0, width=1, height=1) self.checkbuttons[direction].set_label(checkbutton_txt[direction]) self.checkbuttons[direction].set_active(True) self.checkbuttons[direction].connect("toggled", self._even_split_toggled, direction) grid.attach(self.checkbuttons[direction], 0, 1, width=2, height=1) treeview = self._build_model(direction) grid.attach(treeview, 0, 2, width=2, height=1) return frame def _build_model(self, direction): label1 = {'vertical' : _("#Col"), 'horizontal' : _("#Row")} label2 = {'vertical' : _("Width in %"), 'horizontal' : _("Height in %")} split_count = self.split_count[direction] for s in range(1, split_count + 1): self.model[direction].append([s, 100 // split_count]) treeview = Gtk.TreeView(model=self.model[direction]) cr = Gtk.CellRendererText() heading = Gtk.TreeViewColumn(label1[direction], cr, text=0) treeview.append_column(heading) cr = Gtk.CellRendererSpin() cr.connect("edited", self._edited, direction) cr.set_property("editable", True) adjustment = Gtk.Adjustment(value=100, lower=0, upper=100, step_increment=1) cr.set_property("adjustment", adjustment) heading = Gtk.TreeViewColumn(label2[direction], cr, text=1) treeview.append_column(heading) return treeview def _edited(self, widget, path, value, direction): # Avoid that a user bypasses the limits of the spin buttons # via keyboard input and pressing enter. value = min(max(0, int(value)), 100) if self.model[direction][path][1] == int(value): return if self.checkbuttons[direction].get_active(): # Populate all entries with the new value # The sum may exceed 100, allowing for overlap. crop_sum = len(self.model[direction]) * value if crop_sum >= 100: for i in range(len(self.model[direction])): self.model[direction][i][1] = value else: # Unevenly sized tiles. Fix the sum to match 100, # adjusting entries from bottom to top. self.model[direction][path][1] = value crop_sum = 0 for i in range(len(self.model[direction])): crop_sum += self.model[direction][i][1] delta = 100 - crop_sum cur_idx = int(path) for i in reversed(range(len(self.model[direction]))): if i != cur_idx: sign = delta/abs(delta) s = sign * min(abs(delta), self.model[direction][i][1]) self.model[direction][i][1] += s delta -= s if delta == 0: break def _update_split(self, _event, direction): self.split_count[direction] = self.spinbuttons[direction].get_value_as_int() if self.even_splits[direction]: self.model[direction].clear() # Partition evenly count = self.split_count[direction] frac = 100 // count partition = [frac] * (count - 1) partition.append(100 - (count - 1) * frac) for i, frac in enumerate(partition, start = 1): self.model[direction].append([i, frac]) else: delta = self.split_count[direction] - len(self.model[direction]) if delta > 0: # Add delta zero rows idx = len(self.model[direction]) + 1 for i in range(delta): self.model[direction].append([idx + i, 0]) if delta < 0: # Delete the last delta entries and ensure that the sum is 100 s = 0 for i in range(abs(delta)): s += self.model[direction][-1][1] del self.model[direction][-1] self.model[direction][-1][1] += s def _even_split_toggled(self, button, direction): self.even_splits[direction] = button.get_active() self._update_split(None, direction) def _crops(self, direction): # Convert the tile sizes into a list of tuples (start, end) such that # tile size = end - start. num_splits = len(self.model[direction]) crops = [(0, 0.01 * self.model[direction][0][1])] * num_splits crop_sum = 0.01 * self.model[direction][0][1] for i in range(1, num_splits): size = 0.01 * self.model[direction][i][1] crop_sum += size crops[i] = (crops[i-1][1], crops[i-1][1] + size) # Remove zero-sized tiles crops = [t for t in crops if t[0] < t[1]] overlap = crop_sum - 1.0 # nonnegative if overlap == 0.0: return crops # We have multiple splits and crop_sum > 1.0 # 35,35,35 => [0,35],[32.5,67.5],[65,100]; overlap = 5 # 60,60 => [0,60],[40,100]; overlap = 20 # In general: # [start=last-overlap/(num_splits-1),end=start+size] overlap_per_tile = overlap / (num_splits - 1) # Overlap is only defined when all tiles have the same size. size = 0.01 * self.model[direction][0][1] crops[0] = (0, size) for i in range(1, num_splits - 1): start = crops[i-1][1] - overlap_per_tile end = start + size crops[i] = (start, end) crops[-1] = (1.0 - size, 1.0) return crops def run_get(self): result = self.run() vcrops = None hcrops = None if result == Gtk.ResponseType.OK: vcrops = self._crops('vertical') hcrops = self._crops('horizontal') self.destroy() return vcrops, hcrops pdfarranger-1.11.0/pdfarranger/undo.py000066400000000000000000000070471463504064500177160ustar00rootroot00000000000000# Copyright (C) 2018-2019 Jerome Robert # # pdfarranger 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. """ undo/redo implemented with the memento design pattern. The memento pattern is simpler than the command pattern. Here the memory cost of memento is affordable because we only store snapshots of the GtkListStore object, not of the whole PDF files. """ class Manager(object): """ Stack of GtkListStore models (Memento design pattern) """ def __init__(self, app): self.app = app self.model = app.model self.states = [] #: label of the previous undoable action self.label = None #: id of the current state self.current = 0 self.undoaction = None self.redoaction = None def clear(self): self.states = [] self.label = None self.current = 0 def commit(self, label): """ Must be called *BEFORE* each undoable actions :param label: label of the action """ self.states = self.states[:self.current] self.states.append(([row[0].duplicate(False) for row in self.model], self.label,)) self.current += 1 self.label = label self.__refresh() def undo(self, _action, _param, _unused): if self.current == len(self.states): self.states.append(([row[0].duplicate(False) for row in self.model], self.label,)) state, self.label = self.states[self.current - 1] self.__set_state(state) self.current -= 1 self.app.set_unsaved(True) self.__refresh() def redo(self, _action, _param, _unused): state, self.label = self.states[self.current + 1] self.__set_state(state) self.current += 1 self.app.set_unsaved(True) self.__refresh() def set_actions(self, undo, redo): self.undoaction = undo self.redoaction = redo self.__refresh() def __set_state(self, state): self.app.quit_rendering() self.app.iconview.unselect_all() with self.app.render_lock(): self.model.clear() for page in state: # Do not reset the zoom level page.zoom = self.app.zoom_scale page.resample = -1 self.model.append([page, page.description()]) self.app.update_iconview_geometry() self.app.update_max_zoom_level() self.app.retitle() self.app.update_statusbar() self.app.silent_render() def __refresh(self): if self.undoaction: self.undoaction.set_enabled(self.current >= 1) if self.redoaction: self.redoaction.set_enabled(self.current + 1 < len(self.states)) # TODO: This is where to update the undo/redo menu items label to # show which action is going to be undone/redone. Because GtkImageMenuItem # will leads to many changes in translations this is currently postponed. pdfarranger-1.11.0/po/000077500000000000000000000000001463504064500145125ustar00rootroot00000000000000pdfarranger-1.11.0/po/POTFILES.in000066400000000000000000000001551463504064500162700ustar00rootroot00000000000000pdfarranger/pdfarranger.py pdfarranger/metadata.py pdfarranger/pageutils.py data/pdfarranger.ui data/menu.ui pdfarranger-1.11.0/po/ca.po000066400000000000000000000434001463504064500154360ustar00rootroot00000000000000# PDF Arranger - Catalan translation. # Copyright (C) 2021 # This file is distributed under the same license as the pdfarranger package. # Ícar Nin Solana , 2021. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2022-10-03 23:44+0200\n" "Last-Translator: Ícar N. S. \n" "Language-Team: \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.1.1\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Col" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Fila" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "% de l'alçada" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "% de l'amplada" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "El %s és una eina per arranjar i modificar fitxers PDF." #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "Tots del mateix fitxer" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "Tots els fitxers" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "Totes les pàgines han de tenir la mateixa mida." #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "Tots els fitxers admesos" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "Inferior" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "Imatge del porta-retalls" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Columnes" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "Creat" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "Creador" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "Eina creadora" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "Retalla els marges" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "Escapça les vores blanques" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "Retalla" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "Tot i els avisos, el document no hauria de tenir problemes visibles." #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "Vol descartar els canvis i tancar?" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "Vol descartar els canvis i sortir?" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "No tornis a mostrar aquest diàleg." #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "No desar" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "No mostris més avisos al desar." #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "Duplica" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "Exporta" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "Exporta la selecció a un sol fitxer…" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "Edita les propietats" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "Edita les propietats" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Amplada igual de la columna" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Alçada igual de la fila" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "Exporta la selecció a fitxers individuals…" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "Exporta totes les pàgines a fitxers individuals…" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "Exporta…" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "El fitxer no és ni pdf ni imatge" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "Fitxer(s) a obrir" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "" #: data/menu.ui:259 msgid "Full_screen" msgstr "_Pantalla completa" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "Llicència Pública General GNU (GPL) Versió 3." #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "Genera un fullet" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "Alçada" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Alçada en %" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Divisions horitzontals" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "Els fitxers d'imatge només són compatibles amb img2pdf" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "El format de la imatge no està admès per img2pdf" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Importa" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "Importa…" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "Insereix una pàgina en blanc…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "Insereix una pàgina en blanc" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "Format de data no vàlid. S'ha descartat l'entrada." #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Usa libqpdf %s, pikepdf %s, GTK %s i Python %s." #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "Paraules clau" #: pdfarranger/config.py:252 msgid "Language" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "Esquerra" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Menú principal" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "Mantenidors i contribuïdors" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "Modificat" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "" #: pdfarranger/exporter.py:559 msgid "None" msgstr "" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Obre" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "Obre…" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "" #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "L'Arranjador de PDFs és una petita aplicació feta amb Python i GTK que ajuda " "l'usuari a fusionar o dividir documents PDF i girar, escapçar i reordenar " "les pàgines d'aquests mitjançant una interfície gràfica intuïtiva. És el " "frontal pel programari Pikepdf." #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "El document PDF està malmès" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "Fitxers PDF" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "Mida de la pàgina:" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "" #: pdfarranger/core.py:457 msgid "Password" msgstr "Contrasenya" #: pdfarranger/core.py:435 msgid "Password required" msgstr "Contrasenya requerida" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "Enganxament especial" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "Enganxa com a pàgines parelles" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "Enganxa com a pàgines senars" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "Enganxa després" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "Enganxa abans" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "Les dades enganxades no són vàlides. S'està avortant l'operació." #: data/menu.ui:272 msgid "Pre_ferences" msgstr "" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "Imprimeix la versió de l'Arranjador de PDFs i surt" #: pdfarranger/config.py:267 msgid "Printing" msgstr "" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "Imprimint…" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "Productor" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "Propietat" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "Ordre invers" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "Relatiu" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "Renderitzant la previsualització…" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "Renderitzant…" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "Dreta" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Gira a l'esquerra" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Gira a la dreta" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "Gira a l'esquerra" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Files" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "El mateix format de pàgina" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Desa" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Desa com a" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "Anomena i desa…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Anomena i desa…" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "Voleu desar els canvis abans de tancar?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "Voleu desar els canvis abans de tancar?" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "Voleu desar els canvis a “{}” abans de tancar?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "Voleu desar els canvis a “{}” abans de tancar?" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "L'acció de desar ha produït algun avís" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "Desant…" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "Factor d'escala" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "Selecciona-ho tot" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "Selecciona les pàgines parelles" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "Selecciona les pàgines senars" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "Pàgines seleccionades: " #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Divideix les pàgines" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "Assumpte" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "Fitxers d'imatge compatibles" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "" "El document “{}” està bloquejat i requereix una contrasenya abans que es " "pugui obrir." #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "" #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "La contrasenya es recordarà fins que tanqueu el PDF Arranger." #: pdfarranger/config.py:260 msgid "Theme" msgstr "" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "Títol" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "Superior" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "Format de fitxer desconegut" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "Valor" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Divisions verticals" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "Amplada" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Amplada en %" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "Els teus canvis es perdran si no els guardes." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Amplia" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Allunya" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "_Ajusta" #: data/menu.ui:247 msgid "Zoom _In" msgstr "A_mplia" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "A_llunya" #: data/menu.ui:278 msgid "_About" msgstr "Quant a" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "Cancel·la" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "_Tanca" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "Copia" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "Suprimeix" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "Desselecciona-ho tot" #: data/menu.ui:87 msgid "_Edit" msgstr "Edita" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "" #: data/menu.ui:30 msgid "_Import" msgstr "Importa" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "Inverteix la selecció" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "" #: data/menu.ui:36 msgid "_New Window" msgstr "Finestra nova" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "_Obre" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "" #: data/menu.ui:71 msgid "_Print…" msgstr "_Imprimeix…" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "Surt" #: data/menu.ui:82 msgid "_Redo" msgstr "Refés" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "Gira a la dreta" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "Desa" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "Selecciona" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "Divideix les pàgines…" #: data/menu.ui:78 msgid "_Undo" msgstr "Desfés" #: data/menu.ui:244 msgid "_View" msgstr "_Visualitza" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "mm" #: pdfarranger/core.py:326 msgid "page" msgstr "pàgina" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "sense títol" pdfarranger-1.11.0/po/ca@valencia.po000066400000000000000000000430761463504064500172520ustar00rootroot00000000000000# PDF Arranger - Catalan@Valencian translation. # Copyright (C) Pilar Embid Giner , 2014. # This file is distributed under the same license as the pdfarranger package. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2022-08-13 11:15+0200\n" "Last-Translator: Juanma1980 \n" "Language-Team: LliureX\n" "Language: ca@valencia\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.0\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Col" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Fila" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "% de l'alçada" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "% de l'amplada" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s es una ferramenta per a modificar i re-arranjar fitxers PDF" #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "Tots del mateix fitxer" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "Tots els fitxers" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "Totes les pàgines han de tindre la mateixa mida." #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "Tots els fitxers admesos" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "Inferior" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "Imatge del porta-retalls" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Columnes" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "Creat" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "Creador" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "Eina creadora" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "Retalla els margens" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "Escapça les vores blanques" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "Re_talla" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "A banda dels avisos el(s) document(s) no semblen tindre cap problema." #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "Descartar els canvis i tancar?" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "Descartar canvis i eixir?" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "No tornes a mostrar aquest diàleg." #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "No alçar" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "" #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "_Duplica" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "E_xporta" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "E_xporta la selecció a un sol fitxer…" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "Edita les propietats" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "Edita les propietats" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Amplada igual de la columna" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Alçada igual de la fila" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "Exporta la selecció a fitxers _individuals…" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "Exporta _totes les pàgines a fitxers individuals…" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "Exporta…" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "El fitxer no és ni pdf ni imatge" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "Fitxer(s) a obrir" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "" #: data/menu.ui:259 msgid "Full_screen" msgstr "Pantalla sencera" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "Llicència Pública General GNU (GPL) Versió 3." #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "Genera un fullet" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "Alçada" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Alçada en %" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Divisions horitzontals" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "Els fitxers d'imatge només són compatibles amb img2pdf" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "El format de la imatge no està admès per img2pdf" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "" #: data/pdfarranger.ui:58 msgid "Import" msgstr "" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "Importa…" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "Insereix una pàgina en blanc…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "Insereix una pàgina en blanc" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "Format de data no vàlid. S'ha descartat l'entrada." #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Utilitza libqpdf %s, pikepdf %s, GTK %s and Python %s." #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "Paraules clau" #: pdfarranger/config.py:252 msgid "Language" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "Esquerra" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Menú principal" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "Mantenidors i contribuïdors" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "Modificat" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "" #: pdfarranger/exporter.py:559 msgid "None" msgstr "" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Obrir" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "Obrir" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "" #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PFD Arranger (Arranjador de PDFs) és una aplicació sentzilla feta amb Python " "i GTK que ajuda al usuari a fusionar o dividir documents PDF i girar, " "escapçar o reordenar les pàgines d'aquests mitjançant una interfície gràfica " "intuïtiva. És el frontal pel programari Pikepdf." #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "El document PDF es troba danyat" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "Fitxers PDF" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "Mida de la pàgina:" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "" #: pdfarranger/core.py:457 msgid "Password" msgstr "Contrasenya" #: pdfarranger/core.py:435 msgid "Password required" msgstr "Contrasenya requerida" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "Enganxament especial" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "Enganxa com a pàgines pars" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "Enganxa com a pàgines impars" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "Enganxa _després" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "Enganxa _abans" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "Les dades enganxades no són vàlides. S'està avortant l'operació." #: data/menu.ui:272 msgid "Pre_ferences" msgstr "" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "Imprimeix la versió de l'Arranjador de PDFs i ix" #: pdfarranger/config.py:267 msgid "Printing" msgstr "" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "Productor" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "Propietat" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "_Ordre invers" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "Relatiu" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "Renderitzant…" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "Dreta" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Gira a l'esquerra" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Gira a la dreta" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "Gira a _l'esquerra" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Files" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "El mateix format de pàgina" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Alça" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Alça com a" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "" #: data/menu.ui:47 msgid "Save _As…" msgstr "_Anomena i alça…" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "Voleu alçar els canvis abans de tancar?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "Voleu alçar els canvis a “{}” abans de tancar?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "S'han produït avisos al alçar" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "Alçant..." #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "Factor d'escala" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "Selecciona-ho tot" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "Selecciona les pàgines pars" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "Selecciona les pàgines impars" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "Pàgines seleccionades: " #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Divideix les pàgines" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "Assumpte" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "Fitxers d'imatge compatibles" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "" "El document “{}” es troba blocat i cal una contrasenya abans que es puga " "obrir." #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "" #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "La contrasenya es recordarà fins que es tanque el PDF Arranger." #: pdfarranger/config.py:260 msgid "Theme" msgstr "" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "Títol" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "Superior" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "Format de fitxer desconegut" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "Valor" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Divisions verticals" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "Amplada" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Amplada en %" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "Els teus canvis es perdran si no els alces." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Amplia" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Allunya" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "" #: data/menu.ui:247 msgid "Zoom _In" msgstr "Ampl_ia" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "Allunya" #: data/menu.ui:278 msgid "_About" msgstr "Quant a" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "Cancel·la" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "Tancar" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "_Copia" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "_Suprimeix" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "Desselecciona-ho tot" #: data/menu.ui:87 msgid "_Edit" msgstr "_Edita" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "" #: data/menu.ui:30 msgid "_Import" msgstr "_Importa" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "Inverteix la selecció" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "" #: data/menu.ui:36 msgid "_New Window" msgstr "_Finestra nova" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "_Obrir" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "" #: data/menu.ui:71 msgid "_Print…" msgstr "" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "_Ix" #: data/menu.ui:82 msgid "_Redo" msgstr "_Refés" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "Gira a la d_reta" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "Alça" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "Selecciona" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "_Divideix les pàgines…" #: data/menu.ui:78 msgid "_Undo" msgstr "Desfés" #: data/menu.ui:244 msgid "_View" msgstr "_Vista" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "mm" #: pdfarranger/core.py:326 msgid "page" msgstr "pàgina" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "sense títol" pdfarranger-1.11.0/po/cs.po000066400000000000000000000442751463504064500154730ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: pdfarranger\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2023-07-10 15:37+0000\n" "Last-Translator: PavelZ\n" "Language-Team: Czech (Czech Republic)\n" "Language: cs-CZ\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=( n == 1 ) ? 0 : ( n >= 2 && n <= 4 ) ? 1 : " "2;\n" "\n" "X-Loco-Source-Locale: cs_CZ\n" "X-Loco-Parser: loco_parse_po\n" "X-Generator: Loco https://localise.biz/\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Sloupec" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Řádek" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s je nástroj na přeskupování a úpravy PDF dokumentů." #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "(chybějící Libhandy)" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "(vyžadován restart)" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "Soubor s názvem \"%s\" již existuje. Chcete ho nahradit?" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "Vše ze _stejného souboru" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "Všechny soubory" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "Všechny stránky musí mít stejný rozměr" #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "Všechny podporované soubory" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "Dolní" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "Zespodu nahoru" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "Obrázek ve schránce" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Sloupce" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "Vytvořeno" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "Autor" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "Vytvořeno nástrojem" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "Oříznout okraje" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "Oříznout bílé okra_je" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "_Vyjmout" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "Navzdory varováním by dokument neměl mít viditelné problémy." #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "Zahodit změny a zavřít?" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "Zahodit změny a ukončit?" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "Tento dialog znovu nezobrazovat." #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "_Neukládat" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "Varování při ukládání znovu nezobrazovat." #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "_Duplikovat" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "E_xportovat" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "E_xportovat výběr do jediného souboru…" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "Upravit _vlastnosti" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "Upravit vlastnosti" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Stejná šířka sloupců" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Stejná výška řádků" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "Exportovat výběr do _samostatných souborů…" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "Exportovat _všechny stránky do samostatných souborů…" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "Export…" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "Soubor není ani PDF dokument ani obrázek" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "Soubor(y) k otevření" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "Pro další možnosti viz" #: data/menu.ui:259 msgid "Full_screen" msgstr "_Celá obrazovka" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL) verze 3." #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "Vytvořit brožuru" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "Výška" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Výška v %" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "Vodorovně" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Vodorovné rozdělení" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "Vodorovný posun" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "Soubory s obrázky jsou podporovány pouze s programem img2pdf" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "Formát obrázku není podporován programem img2pdf" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Importovat" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "Import…" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "Vložit prázdn_ou stránku…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "Vložit prázdnou stránku" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "Neplatný formát data. Vstup byl zahozen." #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Používá libqpdf %s, pikepdf %s, GTK %s and Python %s." #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "Klíčová slova" #: pdfarranger/config.py:252 msgid "Language" msgstr "Jazyk" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "Levý" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "Zleva do prava" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Hlavní nabídka" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "Správci a přispěvatelé" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "Okraj" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "Sloučit stránky" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "Velikost sloučené stránky:" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "Změněno" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "Nejednotná velikost stránky – pomocí maximální velikosti" #: pdfarranger/exporter.py:559 msgid "None" msgstr "" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Otevřít" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "Otevřít…" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "" #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "Překrytí" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger je malá pyhon-gtk aplikace, která pomáhá uživatelům slučovat " "nebo rozdělovat PDF dokumenty a otáčet, ořezávat nebo přeskupovat jejich " "stránky za použití interaktivního a intuitivního uživatelského rozhraní. " "Jedná se o frontend pro knihovnu pikepdf." #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "PDF dokument je poškozený" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "Soubory PDF" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "Pořadí stránek" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "Velikost stránky:" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "" #: pdfarranger/core.py:457 msgid "Password" msgstr "Heslo" #: pdfarranger/core.py:435 msgid "Password required" msgstr "Je vyžadováno heslo" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "Vložit _jinak" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "Vložit jako překr_ytí…" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "Vložit jako s_udé stránky" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "Vložit jako l_iché stránky" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "Vložit jako podkr_eslení…" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "Vložit z_a" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "Vložit př_ed" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "Vkládaná data jsou neplatná. Vkládání bylo přerušeno." #: data/menu.ui:272 msgid "Pre_ferences" msgstr "Předvolb_y" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "Předvolby" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "Vypsat verzi programu PDF Arranger a skončit" #: pdfarranger/config.py:267 msgid "Printing" msgstr "" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "Tisk…" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "Producent" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "Vlastnost" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "O_brácené pořadí" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "Relativní" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "Vykreslování náhledu…" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "Vykreslování…" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "Nahradit" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "Pravý" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "Zprava doleva" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Otočit doleva" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Otočit doprava" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "Otočit do_leva" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Řádky" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "Stejný _formát stránky" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Uložit" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Uložit jako" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "Uložit jako…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Uložit _jako" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "Uložit změny před zavřením?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "Uložit změny před ukončením?" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "Uložit změny do “{}” před zavřením?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "Uložit změny do “{}” před ukončením?" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "Ukládání vyvolalo nějaká varování" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "Ukládání…" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "Měřítko" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "Vybrat v_še" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "Vybrat sud_é stránky" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "Vybrat lic_hé stránky" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "Vybrané stránky: " #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Rozdělit stránky" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "Předmět" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "Podporované soubory s obrázky" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "Systémová nastavení" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "Dokument “{}” je uzamčen a je vyžadováno heslo pro jeho otevření." #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "" #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "Heslo bude zapamatováno, dokud neukončíte program PDF Arranger." #: pdfarranger/config.py:260 msgid "Theme" msgstr "Téma" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "Název" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "Horní" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "Shora dolů" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "Podkreslení" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "Neznámý formát souboru" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "Hodnota" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "Svisle" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Svislé rozdělení" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "Svislý posun" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "Šířka" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Šířka v %" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "Provedené změny budou ztraceny, pokud je neuložíte." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Přiblížit" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Oddálit" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "Přizpůsobit _velikost" #: data/menu.ui:247 msgid "Zoom _In" msgstr "Při_blížit" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "O_ddálit" #: data/menu.ui:278 msgid "_About" msgstr "_O programu" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "_Zrušit" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "Za_vřít" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "_Kopírovat" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "_Smazat" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "Zr_ušit výběr" #: data/menu.ui:87 msgid "_Edit" msgstr "Up_ravit" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "" #: data/menu.ui:30 msgid "_Import" msgstr "_Importovat" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "P_řevrátit výběr" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "S_loučit stránky…" #: data/menu.ui:36 msgid "_New Window" msgstr "_Nové okno" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "_OK" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "_Otevřít" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "" #: data/menu.ui:71 msgid "_Print…" msgstr "Vy_tisknout…" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "U_končit" #: data/menu.ui:82 msgid "_Redo" msgstr "Z_novu" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "Otočit do_prava" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "_Uložit" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "Vybra_t" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "_Rozdělit stránky…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Zpět" #: data/menu.ui:244 msgid "_View" msgstr "_Zobrazit" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "mm" #: pdfarranger/core.py:326 msgid "page" msgstr "stránka" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "nepojmenovaný" pdfarranger-1.11.0/po/da.po000066400000000000000000000441771463504064500154530ustar00rootroot00000000000000# Danish translation for pdfarranger. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the pdfarranger package. # Translators: # Lrss, 2022 msgid "" msgstr "" "Project-Id-Version: pdfarranger\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2023-10-22 00:28+0200\n" "Last-Translator: Lrss \n" "Language-Team: Danish\n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.4\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Kolonne" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Række" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "% af højde" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "% af bredde" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s er et værktøj til at omarrangere og modificere PDF filer." #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "(Libhandy mangler)" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "(Kræver genstart)" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "En fil med navnet \"%s\" eksisterer allerede. Vil du erstatte den?" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "Alle fra _Samme Fil" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "Alle filer" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "Alle sider skal have samme størrelse." #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "Alle understøttede filer" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "Bund" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "Bund til Top" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "Udklipsholder billede" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Kolonner" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "Oprettet" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "Forfatter" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "Program" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "Beskær margener" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "_Beskær Hvide Margener" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" "Indhold fjernes ikke fra PDF'en ved beskæring/skjulning, det bliver kun " "skjult." #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "_Klip" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "På trods af advarslerne burde dokumentet/dokumenterne ikke have nogen " "synlige problemer." #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "Kassér ændringerne og luk vinduet?" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "Kassér ændringer og afslut programmet?" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "Vis ikke denne besked igen." #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "Gem _ikke" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "Undlad at vise advarsler når der gemmes." #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "Dupl_iker" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "Eks_porter" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "E_ksportér Markering til en Enkel Fil…" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "Rediger _Egenskaber" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "Dokumentegenskaber" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Ens Kolonnebredde" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Ens Rækkehøjde" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "Eksportér Markering til _Individuelle Filer…" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "Eksportér _Alle sider til Individuelle Filer…" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "Eksport…" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "Filen er hverken PDF eller billede" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "Fil(er) at åbne" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "For flere muligheder se:" #: data/menu.ui:259 msgid "Full_screen" msgstr "Fuld_skærm" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL) Version 3." #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "Generer Hæfte" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "Højde" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Højde i %" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "Skjul Marginer" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "Horisontal" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Horisontale opdelinger" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "Horisontal forskydning" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "Billedfiler virker kun med Img2pdf" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "Billedformatet understøttes ikke af img2pdf" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Importér" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "Importér…" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "Indsæt _Tom Side…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "Indsæt Tom Side" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "Ugyldigt datoformat." #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Programmet anvender %s, pikepdf %s, GTK %s og Python %s." #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "Nøgleord" #: pdfarranger/config.py:252 msgid "Language" msgstr "Sprog" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "Venstre" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "Venstre til Højre" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Hovedmenu" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "Administratorer og bidragydere" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "Margin" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "Flet Sider" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "Flettet side størrelse:" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "Ændret" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "Ikke-ensartet sidestørrelse - benytter maks. størrelse" #: pdfarranger/exporter.py:559 msgid "None" msgstr "" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Åben" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "Åben…" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "" #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "Overlejring" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger er et lille python-gtk program, som hjælper brugeren med at " "flette eller opdele pdf-dokumenter og rotere, beskære og omarrangere deres " "sider ved hjælp af en interaktiv og intuitiv grafisk grænseflade. Det er en " "frontend til pikepdf." #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "PDF dokumentet er beskadiget" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "PDF filer" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "Siderækkefølge" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "Sidestørrelse:" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "Sidestørrelse" #: pdfarranger/core.py:457 msgid "Password" msgstr "Adgangskode" #: pdfarranger/core.py:435 msgid "Password required" msgstr "Adgangskode påkrævet" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "Indsæt _Special" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "Indsæt Som O_verlejring…" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "Indsæt som _Lige Sider" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "Indsæt som _Ulige Sider" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "Indsæt Som _Underlag…" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "Indsæt _efter" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "Indsæt _før" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "Indsatte data er ugyldige. Indsættelse afbrydes." #: data/menu.ui:272 msgid "Pre_ferences" msgstr "Præ_ferencer" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "Præferencer" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "Print versionen af PDF Arranger og afslut" #: pdfarranger/config.py:267 msgid "Printing" msgstr "" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "Udskriver…" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "Producent" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "Egenskab" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "Omvend rækkefølgen" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "Relativ" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "Konstruerer forhåndsvisning…" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "Renderer…" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "Erstat" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "Højre" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "Højre til Venstre" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Rotér til Venstre" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Rotér til Højre" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "Rotér til _Venstre" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Rækker" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "Alle med samme Side_format" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Gem" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Gem som" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "Gem som…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Gem s_om…" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "Gem ændringer inden lukning?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "Gem ændringer inden lukning?" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "Gem ændringer i “{}” inden lukning?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "Gem ændringer i “{}” inden lukning?" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "Gemprocessen gav nogle advarsler" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "Gemmer…" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "Skaleringsfaktor" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "Vælg _Alle" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "Vælg _Lige Sider" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "Vælg _Ulige Sider" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "Valgte sider: " #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "Vis værdier" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Del sider" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "Emne" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "Understøttede billedfiler" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "Systemindstilling" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "Dokumentet “{}” er låst og kræver adgangskode for at kunne åbnes." #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "" #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "Adgangskode huskes indtil du lukker PDF Arranger." #: pdfarranger/config.py:260 msgid "Theme" msgstr "Tema" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "Titel" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "Top" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "Top til Bund" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "Underlag" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "Ukendt filformat" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "Indhold" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "Vertikal" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Lodrette opdelinger" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "Vertikal forskydning" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "Bredde" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Bredde i %" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "Dine ændringer vil gå tabt, hvis du ikke gemmer dem." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Zoom Ind" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Zoom ud" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "_Tilpas Zoom" #: data/menu.ui:247 msgid "Zoom _In" msgstr "Zoom _Ind" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "Zoom _Ud" #: data/menu.ui:278 msgid "_About" msgstr "_Om PDF Arranger" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "_Anvend" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "_Annullér" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "_Luk Vindue" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "K_opiér" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "Bes_kær Marginer…" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "_Slet" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "Fra_vælg Alle" #: data/menu.ui:87 msgid "_Edit" msgstr "_Redigér" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "Skjul Marginer…" #: data/menu.ui:30 msgid "_Import" msgstr "_Importér" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "_Invertér Markeringen" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "Sa_mmenflet Sider…" #: data/menu.ui:36 msgid "_New Window" msgstr "_Nyt Vindue" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "_OK" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "_Åben" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "_Sidestørrelse_" #: data/menu.ui:71 msgid "_Print…" msgstr "_Udskriv…" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "Afslut Program" #: data/menu.ui:82 msgid "_Redo" msgstr "_Gentag" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "Fort_ryd" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "Rotér til _Højre" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "_Gem" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "_Makering" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "Op_del Siderne…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Fortryd" #: data/menu.ui:244 msgid "_View" msgstr "_Visning" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "mm" #: pdfarranger/core.py:326 msgid "page" msgstr "side" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "unavngivet" pdfarranger-1.11.0/po/de.po000066400000000000000000000451311463504064500154460ustar00rootroot00000000000000# German translation for pdfarranger. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the pdfarranger package. # Translators: # Konstantinos Poulios, 2008-2017 # David Auer, 2023 # Milo Ivir , 2020, 2021 # Dr. Tobias Quathamer , 2021 # David Kyburz, 2022, 2023. msgid "" msgstr "" "Project-Id-Version: pdfarranger\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2023-04-04 01:43+0200\n" "Last-Translator: David Auer\n" "Language-Team: \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.3\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "Spalte" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "Zeile" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "% der Höhe" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "% der Breite" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s ist ein Werkzeug zum Neuordnen und Ändern von PDF-Dateien." #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "(Libhandy fehlt)" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "(Erfordert Neustart)" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "" "Eine Datei mit dem Namen »%s« existiert bereits. Möchten Sie diese ersetzen?" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "Alle der _gleichen Datei" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "Alle Dateien" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "Alle Seiten müssen die gleiche Größe haben." #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "Alle unterstützten Dateien" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "Unten" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "Unten nach Oben" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "Zwischenablage-Bild" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Spalten" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "Erstellt" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "Ersteller" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "Erstellungswerkzeug" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "Seitenränder abschneiden" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "Weiße Ränder abschneiden" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "_Ausschneiden" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "Trotz der Warnungen sollte(n) das/die Dokument(e) keine sichtbaren Probleme " "aufweisen." #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "Änderungen verwerfen und schließen?" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "Änderungen verwerfen und beenden?" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "Diesen Dialog nicht mehr anzeigen." #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "_Nicht speichern" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "Beim erneuten Speichern keine Warnungen anzeigen." #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "_Duplizieren" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "E_xportieren" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "Auswahl in eine Datei e_xportieren …" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "Eige_nschaften ändern" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "Eigenschaften ändern" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Gleiche Spaltenbreite" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Gleiche Zeilenhöhe" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "Auswahl in E_inzeldateien exportieren …" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "_Alle Seiten in Einzeldateien exportieren …" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "Exportieren …" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "Datei ist weder ein PDF noch ein Bild" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "Zu öffnende Datei(en)" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "Weitere Optionen in der Konfigurationsdatei:" #: data/menu.ui:259 msgid "Full_screen" msgstr "Voll_bild" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL) Version 3." #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "Broschüre erstellen" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "Höhe" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Höhe in %" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "Horizontal" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Waagerechte Teilungen" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "Horizontale Verschiebung" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "Bilddateien werden nur mit img2pdf unterstützt" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "Bildformat wird von img2pdf nicht unterstützt" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Importieren" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "Importieren …" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "_Leere Seite einfügen…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "Leere Seite einfügen" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "Ungültiges Datumsformat. Eingabe verworfen." #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Es verwendet libqpdf %s, pikepdf %s, GTK %s and Python %s." #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "Schlagworte" #: pdfarranger/config.py:252 msgid "Language" msgstr "Sprache" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "Links" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "Links nach Rechts" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Hauptmenü" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "Hauptentwickler und Mitwirkende" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "Seitenrand" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "Seiten zusammenfügen" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "Größe der zusammengefügten Seiten:" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "Geändert" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "Uneinheitliche Seitengröße - die größte Seite ist maßgeblich" #: pdfarranger/exporter.py:559 msgid "None" msgstr "" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Öffnen" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "Öffnen …" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "" #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "Overlay" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger ist eine kleine Python-GTK-Anwendung, die dem Benutzer hilft, " "PDF-Dokumente zusammenzuführen oder aufzuteilen und ihre Seiten mit Hilfe " "einer interaktiven und intuitiven grafischen Oberfläche zu drehen, " "zuzuschneiden und neu anzuordnen. Es ist ein Frontend für Pikepdf." #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "PDF-Dokument ist beschädigt" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "PDF-Dateien" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "Sortierung" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "Seitengröße:" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "" #: pdfarranger/core.py:457 msgid "Password" msgstr "Passwort" #: pdfarranger/core.py:435 msgid "Password required" msgstr "Passwort wird benötigt" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "Spezielles Ein_fügen" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "Als _Overlay einfügen …" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "Als _gerade Seiten einfügen" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "Als _ungerade Seiten einfügen" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "Als _Hintergrund einfügen …" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "Einfügen _nach" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "Einfügen _vor" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "Eingefügte Daten sind ungültig. Einfügen wird abgebrochen." #: data/menu.ui:272 msgid "Pre_ferences" msgstr "_Einstellungen" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "Einstellungen" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "PDF Arranger Version anzeigen und beenden" #: pdfarranger/config.py:267 msgid "Printing" msgstr "" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "Drucken …" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "Hersteller" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "Eigenschaft" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "Rei_henfolge umkehren" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "Relativ" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "Vorschau erstellen …" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "Vorschau erstellen …" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "Ersetzen" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "Rechts" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "Rechts nach Links" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Nach links drehen" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Nach rechts drehen" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "Nach _links drehen" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Zeilen" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "Gleiches Seiten_format" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Speichern" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Speichern unter" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "Speichern unter …" #: data/menu.ui:47 msgid "Save _As…" msgstr "Speichern _unter …" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "Änderungen vor dem Schließen speichern?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "Änderungen vor dem Beenden speichern?" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "Änderungen an »{}« vor dem Schließen speichern?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "Änderungen an »{}« vor dem Beenden speichern?" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "Speichern führte zu einigen Warnungen" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "Speichern …" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "Vergrößerung" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "_Alles auswählen" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "_Gerade Seiten auswählen" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "_Ungerade Seiten auswählen" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "Ausgewählte Seiten: " #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Seiten teilen" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "Thema" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "Unterstützte Bilddateien" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "Systemeinstellung" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "" "Das Dokument »{}« ist gesperrt und ein Passwort wird benötigt, um es zu " "öffnen." #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "" #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "Das Passwort wird gespeichert, bis PDF Arranger geschlossen wird." #: pdfarranger/config.py:260 msgid "Theme" msgstr "Erscheinungsbild" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "Titel" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "Oben" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "Oben nach Unten" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "Hintergrund" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "Unbekanntes Dateiformat" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "Wert" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "Vertikal" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Senkrechte Teilungen" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "Vertikale Verschiebung" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "Breite" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Breite in %" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "Änderungen gehen verloren, wenn sie nicht gespeichert werden." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Vergrößern" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Verkleinern" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "Zoom _einpassen" #: data/menu.ui:247 msgid "Zoom _In" msgstr "Ver_größern" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "Ver_kleinern" #: data/menu.ui:278 msgid "_About" msgstr "Über _PDF Arranger" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "_Abbrechen" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "_Schließen" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "_Kopieren" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "_Entfernen" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "Auswahl au_fheben" #: data/menu.ui:87 msgid "_Edit" msgstr "_Bearbeiten" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "" #: data/menu.ui:30 msgid "_Import" msgstr "_Importieren" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "Auswahl _umkehren" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "Seiten _zusammenfügen…" #: data/menu.ui:36 msgid "_New Window" msgstr "_Neues Fenster" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "_Ok" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "_Öffnen" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "" #: data/menu.ui:71 msgid "_Print…" msgstr "_Drucken …" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "Been_den" #: data/menu.ui:82 msgid "_Redo" msgstr "_Wiederholen" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "Nach _rechts drehen" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "_Speichern" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "Aus_wählen" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "_Seiten teilen…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Rückgängig" #: data/menu.ui:244 msgid "_View" msgstr "_Ansicht" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "mm" #: pdfarranger/core.py:326 msgid "page" msgstr "Seite" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "unbenannt" pdfarranger-1.11.0/po/el.po000066400000000000000000000531621463504064500154610ustar00rootroot00000000000000# PDF Arranger translation files. # # This file is part of PDF Arranger which is released under the GNU General # Public License version 3 or later. # See file COPYING or go to for full license details. # # Translators: # Konstantinos Poulios, 2008-2017 # Manussos Pulinakis, 2022 # msgid "" msgstr "" "Project-Id-Version: PDF Arranger 1.9.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2023-06-12 10:30+0300\n" "Last-Translator: Manussos Pulinakis <38626261+manussos@users.noreply.github." "com>\n" "Language-Team: \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.0.1\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Στήλη" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Σειρά" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "% του ύψους" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "% του πλάτους" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "Το %s είναι ένα εργαλείο για αναδιάταξη και τροποποίηση αρχείων PDF." #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "(Η Libhandy απουσιάζει)" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "(Απαιτεί επανεκίνηση)" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "" "Ένα αρχείο με το όνομα \"%s\" υπάρχει ήδη. Θέλετε να το αντικαταστήσετε;" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "Όλε_ς από το ίδιο αρχείο" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "Όλα τα αρχεία" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "Οι σελίδες θα πρέπει να έχουν όλες το ίδιο μέγεθος." #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "Όλα τα υποστηριζόμενα αρχεία" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "Κάτω" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "Από κάτω προς τα πάνω" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "Εικόνα πρόχειρου" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Στήλες" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "Δημιουργήθηκε" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "Δημιουργός" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "Εργαλείο δημιουργίας" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "Περικοπή περιθωρίων" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "Περικοπή λευκών περιθωρίων" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "Απο_κοπή" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "Παρά τις προειδοποιήσεις, το έγγραφο δεν πρέπει να έχει εμφανή προβλήματα." #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "Απόρριψη αλλαγών και κλείσιμο;" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "Απόρριψη αλλαγών και έξοδος;" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "Να μην ξαναεμφανιστεί αυτό το παράθυρο διαλόγου." #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "_Χωρίς αποθήκευση" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "Να μην εμφανίζονται ειδοποιήσεις κατά την αποθήκευση." #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "Δ_ιπλασιασμός" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "Ε_ξαγωγή" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "Ε_ξαγωγή επιλογής σε μονό αρχείο…" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "Επεξεργασία _ιδιοτήτων" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "Επεξεργασία ιδιοτήτων" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Ίσο πλάτος στηλών" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Ίσο ύψος σειρών" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "Εξαγωγή επιλογής σε ξεχωρ_ιστά αρχεία…" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "Εξαγωγή _όλων των σελίδων σε ξεχωριστά αρχεία…" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "Εξαγωγή…" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "Το αρχείο δεν είναι ούτε pdf ούτε εικόνα" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "Αρχείο/α για άνοιγμα" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "Για περισσότερες επιλογές δείτε:" #: data/menu.ui:259 msgid "Full_screen" msgstr "Π_λήρης οθόνη" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "Γενική Άδεια Δημόσιας Χρήσης GNU (GPL) Έκδοση 3η." #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "Δημιουργία ένθετου" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "Ύψος" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Ύψος σε %" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "Οριζόντια" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Οριζόντιοι διαχωρισμοί" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "Οριζόντια μετατόπιση" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "Τα αρχεία εικόνας υποστηρίζονται μόνο μέσω img2pdf" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "Η διαμόρφωση του αρχείου εικόνας δεν υποστηρίζεται από το img2pdf" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Εισαγωγή" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "Εισαγωγή…" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "Εισαγωγή _κενής σελίδας…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "Εισαγωγή κενής σελίδας" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "Εσφαλμένη μορφή ημερομηνίας. Η ενέργεια απορρίφθηκε." #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Χρησιμοποιεί τα libqpdf %s, pikepdf %s, GTK %s και Python %s." #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "Λέξεις κλειδιά" #: pdfarranger/config.py:252 msgid "Language" msgstr "Γλώσσα" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "Αριστερά" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "Αριστερά προς δεξιά" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Κεντρικό μενού" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "Συντηρητές και συνεισφέροντες" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "Περιθώριο" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "Συγχώνευση σελίδων" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "Μέγεθος συγχωνευμένης σελίδας:" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "Τροποποιήθηκε" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "Μη ομοιόμορφο μέγεθος σελίδας - χρήση μέγιστου μεγέθους" #: pdfarranger/exporter.py:559 msgid "None" msgstr "" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Άνοιγμα" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "Άνοιγμα…" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "" #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "Επικάλυψη" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "Το PDF Arranger είναι μια μικρή εφαρμογή, που βοηθά τον χρήστη να " "συγχωνεύσει ή να διαχωρίσει αρχεία τύπου PDF καθώς και να περιστρέψει, " "περικόψει και αναδιατάξει τις σελίδες τους χρησιμοποιώντας ένα διαδραστικό " "και διαισθητικό γραφικό περιβάλλον. Είναι δηλαδή ένα γραφικό περιβάλλον για " "το pikepdf." #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "Το έγγραφο PDF είναι κατεστραμένο" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "Αρχεία PDF" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "Σειρά σελίδων" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "Μέγεθος σελίδας:" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "" #: pdfarranger/core.py:457 msgid "Password" msgstr "Κωδικός" #: pdfarranger/core.py:435 msgid "Password required" msgstr "Απαιτείται κωδικός" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "_Επικόλληση συγκεκριμένα" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "Επικόλληση ως υπε_ρκάλυψη" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "Επικόλληση ως _ζυγές σελίδες" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "Επικόλληση ως μ_ονές σελίδες" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "Επικόλληση ως _υπόστρωμα…" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "Ε_πικόλληση μετά" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "Επικόλληση _πριν" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "Δεδομένα επικόλλησης μη έγκυρα. Η επικόλληση ακυρώθηκε." #: data/menu.ui:272 msgid "Pre_ferences" msgstr "Προ_τιμήσεις" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "Προτιμήσεις" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "Εμφάνιση της έκδοσης του PDF Arranger και έξοδος" #: pdfarranger/config.py:267 msgid "Printing" msgstr "" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "Εκτύπωση…" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "Παραγωγός" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "Ιδιότητα" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "Αναστρο_φή σειράς" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "Αναλογία" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "Προεπισκόπηση…" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "Σχεδίαση…" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "Αντικατάσταση" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "Δεξιά" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "Δεξιά προς αριστερά" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Περιστροφή αριστερά" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Περιστροφή δεξιά" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "Περιστροφή _αριστερά" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Σειρές" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "Ίδιας μορ_φοποίησης σελίδας" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Αποθήκευση" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Αποθήκευση ως" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "Αποθήκευση ως…" #: data/menu.ui:47 msgid "Save _As…" msgstr "_Αποθήκευση ως…" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "Να αποθηκευτούν οι αλλαγές πριν το κλείσιμο;" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "Να αποθηκευτούν οι αλλαγές πριν την έξοδο;" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "Να αποθηκευτούν οι αλλαγές στο “{}” πριν το κλείσιμο;" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "Να αποθηκευτούν οι αλλαγές στο “{}” πριν την έξοδο;" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "Η αποθήκευση παρήγαγε ορισμένες προειδοποιήσεις" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "Γίνεται αποθήκευση…" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "Συντελεστής κλίμακας" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "Επιλογή ό_λων" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "_Επιλογή ζυγών σελίδων" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "Επιλογή μ_ονών σελίδων" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "Επιλεγμένες σελίδες: " #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Διαχωρισμός σελίδων" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "Θέμα" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "Υποστηριζόμενα αρχεία εικόνας" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "Ρύθμιση συστήματος" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "" "Το έγγραφο “{}” είναι κλειδωμένο και απαιτείται κωδικός για το άνοιγμά του." #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "" #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "" "Ο κωδικός θα παραμείνει αποθηκευμένος μέχρι να κλείσετε το PDF Arranger." #: pdfarranger/config.py:260 msgid "Theme" msgstr "Θέμα" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "Τίτλος" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "Πάνω" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "Από πάνω προς τα κάτω" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "Υπόστρωμα" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "Άγνωστη μορφή αρχείου" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "Τιμή" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "Κάθετα" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Κάθετοι διαχωρισμοί" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "Κατακόρυφη μετατόπιση" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "Πλάτος" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Πλάτος σε %" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "Οι αλλαγές θα χαθούν αν δεν αποθηκεύσετε." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Μεγέθυνση" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Σμίκρυνση" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "Προσαρμο_γή" #: data/menu.ui:247 msgid "Zoom _In" msgstr "_Μεγέθυνση" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "_Σμίκρυνση" #: data/menu.ui:278 msgid "_About" msgstr "Σ_χετικά" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "_Ακύρωση" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "_Κλείσιμο" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "Αντι_γραφή" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "_Διαγραφή" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "_Αποεπιλογή όλων" #: data/menu.ui:87 msgid "_Edit" msgstr "_Επεξεργασία" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "" #: data/menu.ui:30 msgid "_Import" msgstr "Ε_ισαγωγή" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "Αντ_ιστροφή επιλογής" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "Συγ_χώνευση σελίδων…" #: data/menu.ui:36 msgid "_New Window" msgstr "_Νέο παράθυρο" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "Άν_οιγμα" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "" #: data/menu.ui:71 msgid "_Print…" msgstr "Εκτύ_πωση…" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "Έξ_οδος" #: data/menu.ui:82 msgid "_Redo" msgstr "Επανάλη_ψη" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "Πε_ριστροφή δεξιά" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "Αποθήκευ_ση" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "Επιλο_γή" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "Διαχωρισμός _σελίδων…" #: data/menu.ui:78 msgid "_Undo" msgstr "Αναί_ρεση" #: data/menu.ui:244 msgid "_View" msgstr "Προ_βολή" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "χιλ" #: pdfarranger/core.py:326 msgid "page" msgstr "σελίδα" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "χωρίς τίτλο" pdfarranger-1.11.0/po/es.po000066400000000000000000000467611463504064500154770ustar00rootroot00000000000000# Spanish translation for pdfarranger. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the pdfarranger package. # This file is an extended version of the PDF-Shuffler translation file # released under the GNU General Public License version 3 or later. # See file COPYING or go to for full license details. # Original translators: # Konstantinos Poulios, 2008-2017 # Rafael Jesús García Perdigón, 2012 # Óscar Fernández Díaz , 2023-2024. # msgid "" msgstr "" "Project-Id-Version: pdfarranger\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2024-02-25 20:13+0100\n" "Last-Translator: Óscar Fernández Díaz \n" "Language-Team: Spanish; Castilian <>\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Gtranslator 45.3\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Col" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Fil" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "% de la altura" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "% de la anchura" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s es una herramienta para reordenar y modificar archivos PDF." #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "(Falta Libhandy)" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "(Requiere reiniciar)" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "Ya existe un archivo llamado \"%s\". ¿Desea reemplazarlo?" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "Todas las páginas del _mismo archivo" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "Todos los archivos" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "Todas las páginas deben tener el mismo tamaño." #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "Formatos de imagen compatibles" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "Rotación automática" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "Inferior" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "De abajo a arriba" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "Imagen del portapapeles" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Columnas" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "Copiar _imagen" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "Copiar _texto" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "Creado" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "Creador" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "Herramienta de creador" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "Recortar los márgenes" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "Quitar el borde blanco" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" "Recortar/ocultar no elimina ningún contenido del archivo PDF, solo lo oculta." #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "_Cortar" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "A pesar de las advertencias, el/los documento/s no deberían tener problemas " "visibles." #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "¿Descartar los cambios y cerrar?" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "¿Descartar los cambios y salir?" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "No mostrar este diálogo de nuevo." #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "_No guardar" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "No mostrar advertencias al guardar de nuevo." #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "Dupl_icar" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "E_xportar" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "E_xportar las páginas seleccionadas a un solo archivo …" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "Editar las _propiedades" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "Editar las propiedades" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Columnas con proporciones iguales" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Filas con proporciones iguales" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "Detonando en imágenes…" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "Exportar las páginas seleccionadas a archivos _individuales…" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "Exportar _todas las páginas a archivos individuales…" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "Exportar…" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "El archivo es ni pdf ni imagen" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "Archivo(s) a abrir" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "Ajustar a página completa" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "Ajustar al área de impresión" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "Para más información, vea" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "Para más opciones, consulte:" #: data/menu.ui:259 msgid "Full_screen" msgstr "Pantalla com_pleta" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL) Version 3." #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "Generar folleto" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "Altura" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Altura en %" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "Ocultar márgenes" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "Horizontal" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Número de filas" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "Desplazamiento horizontal" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "Los archivos de imagen sólo están disponibles con img2pdf" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "El formato de imagen no es compatible con img2pdf" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "Falta Img2pdf." #: data/pdfarranger.ui:58 msgid "Import" msgstr "Importar" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "Importar…" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "Insertar una página en _blanco…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "Insertar una página en blanco" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "Formato de fecha no válido. Descartar cambios." #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Usa libqpdf %s, pikepdf %s, GTK %s y Python %s." #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "Palabras claves" #: pdfarranger/config.py:252 msgid "Language" msgstr "Idioma" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "Izquierdo" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "De izquierda a derecha" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Menú Principal" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "Mantenedores y contribuyentes" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "Margen" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "Fusionar páginas" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "Tamaño de la página fusionada:" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "Modificado" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "Tamaño de página no uniforme: uso del tamaño máximo" #: pdfarranger/exporter.py:559 msgid "None" msgstr "Ninguna" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "Atención" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "Tenga en cuenta las limitaciones:" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Abrir" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "Abrir…" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "Los esquemas y enlaces solo pueden conservarse en determinados casos." #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "Superponer" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger es una pequeña aplicación python-gtk, que ayuda al usuario a " "fusionar o dividir documentos pdf y a rotar, recortar y reorganizar sus " "páginas usando una interfaz gráfica interactiva e intuitiva. Es una interfaz " "para pikepdf." #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "El archivo PDF está dañado" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "Archivos PDF" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "Manejo de páginas" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "Orden de páginas" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "Tamaño de la página:" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "Tamaño de página" #: pdfarranger/core.py:457 msgid "Password" msgstr "Contraseña" #: pdfarranger/core.py:435 msgid "Password required" msgstr "Se requiere contraseña" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "Pegado _especial" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "Pegar como superposi_ción…" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "Copiar como páginas _pares" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "Pegar como páginas _impares" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "Pegar como _subyacente…" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "Pegar detrás" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "Pegar delante" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "Los datos pegados no son válidos. Cancelar el pegado." #: data/menu.ui:272 msgid "Pre_ferences" msgstr "Pre_ferencias" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "Preferencias" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "Imprimir la versión de PDF Arranger y salir" #: pdfarranger/config.py:267 msgid "Printing" msgstr "Impresión" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "Imprimiendo…" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "Productor" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "Propiedad" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "In_vertir el orden" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "Relativo" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "Renderizando vista previa…" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "Renderizando…" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "Reemplazar" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "Derecho" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "De derecha a izquierda" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Rotar a la izquierda" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Rotar a la derecha" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "Rotar a la _izquierda" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Filas" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "El mismo _formato de página" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Guardar" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Guardar como" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "Guardar como…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Guardar _como…" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "¿Desea guardar los cambios efectuados antes de cerrar pdfarranger?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "¿Desea guardar los cambios efectuados antes de salir?" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "¿Desea guardar los cambios efectuados en “{}” antes de cerrarlo?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "¿Desea guardar los cambios efectuados en “{}” antes de salir?" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "Guardar ha generado algunas advertencias" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "Guardando…" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "Factor de escala" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "Modo de escala:" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "Selectionar _todo" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "Seleccionar las páginas _pares" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "Seleccionar las páginas _impares" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "Páginas seleccionadas: " #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "Mostrar valores" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Dividir las páginas" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "Tema" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "Formatos de imagen compatibles" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "Configuración del sistema" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "El documento “{}” requiere una contraseña para abrirlo." #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "La página tiene varias imágenes. Use primero \"Detonar en imágenes\"." #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "La contraseña se guarda hasta que cierre PDF Arranger." #: pdfarranger/config.py:260 msgid "Theme" msgstr "Tema" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "Título" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "Superior" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "De arriba a abajo" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "Subyacer" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "El formato del archivo es desconocido" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "Manual de usuario" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "Valor" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "Vertical" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Número de columnas" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "Desplazamiento vertical" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "Anchura" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Anchura en %" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "Se perderán sus cambios si no los guarda." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Acercar" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Alejar" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "A_justar" #: data/menu.ui:247 msgid "Zoom _In" msgstr "A_cercar" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "A_lejar" #: data/menu.ui:278 msgid "_About" msgstr "A_cerca" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "_Aplicar" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "_Cancelar" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "_Cerrar" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "Copi_ar" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "_Ajustar márgenes…" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "E_liminar" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "_Deseleccionar todo" #: data/menu.ui:87 msgid "_Edit" msgstr "_Editar" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "_Detonar en imágenes" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "_Extraer" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "_Ocultar márgenes…" #: data/menu.ui:30 msgid "_Import" msgstr "_Importar" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "_Invertir selección" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "_Fusionar páginas…" #: data/menu.ui:36 msgid "_New Window" msgstr "_Ventana nueva" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "_Vale" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "_Abrir" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "_Tamaño de página…" #: data/menu.ui:71 msgid "_Print…" msgstr "_Imprimir…" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "_Salir" #: data/menu.ui:82 msgid "_Redo" msgstr "_Rehacer" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "_Revertir" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "Rotar a la _derecha" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "_Guardar" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "_Seleccionar" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "_Dividir las páginas…" #: data/menu.ui:78 msgid "_Undo" msgstr "Des_hacer" #: data/menu.ui:244 msgid "_View" msgstr "_Ver" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "mm" #: pdfarranger/core.py:326 msgid "page" msgstr "página" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "sin título" pdfarranger-1.11.0/po/eu.po000066400000000000000000000460651463504064500154760ustar00rootroot00000000000000# Basque translation for pdfarranger. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the pdfarranger package. # This file is an extended version of the PDF-Shuffler translation file # released under the GNU General Public License version 3 or later. # See file COPYING or go to for full license details. # Original translators: # Alexander Gabilondo Urkijo, 2023 # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2023-01-19 20:27+0100\n" "Last-Translator: alexgabi\n" "Language-Team: Basque\n" "Language: eu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.0.1\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Zut" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Err" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "altueraren %" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "zabaleraren %" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s PDF fitxategiak berrantolatzeko eta aldatzeko tresna bat da." #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "(Libhandy falta da)" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "(Berrabiarazi behar da)" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "\"%s\" izeneko fitxategi bat badago jada. Ordezkatu nahi duzu?" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "Fitxategi bereko _guztiak" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "Fitxategi guztiak" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "Orrialde guztiek tamaina berdina izan behar dute." #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "Onartutako irudi formatuak" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "Biraketa automatikoa" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "Behean" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "Behetik gora" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "Arbeleko irudia" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Zutabeak" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "Kopiatu _Irudia" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "Kopiatu _Testua" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "Sortua" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "Sortzailea" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "Sortzaile tresna" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "Moztu marginak" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "Moztu ertz zuriak" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "Mozketak/ezkutatzeak ez du PDF fitxategitik edukirik kentzen, " "ezkutatzen du soilik" #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "_Moztu" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "Abisuak izan arren dokumentuek ez lukete arazorik izan behar." #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "Aldaketak baztertu eta itxi?" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "Aldaketak baztertu eta irten?" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "Ez erakutsi elkarrizketa hau berriro." #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "E_z gorde" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "Ez erakutsi abisurik berriro gordetzean." #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "B_ikoiztu" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "E_sportatu" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "E_sportatu aukeraketa fitxategi bakar batera…" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "Editatu _propietateak" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "Editatu propietateak" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Zutabeen zabalera berdina" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Errenkaden altuera berdina" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "Arakatzen irudietan…" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "Esportatu hautapena _banakako fitxategietara…" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "Esportatu _orri guztiak fitxategi indibidualetara…" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "Esportatu…" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "Fitxategia ez da ez pdf ez irudia" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "Ireki beharreko fitxategia(k)" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "Doitu orrialde osora" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "Doitu area inprimagarrira" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "Informazio gehaigo hemen" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "Aukera gehiagorako, ikusi:" #: data/menu.ui:259 msgid "Full_screen" msgstr "Pantaila o_soa" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL) 3. bertsioa." #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "Sortu liburuxka" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "Altuera" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Altuera %-tan" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "Ezkutatu marginak" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "Horizontala" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Zati horizontalak" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "Desplazamendu horizontala" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "Irudi-fitxategiak img2pdf-rekin soilik onartzen dira" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "Irudi formatua ez du onartzen img2pdf-ek" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "Img2pdf falta da" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Inportatu" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "Inportatu…" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "Txertatu orri _zuria…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "Txertatu orri zuria" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "Data-formatu baliogabea. Sarrera baztertu da." #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Erabiltzen du libqpdf %s, pikepdf %s, GTK %s eta Python %s." #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "Gako-hitzak" #: pdfarranger/config.py:252 msgid "Language" msgstr "Hizkuntza" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "Ezkerra" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "Ezkerretik eskuinera" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Menu nagusia" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "Laguntzaileak eta babesleak" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "Marjina" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "Batu orriak" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "Batutako orriaren tamaina:" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "Aldatua" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "Orrialdearen tamaina ez-uniformea ​​- gehienezko tamaina erabiliz" #: pdfarranger/exporter.py:559 msgid "None" msgstr "Bat ere ez" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "Oharra" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "Kontuan izan mugak:" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Ireki" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "Ireki…" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "Eskemak eta estekak kasu jakin batzuetan soilik gorde daitezke." #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "Gainjartzea" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger python-gtk aplikazio txiki bat da, erabiltzaileari pdf " "dokumentuak batu edo zatitzen eta orriak biratu, moztu eta berrantolatzen " "laguntzen diona interfaze grafiko interaktibo eta intuitibo bat erabiliz. " "Pikepdf-rako interfaze bat da." #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "PDF dokumentua hondatuta dago" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "PDF fitxategiak" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "Orriaren maneiua" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "Orrien ordena" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "Orriaren tamaina:" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "Orriaren tamaina" #: pdfarranger/core.py:457 msgid "Password" msgstr "Pasahitza" #: pdfarranger/core.py:435 msgid "Password required" msgstr "Pasahitza beharrezkoa da" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "Itsatsi berezia" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "Itsatsi G_ainjartzen..." #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "Itsatsi orrialde bikoitia gisa" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "Itsatsi orrialde bakoitia gisa" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "Itsatsi _azpiko geruza gisa…" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "Itsatsi _ondoren" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "Itsatsi aurrean" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "Itsatsitako datuak baliogabeak dira. Utzi itsastea." #: data/menu.ui:272 msgid "Pre_ferences" msgstr "_Hobespenak" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "Hobespenak" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "Inprimatu PDF Arranger-en bertsioa eta irten" #: pdfarranger/config.py:267 msgid "Printing" msgstr "Inprimatzen" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "Inprimatzen…" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "Ekoizlea" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "Jabetza" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "Al_derantzizkatu ordena" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "Erlatiboa" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "Aurrebista errendatzen…" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "Errendatzen…" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "Ordeztu" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "Eskuina" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "Eskuinetik ezkerrera" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Biratu ezkerrera" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Biratu eskuinera" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "Biratu e_zkerrera" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Errenkadak" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "Orrialdeko _formatu bera" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Gorde" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Gorde honela" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "Gorde honela…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Gorde _honela…" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "Aldaketak itxi aurretik gorde nahi dituzu?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "Aldaketak irten aurretik gorde nahi dituzu?" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "Aldaketak “{}”-n gorde nahi dituzu itxi aurretik?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "Aldaketak “{}”-n gorde nahi dituzu irten aurretik?" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "Gordetzeak abisu batzuk sortu ditu" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "Gordetzen…" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "Eskala-faktorea" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "Eskala modua" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "Hautatu _guztiak" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "Hautatu orrialde b_ikoitiak" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "Hautatu orrialde b_akoitiak" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "Hautatutako orrialdeak: " #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "Erakutsi balioak" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Zatitu orrialdeak" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "Gaia" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "Onartutako irudi-fitxategiak" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "Sistemaren ezarpena" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "" "“{}” dokumentua blokeatuta dago eta pasahitz bat behar du ireki ahal izateko." #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "Orriak hainbat irudi ditu. Erabili \"Arakatu irudietan\" lehenik.\"" #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "Pasahitza gogoratuko da PDF Arranger itxi arte." #: pdfarranger/config.py:260 msgid "Theme" msgstr "Gaia" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "Izenburua" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "Goian" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "Goitik behera" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "Azpian ezarri" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "Fitxategi formatu ezezaguna" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "Erabiltzailearen eskuliburua" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "Balioa" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "Bertikala" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Zati bertikalak" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "Desplazamendu bertikala" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "Zabalera" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Zabalera %-tan" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "Zure aldaketak galduko dira gordetzen ez badituzu." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Handiagotu" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Txikiagotu" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "_Doitu" #: data/menu.ui:247 msgid "Zoom _In" msgstr "_Handiagotu" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "_Txikiagotu" #: data/menu.ui:278 msgid "_About" msgstr "_Honi buruz" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "_Aplikatu" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "_Utzi" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "_Itxi" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "_Kopiatu" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "_Moztu marjinak…" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "_Ezabatu" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "_Desautatu guztiak" #: data/menu.ui:87 msgid "_Edit" msgstr "_Editatu" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "_Arakatu irudietan" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "_Atera" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "_Ezkutatu marjinak" #: data/menu.ui:30 msgid "_Import" msgstr "_Inportatu" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "_Alderantzikatu hautapena" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "_Batu orriak…" #: data/menu.ui:36 msgid "_New Window" msgstr "_Leiho berria" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "Ados" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "_Ireki" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "_Orriaren tamaina" #: data/menu.ui:71 msgid "_Print…" msgstr "_Inprimatu…" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "_Irten" #: data/menu.ui:82 msgid "_Redo" msgstr "_Berregin" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "_Atzera" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "Biratu e_skuinera" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "_Gorde" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "_Hautatu" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "_Zatitu orrialdeak…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Desegin" #: data/menu.ui:244 msgid "_View" msgstr "_Ikusi" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "mm" #: pdfarranger/core.py:326 msgid "page" msgstr "orrialde" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "izenbururik gabe" pdfarranger-1.11.0/po/fi.po000066400000000000000000000447461463504064500154670ustar00rootroot00000000000000# Finnish translation for pdfarranger. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the pdfarranger package. # Translators: # kbengs, 2020-2024 msgid "" msgstr "" "Project-Id-Version: pdfarranger\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2024-03-24 19:16+0200\n" "Last-Translator: \n" "Language-Team: Finnish\n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.0.1\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Sarake" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Rivi" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "% korkeudesta" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "% leveydestä" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s on työkalu PDF-tiedostojen järjestämiseen ja muokkaamiseen." #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "(Libhandy puuttuu)" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "(Vaatii uudelleenkäynnistyksen)" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "Tiedosto nimellä \"%s\" on jo olemassa. Haluatko korvata sen?" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "Kaikki samasta _tiedostosta" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "Kaikki tiedostot" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "Kaikki sivut on oltava samankokoiset." #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "Kaikki tuetut tiedostot" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "Automaattinen kääntö" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "Alla" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "Alhaalta ylöspäin" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "Leikepöytä kuva" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Sarakkeita" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "Kopioi _kuva" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "Kopioi _teksti" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "Luotu" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "Tekijä" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "Sovellus" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "Rajaa reunoja" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "Rajaa valkoiset reunat" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" "Rajaa/piilota ei poista sisältöä PDF-tiedostosta, vaan vain piilottaa sen." #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "_Leikkaa" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "Varoituksista huolimatta tiedostoissa ei pitäisi olla näkyviä ongelmia." #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "Hylkää muutokset ja sulje tiedosto?" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "Hylkää muutokset ja sulje ohjelma?" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "Älä näytä tätä viestiä enää." #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "_Älä tallenna" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "Älä näytä varoituksia tallennettaessa." #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "Monis_ta" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "Vi_e" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "Vi_e valitut sivut yhteen tiedostoon…" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "Muokkaa ominaisuuks_ia" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "Muokkaa ominaisuuksia" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Sama sarakeleveys" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Sama rivikorkeus" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "Räjähtää kuviksi…" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "Vie valitut sivut _omiin tiedostoihin…" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "Vie kaikki sivut omiin _tiedostoihin…" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "Vie…" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "Tiedosto ei ole pdf eikä kuva" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "Tiedostoja avattavaksi" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "Sovita koko sivulle" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "Sovita tulostettavalle alueelle" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "Katso lisätietoja" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "Käytetty asetustiedosto:" #: data/menu.ui:259 msgid "Full_screen" msgstr "Koko _näyttö" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL) Version 3." #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "Luo kirjanen" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "Korkeus" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Korkeus %" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "Piilota reunoja" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "Vaakasuora" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Vaakasuora jako" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "Vaakasuuntainen siirtymä" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "Kuvatiedostoja tuetaan voin jos img2pdf on asennettu" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "Img2pdf ei tue kuvamuotoa" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "Img2pdf puuttuu." #: data/pdfarranger.ui:58 msgid "Import" msgstr "Tuo" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "Tuo…" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "L_isää tyhjä sivu…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "Lisää tyhjä sivu" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "Päivämäärämuoto on virheellinen." #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "libqpdf %s, pikepdf %s, GTK %s ja Python %s." #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "Avainsanat" #: pdfarranger/config.py:252 msgid "Language" msgstr "Kieli" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "Vasen" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "Vasemmalta oikealle" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Päävalikko" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "Ylläpitäjät ja avustajat" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "Reuna" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "Yhdistä sivuja" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "Yhdistetyn sivun koko:" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "Muokattu" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "Vaihteleva sivukoko - enimmäiskoko käytetään" #: pdfarranger/exporter.py:559 msgid "None" msgstr "Ei mikään" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "Huomio" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "Huomaa rajoitukset:" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Avaa" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "Avaa…" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "" "Kirjanmerkkejä ja linkkejä voidaan säilyttää vain tietyissä tapauksissa." #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "Liitä ylle" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger on pieni python-gtk ohjelma mikä auttaa käyttäjää yhdistämään " "ja järjestämään PDF-tiedostoja. Ohjelma käyttää pikepdf taustalla." #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "PDF tiedosto on vioittunut" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "PDF tiedostot" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "Sivun käsittely" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "Sivujärjestys" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "Sivun koko:" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "Sivun koko" #: pdfarranger/core.py:457 msgid "Password" msgstr "Salasana" #: pdfarranger/core.py:435 msgid "Password required" msgstr "Salasana tarvitaan" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "Liitä määräte_n" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "Liitä _ylle…" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "Liitä pa_rillisina sivuina" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "Liitä paritto_mina sivuina" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "Liitä _alle…" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "Liitä j_älkeen" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "Liitä _ennen" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "Liitetty data ei hyväksytty." #: data/menu.ui:272 msgid "Pre_ferences" msgstr "Asetukse_t" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "Asetukset" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "Tulosta PDF Arranger versio ja sulje" #: pdfarranger/config.py:267 msgid "Printing" msgstr "Tulostus" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "Tulostaa…" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "PDF-tuottaja" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "Ominaisuus" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "_Käännä järjestys" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "Suhteellinen" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "Renderöi esikatselua…" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "Renderöi…" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "Korvaa" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "Oikea" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "Oikealta vasemmalle" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Käännä vasemmalle" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Käännä oikealle" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "Käännä v_asemmalle" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Rivejä" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "Sama s_ivunmuoto" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Tallenna" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Tallenna nimellä" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "Tallenna nimellä…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Tallenna _nimellä…" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "Tallenna muutokset ennen tiedoston sulkemista?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "Tallenna muutokset ennen ohjelman sulkemista?" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "Tallenna muutokset “{}” ennen sulkemista?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "Tallenna muutokset “{}” ennen sulkemista?" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "Tallentamisprosessi tuotti varoituksia" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "Tallentaa…" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "Skaalauskerroin" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "Skaalaus:" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "_Valitse kaikki" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "Valitse parilli_set sivut" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "Valitse paritto_mat sivut" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "Valitut sivut: " #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "Näytä arvot" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Jaa sivu" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "Aihe" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "Tuetut kuvatiedostot" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "Järjestelmäasetus" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "" "Tiedosto “{}” on lukittu ja vaatii salasanan ennen kuin se voidaan avata." #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "Sivulla on useita kuvia. Käytä \"Räjähdä kuviksi\" ensin" #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "Salasana pysyy muistissa kunnes ohjelma suljetaan." #: pdfarranger/config.py:260 msgid "Theme" msgstr "Teema" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "Otsikko" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "Yllä" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "Ylhäältä alaspäin" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "Liitä alle" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "Tuntematon tiedostomuoto" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "Ohjekirja" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "Arvo" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "Pystysuora" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Pystysuora jako" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "Pystysuuntainen siirtymä" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "Leveys" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Leveys %" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "Muutokset menetetään jos et tallenna niitä." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Lähennä" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Loitonna" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "Koko _ikkuna" #: data/menu.ui:247 msgid "Zoom _In" msgstr "L_ähennä" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "L_oitonna" #: data/menu.ui:278 msgid "_About" msgstr "Tietoja - PD_F Arranger" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "_Käytä" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "_Peru" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "_Sulje tiedosto" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "Ko_pioi" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "_Rajaa reunoja…" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "Poi_sta" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "_Poista valinta" #: data/menu.ui:87 msgid "_Edit" msgstr "_Muokkaa" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "_Räjähdä kuviksi" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "Kopioi _muu" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "_Piilota reunoja…" #: data/menu.ui:30 msgid "_Import" msgstr "_Tuo" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "K_äänteinen valinta" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "_Yhdistä sivuja…" #: data/menu.ui:36 msgid "_New Window" msgstr "_Uusi ikkuna" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "_OK" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "_Avaa" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "_Sivun koko…" #: data/menu.ui:71 msgid "_Print…" msgstr "_Tulosta…" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "_Sulje ohjelma" #: data/menu.ui:82 msgid "_Redo" msgstr "Tee uu_delleen" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "_Palauta" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "Käännä _oikealle" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "T_allenna" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "_Valitse" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "_Jaa sivu…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Kumoa" #: data/menu.ui:244 msgid "_View" msgstr "_Näytä" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "mm" #: pdfarranger/core.py:326 msgid "page" msgstr "sivu" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "Nimetön" pdfarranger-1.11.0/po/fr.po000066400000000000000000000467301463504064500154730ustar00rootroot00000000000000# pdfarranger translation files. # Copyright (C) 2020 Jérôme Robert # This file is part of pdfarranger which is released under the GNU General # Public License version 3 or later. # See file COPYING or go to for full license details. # Translators: # David VANTYGHEM , 2014. # Jérôme Robert , 2019-2024 # Charles Monzat , 2019-2022. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2024-02-24 20:47+0100\n" "Last-Translator: Jérôme Robert \n" "Language-Team: \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Poedit-SourceCharset: utf-8\n" "X-Generator: Poedit 3.4.2\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Col" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Lig" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "% de la hauteur" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "% de la largeur" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s est un outil pour réorganiser et modifier des fichiers PDF." #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "(Libhandy manquant)" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "(Nécessite de redémarrer)" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "Un fichier nommé « %s » existe déjà. Voulez-vous le remplacer ?" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "Pages du _même fichier" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "Tous les fichiers" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "Toutes les pages doivent avoir la même taille." #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "Tous les fichiers pris en charge" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "Rotation automatique" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "En bas" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "De bas en haut" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "Image du presse-papiers" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "En colonnes" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "Copier l'_image" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "Copier le _texte" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "Créé le" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "Auteur" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "Outil" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "Rogner les marges" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "Rogner au contenu" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" "Le recadrage/masquage ne supprime aucun contenu du fichier PDF, il ne fait " "que le masquer." #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "C_ouper" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "Malgré les avertissements, le ou les documents ne devraient présenter aucun " "problème visible." #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "Annuler les modifications et fermer ?" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "Annuler les modifications et quitter ?" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "Ne plus demander." #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "Ne _pas enregistrer" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "Ne plus montrer cet avertissement." #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "D_upliquer" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "E_xporter" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "E_xporter la sélection vers un seul fichier…" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "Édi_ter les propriétés" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "Éditer les propriétés" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Colonnes de largeurs égales" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Lignes de hauteurs égales" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "Extraire les images…" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "Exporter chaque page sélect_ionnée vers un fichier…" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "Exporter ch_aque page vers un fichier…" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "Exporter…" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "Le fichier n’est ni un PDF ni une image" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "Fichier(s) à ouvrir" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "Ajuster à la page entière" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "Ajuster à la zone d'impression" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "Pour plus d'information voir:" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "Pour plus d'options voir:" #: data/menu.ui:259 msgid "Full_screen" msgstr "Plein _écran" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "Licence publique générale GNU (GPL), version 3." #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "Générer un livret" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "Hauteur" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Hauteur en %" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "Cacher les marges" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "Horizontal" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Nombre de lignes" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "Décalage horizontal" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "Les fichiers image sont seulement pris en charge avec img2pdf" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "Le format d’image n’est pas pris en charge par img2pdf" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "img2pdf introuvable." #: data/pdfarranger.ui:58 msgid "Import" msgstr "Importer" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "Importer…" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "Insérer une page _blanche…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "Insérer une page blanche" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "Format de date non valide." #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Il utilise libqpdf %s, pikepdf %s, GTK %s et Python %s." #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "Mots-clés" #: pdfarranger/config.py:252 msgid "Language" msgstr "Langue" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "À gauche" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "De gauche à droite" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Menu principal" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "Mainteneurs et contributeurs" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "Marges" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "Fusionner les pages" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "Taille de la page fusionnée :" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "Modifié le" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "Taille de page non uniforme - utilisation de la taille maximale" #: pdfarranger/exporter.py:559 msgid "None" msgstr "Aucun" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "Note" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "Veuillez noter les limitations suivantes:" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Ouvrir" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "Ouvrir…" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "" "Les sommaires et les liens ne peuvent être conservés que dans certains cas." #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "Sur-couche" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger est une application basée sur Python GTK, qui permet de " "fusionner ou diviser des documents PDF et de pivoter, recadrer et " "réorganiser leurs pages en utilisant une interface graphique interactive et " "intuitive. C’est une interface pour Pikepdf." #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "Le document PDF est endommagé" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "Fichiers PDF" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "Gestion de page" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "Ordre des pages" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "Dimensions de la page :" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "Dimensions de la page" #: pdfarranger/core.py:457 msgid "Password" msgstr "Mot de passe" #: pdfarranger/core.py:435 msgid "Password required" msgstr "Mot de passe requis" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "Coll_age spécial" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "Coller en s_ur-couche…" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "Coller en pages _paires" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "Coller en pages i_mpaires" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "Coller en s_ous-couche…" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "Co_ller après" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "Coller a_vant" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "Données collées non valides. Annulation du collage." #: data/menu.ui:272 msgid "Pre_ferences" msgstr "Pré_férences" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "Préférences" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "Affiche la version de PDF Arranger et quitte" #: pdfarranger/config.py:267 msgid "Printing" msgstr "Impression" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "Impression…" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "Producteur" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "Propriété" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "_Inverser l’ordre" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "Relative" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "Rendu des aperçus…" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "Calcul du rendu…" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "Remplacer" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "À droite" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "De droite à gauche" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Rotation vers la gauche" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Rotation vers la droite" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "Rotation vers la _gauche" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "En lignes" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "Pages de même _format" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Enregistrer" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Enregistrer sous" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "Enregistrer sous…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Enregistrer _sous…" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "Enregistrer les modifications avant la fermeture ?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "Enregistrer les modifications avant de quitter ?" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "Enregistrer les modifications du document « {} » avant la fermeture ?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "Enregistrer les modifications dans « {} » avant de quitter ?" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "La sauvegarde a produit des avertissements" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "Enregistrer…" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "Facteur d’échelle" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "Mode d'ajustement:" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "_Tout sélectionner" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "Pages _paires" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "Pages _impaires" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "Pages sélectionnées : " #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "Montrer les valeurs" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Séparer les pages" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "Sujet" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "Fichiers image pris en charge" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "Configuration système" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "" "Le document « {} » est verrouillé et nécessite un mot de passe avant son " "ouverture." #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "" "La page contient plusieurs images. Utilisez d'abord \"Extraire les images\"." #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "Le mot de passe sera mémorisé jusqu’à la fermeture de PDF Arranger." #: pdfarranger/config.py:260 msgid "Theme" msgstr "Thème" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "Titre" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "En haut" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "De haut en bas" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "Sous-couche" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "Format de fichier inconnu" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "Manuel utilisateur" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "Valeur" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "Vertical" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Nombre de colonnes" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "Décalage vertical" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "Largeur" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Largeur en %" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "Vos modifications seront perdues si vous ne les enregistrez pas." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Zoom avant" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Zoom arrière" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "Zoom _ajusté" #: data/menu.ui:247 msgid "Zoom _In" msgstr "Zoom a_vant" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "Zoom _arrière" #: data/menu.ui:278 msgid "_About" msgstr "À _propos" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "_Appliquer" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "A_nnuler" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "_Fermer" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "_Copier" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "_Rogner les marges…" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "_Supprimer" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "Tout _désélectionner" #: data/menu.ui:87 msgid "_Edit" msgstr "É_dition" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "_Extraire les images" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "_Extraire" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "_Cacher les marges…" #: data/menu.ui:30 msgid "_Import" msgstr "_Importer" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "_Inverser la sélection" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "_Fusionner les pages…" #: data/menu.ui:36 msgid "_New Window" msgstr "_Nouvelle fenêtre" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "_OK" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "_Ouvrir" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "_Dimensions de page…" #: data/menu.ui:71 msgid "_Print…" msgstr "_Imprimer…" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "_Quitter" #: data/menu.ui:82 msgid "_Redo" msgstr "_Rétablir" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "_Rétablir" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "Rotation vers la _droite" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "_Enregistrer" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "_Sélectionner" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "_Séparer les pages…" #: data/menu.ui:78 msgid "_Undo" msgstr "Ann_uler" #: data/menu.ui:244 msgid "_View" msgstr "_Vue" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "mm" #: pdfarranger/core.py:326 msgid "page" msgstr "page" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "sans titre" pdfarranger-1.11.0/po/genpot.sh000077500000000000000000000017531463504064500163530ustar00rootroot00000000000000#!/bin/sh # # pdfarranger - GTK+ based utility for splitting, rearrangement and # modification of PDF documents. # Copyright (C) 2008-2017 Konstantinos Poulios # # pdfarranger 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. # # Make translation files cd "$(dirname "$0")/.." xgettext -s --from-code=utf-8 --output=po/pdfarranger.pot pdfarranger/*.py data/*.ui pdfarranger-1.11.0/po/he.po000066400000000000000000000464201463504064500154540ustar00rootroot00000000000000# PDF Arranger. # Copyright (C) 2023 PDF Arranger Contributors # This file is distributed under the same license as the PDF Arranger package. # Yaron Shahrabani , 2023. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2023-06-12 11:22+0300\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: \n" "Language: he\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==2 ? 1 : n>10 && n%10==0 ? " "2 : 3);\n" "X-Generator: Poedit 3.3.1\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "מס׳ עמודות" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "מס׳ שורות" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "% מהגובה" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "% מהרוחב" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s הוא כלי לסידור מחדש ועריכה של קובצי PDF." #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "(Libhandy חסרה)" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "(נדרשת הפעלה מחדש)" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "כבר קיים קובץ בשם „%s”. להחליף אותו?" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "הכול מאותו ה_קובץ" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "כל הקבצים" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "כל העמודים חייבים להיות באותו הגודל." #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "כל הקבצים הנתמכים" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "למטה" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "מלמטה למעלה" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "תמונה בלוח גזירים" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "עמודות" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "נוצר" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "יוצר" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "כלי יצירה" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "חיתוך השוליים" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "חיתוך מסגרת לבנה" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "_גזירה" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "למרות האזהרות לא אמורות להופיע תקלות חזותיות במסמכים." #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "להתעלם מהשינויים ולסגור?" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "להתעלם מהשינויים ולצאת?" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "לא להציג את החלונית הזאת שוב." #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "_לא לשמור" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "לא להציג אזהרות בשמירה חוזרת." #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "_שכפול" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "יי_צוא" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "ייצוא ה_בחירה לקובץ יחיד…" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "עריכת מ_אפיינים" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "עריכת מאפיינים" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "רוחב עמודות שווה" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "גובה שורות שווה" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "ייצוא הבחירה לקבצים _בודדים…" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "ייצוא _כל העמודים לקבצים בודדים…" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "ייצוא…" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "הקובץ אינו pdf או תמונה" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "קבצים לפתיחה" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "לאפשרויות נוספות ר׳:" #: data/menu.ui:259 msgid "Full_screen" msgstr "מסך _מלא" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "הרישיון הציבורי הכללי של גנו (GPL) גרסה 3." #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "יצירת חוברת" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "גובה" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "גובה ב־%" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "אופקי" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "פיצולים אופקיים" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "היסט אופקי" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "קובצי התמונה נתמכים רק עם img2pdf" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "סוג התמונה לא נתמך על ידי img2pdf" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "" #: data/pdfarranger.ui:58 msgid "Import" msgstr "ייבוא" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "ייבוא…" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "הוספת עמוד _ריק…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "הוספת עמוד ריק" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "תבנית התאריך שגויה. הקלט לא התקבל." #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "הוא משתמש ב־libqpdf‏ %s, ב־pikepdf‏ %s, ב־GTK‏ %s וב־Python‏ %s." #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "מילות חיפוש" #: pdfarranger/config.py:252 msgid "Language" msgstr "שפה" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "שמאל" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "משמאל לימין" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "תפריט ראשי" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "מתחזקים ומתנדבים" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "שול" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "מיזוג עמודים" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "גודל העמוד הממוזג:" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "נערך" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "גודל עמודים לא אחיד - נעשה שימוש בגודל המרבי" #: pdfarranger/exporter.py:559 msgid "None" msgstr "" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "פתיחה" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "פתיחה…" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "" #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "שכבת על" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger הוא יישום python-gtk קטן שמסייע למשתמש למזג או לפצל קובצי PDF " "ולהטות, לחתוך או לסדר מחדש את העמודים שלהם באמצעות מנשק גרפי פשוט לשימוש. זה " "למעשה מנשק חזותי ל־pikepdf." #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "מסמך ה־PDF פגום" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "קובצי PDF" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "סדר עמודים" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "גודל עמוד:" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "" #: pdfarranger/core.py:457 msgid "Password" msgstr "ססמה" #: pdfarranger/core.py:435 msgid "Password required" msgstr "דרושה ססמה" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "הדבקה _מיוחדת" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "הדבקה כ_שכבת על…" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "הדבקה כדפים _זוגיים" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "הדבקה כדפים א_י־זוגיים" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "הדבקה כשכבת _רקע…" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "הדבקה _אחרי" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "הדבקה _לפני" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "הנתונים שהודבקו שגויים. ההדבקה מבוטלת." #: data/menu.ui:272 msgid "Pre_ferences" msgstr "ה_עדפות" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "העדפות" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "להדפיס את הגרסה של PDF Arranger ולצאת" #: pdfarranger/config.py:267 msgid "Printing" msgstr "" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "מתבצעת הדפסה…" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "מפיק" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "מאפיין" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "היפוך ה_סדר" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "יחסי" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "מתבצע עיבוד של התצוגה המקדימה…" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "מתבצע עיבוד…" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "החלפה" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "ימין" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "מימין לשמאל" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "הטיה שמאלה" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "הטיה ימינה" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "הטיה _שמאלה" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "שורות" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "הת_צורה של אותו העמוד" #: data/pdfarranger.ui:78 msgid "Save" msgstr "שמירה" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "שמירה בשם" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "שמירה בשם…" #: data/menu.ui:47 msgid "Save _As…" msgstr "_שמירה בשם…" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "לשמור את השינויים לפני הסגירה?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "לשמור את השינויים לפני היציאה?" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "לשמור את השינויים אל „{}” לפני הסגירה?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "לשמור את השינויים אל „{}” לפני היציאה?" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "השמירה הובילה למספר שגיאות" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "מתבצעת שמירה…" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "מקדם קנה מידה" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "בחירה בה_כול" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "בחירה בעמודים _זוגיים" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "בחירה בעמודים _אי־זוגיים" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "עמודים נבחרים: " #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "פיצול עמודים" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "נושא" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "קובצי התמונה הנתמכים" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "הגדרת המערכת" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "המסמך „{}” נעול ודורש ססמה כדי להיפתח." #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "" #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "הססמה תישמר עד לסגירת PDF Arranger." #: pdfarranger/config.py:260 msgid "Theme" msgstr "ערכת עיצוב" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "כותרת" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "למעלה" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "מלמעלה למטה" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "שכבת רקע" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "סוג הקובץ לא ידוע" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "ערך" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "אנכי" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "פיצולים אנכיים" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "היסט אנכי" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "רוחב" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "רוחב ב־%" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "השינויים שלך יאבדו אם לא יישמרו." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "התקרבות" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "התרחקות" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "התאמת תקריב" #: data/menu.ui:247 msgid "Zoom _In" msgstr "הת_קרבות" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "התר_חקות" #: data/menu.ui:278 msgid "_About" msgstr "_על אודות" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "_ביטול" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "ל_סגור" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "ה_עתקה" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "מ_חיקה" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "ביטול ב_חירה" #: data/menu.ui:87 msgid "_Edit" msgstr "_עריכה" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "" #: data/menu.ui:30 msgid "_Import" msgstr "יי_בוא" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "היפוך ה_בחירה" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "מי_זוג עמודים…" #: data/menu.ui:36 msgid "_New Window" msgstr "_חלון חדש" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "_אישור" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "_פתיחה" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "" #: data/menu.ui:71 msgid "_Print…" msgstr "ה_דפסה…" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "י_ציאה" #: data/menu.ui:82 msgid "_Redo" msgstr "ביצוע מ_חדש" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "הטיה י_מינה" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "_שמירה" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "_בחירה" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "_פיצול עמודים…" #: data/menu.ui:78 msgid "_Undo" msgstr "_ביטול" #: data/menu.ui:244 msgid "_View" msgstr "ת_צוגה" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "מילימטר" #: pdfarranger/core.py:326 msgid "page" msgstr "עמוד" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "ללא כותרת" pdfarranger-1.11.0/po/hr.po000066400000000000000000000444141463504064500154720ustar00rootroot00000000000000# Croatian translation for pdfarranger. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the pdfarranger package. # Milo Ivir , 2020., 2021. # msgid "" msgstr "" "Project-Id-Version: pdfarranger\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2023-06-06 13:27+0200\n" "Last-Translator: Milo Ivir \n" "Language-Team: \n" "Language: hr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.0\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "Broj stupaca" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "Broj redaka" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "% visine" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "% širine" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s je alat za preraspoređivanje i mijenjenje PDF datoteka." #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "(nedostaje Libhandy)" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "(Zahtijeva ponovno pokretanje)" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "Datoteka s imenom „%s” već postoji. Želiš li je zamijeniti?" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "_Sve iz iste datoteke" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "Sve datoteke" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "Sve stranice moraju biti iste veličine." #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "Sve podržane datoteke" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "Dolje" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "Odozdo prema gore" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "Slika međuspremnika" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Stupci" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "Stvoreno" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "Izvorni program dokumenta" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "Alat izvornog programa" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "Odreži margine" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "Odreži bijele rubove" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "_Izreži" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "Unatoč upozorenja dokumenti ne bi trebali imati vidljivih problema." #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "Odbaciti promjene i zatvoriti?" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "Odbaciti promjene i zatvoriti program?" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "Ovaj dijalog više nemoj prikazivati." #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "_Nemoj spremiti" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "Upozorenja više nemoj prikazivati prilikom spremanja." #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "Dupli_ciraj" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "_Izvezi" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "_Izvezi odabir u jednu datoteku …" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "Uredi _svojstva" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "Uredi svojstva" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Stupci jednake širine" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Redci jednake visine" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "Izvezi odabir u _pojedinačne datoteke …" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "Izvezi _sve stranice u pojedinačne datoteke …" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "Izvezi …" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "Datoteka nije PDF niti slika" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "Datoteke za otvaranje" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "Pogledaj daljnje opcije:" #: data/menu.ui:259 msgid "Full_screen" msgstr "Cjeloekran_ski prikaz" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU opća javna licenca, verzija 3." #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "Generiraj knjižicu" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "Visina" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Visina u %" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "Vodoravno" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Vodoravna podjela" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "Vodoravni odmak" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "Slikovne datoteke su podržane samo s img2pdf" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "img2pdf ne podržava format slike" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Uvezi" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "Uvezi …" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "Umetni pra_znu stranicu…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "Umetni praznu stranicu" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "Neispravan format datuma. Unos se zanemaruje." #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Program koristi libqpdf %s, pikepdf %s, GTK %s i Python %s." #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "Ključne riječi" #: pdfarranger/config.py:252 msgid "Language" msgstr "Jezik" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "Lijevo" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "S lijeva na desno" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Glavni izbornik" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "Održavatelji i doprinositelji" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "Margina" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "Sjedini stranice" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "Veličina sjedinjenih stranica:" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "Promijenjeno" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "Nejednolika veličina stranica – koristi se maksimaln veličina" #: pdfarranger/exporter.py:559 msgid "None" msgstr "" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Otvori" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "Otvori …" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "" #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "Prednji sloj" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger je mali python-gtk program koji pomaže korisniku sjediniti ili " "rastaviti pdf dokumente te okretati, izrezati i preurediti stranice " "koristeći interaktivno i intuitivno grafičko sučelje. Radi se o sučelju za " "pikepdf." #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "PDF dokument je oštećen" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "PDF datoteke" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "Redoslijed stranica" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "Veličina stranice:" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "" #: pdfarranger/core.py:457 msgid "Password" msgstr "Lozinka" #: pdfarranger/core.py:435 msgid "Password required" msgstr "Zahtijeva lozinku" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "Um_etni" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "Umetni kao p_rednji sloj …" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "Umetni kao _parne stranice" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "Umetni kao _neparne stranice" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "Umetni kao s_tražnji sloj …" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "Umetni i_za" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "Umetni i_spred" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "Umetnuti podaci nisu ispravni. Umetanje se prekida." #: data/menu.ui:272 msgid "Pre_ferences" msgstr "Posta_vke" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "Postavke" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "Ispiši PDF Arranger verziju i zatvori program" #: pdfarranger/config.py:267 msgid "Printing" msgstr "" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "Ispis …" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "PDF stvoren pomoću" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "Svojstvo" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "Preo_kreni redoslijed" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "Relativno" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "Iscrtavanje pregleda …" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "Iscrtavanje …" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "Zamijeni" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "Desno" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "S desna na lijevo" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Okreni lijevo" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Okreni desno" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "Okreni _lijevo" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Redci" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "Isti _format stranice" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Spremi" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Spremi kao" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "Spremi kao …" #: data/menu.ui:47 msgid "Save _As…" msgstr "Spremi k_ao …" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "Spremiti promjene prije zatvaranja?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "Spremiti promjene prije zatvaranja programa?" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "Spremiti promjene u „{}” prije zatvaranja?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "Spremiti promjene u „{}” prije zatvaranja programa?" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "Spremanje je proizvelo neka upozorenja" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "Spremanje …" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "Uvećanje" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "Odaberi _sve" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "Odaberi _parne stranice" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "Odaberi _neparne stranice" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "Odabrane stranice: " #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Rastavi stranice" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "Predmet" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "Podržane slikovne datoteke" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "Postavke sustava" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "" "Dokument „{}” je zaključan. Za otvaranje dokumenta mora se upisati lozinka." #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "" #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "Lozinka će se zapamtiti, sve dok se ne zatvori PDF uređivač." #: pdfarranger/config.py:260 msgid "Theme" msgstr "Tema" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "Naslov" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "Gore" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "Odozgo prema dolje" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "Stražnji sloj" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "Nepoznat datotečni format" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "Vrijednost" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "Okomito" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Okomita podjela" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "Okomiti odmak" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "Širina" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Širina u %" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "Ako promjene ne spremiš, izgubit ćeš ih." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Uvećaj prikaz" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Umanji prikaz" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "P_rilagodi prikaz veličini prozora" #: data/menu.ui:247 msgid "Zoom _In" msgstr "U_većaj prikaz" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "U_manji prikaz" #: data/menu.ui:278 msgid "_About" msgstr "_Informacije" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "O_dustani" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "_Zatvori" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "_Kopiraj" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "Iz_briši" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "O_dznači sve" #: data/menu.ui:87 msgid "_Edit" msgstr "Ur_edi" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "" #: data/menu.ui:30 msgid "_Import" msgstr "_Uvezi" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "Pr_eokreni odabir" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "_Sjedini stranice …" #: data/menu.ui:36 msgid "_New Window" msgstr "_Novi prozor" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "U _redu" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "_Otvori" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "" #: data/menu.ui:71 msgid "_Print…" msgstr "_Ispis …" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "_Zatvori program" #: data/menu.ui:82 msgid "_Redo" msgstr "_Ponovi" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "Okreni _desno" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "_Spremi" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "_Odaberi" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "_Rastavi stranice …" #: data/menu.ui:78 msgid "_Undo" msgstr "Po_ništi" #: data/menu.ui:244 msgid "_View" msgstr "Pri_kaz" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "mm" #: pdfarranger/core.py:326 msgid "page" msgstr "stranica" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "bez naslova" pdfarranger-1.11.0/po/hu.po000066400000000000000000000453451463504064500155010ustar00rootroot00000000000000# This file is part of PDF Arranger which is released under the GNU General # Public License version 3 or later. # See file COPYING or go to for full license details. # Translators: # Péter Bojtos , 2011 msgid "" msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Hungarian\n" "X-Poedit-Country: HUNGARY\n" "X-Poedit-SourceCharset: utf-8\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "Oszlop száma" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "Sor száma" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "A magasság százaléka" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "A szélesség százaléka" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "" "A(z) %s egy olyan eszköz, mellyel átrendezhetők és módosíthatóak a PDF-" "fájlok." #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "(libhandy-könyvtár hiányzik)" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "(Újraindítás szükséges)" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "A(z) „%s” nevű fájl már létezik. Szeretné felülírni?" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "Mindegyik _ugyanabból a fájlból" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "Minden fájl" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "Minden oldalnak azonos méretűnek kell lennie." #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "Minden támogatott fájl" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "Alulról" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "Alulról felfelé" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "Vágólap képe" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Oszlopok" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "Készült" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "Készítő" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "Készítő eszköz" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "Margók körülvágása" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "Fehér szegélyek körülvágása" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "_Kivágás" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "A figyelmeztetések ellenére a dokumentum(ok)on nem lehetnek látható hibák." #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "Módosítások elvetése és bezárás?" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "Módosítások elvetése és kilépés?" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "Ne jelenjen meg újra ez a párbeszédpanel." #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "_Nincs mentés" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "Ne jelenjen meg többé ez az üzenet mentéskor." #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "Megkettő_zés" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "Exportálás…" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "Kijelölés e_xportálása egyetlen fájlként…" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "_Tulajdonságok szerkesztése" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "Tulajdonságok szerkesztése" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Azonos hasábszélesség" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Azonos sormagasság" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "Kijelölés exportálása _külön fájlokként…" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "Összes _oldal exportálása külön fájlokként" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "Exportálás…" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "A fájl nem pdf vagy kép" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "Megnyitandó fájl(ok)" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "További beállításokért lásd:" #: data/menu.ui:259 msgid "Full_screen" msgstr "_Teljes képernyő" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "" "GNU GPL (General Public License - általános nyilvános engedély) 3. verzió." #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "Füzet létrehozása" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "Magasság" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Magasság százalékként" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "Vízszintes" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Vízszintes felosztása" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "Vízszintes eltolása" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "A képfájlokat csak az img2pdf támogatja" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "Az img2pdf nem támogatja a képformátumot" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Importálás" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "Importálás…" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "Üres oldal bes_zúrása…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "Üres oldal beszúrása" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "Érvénytelen dátumformátum. A bevitelt elvetve." #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "A libqpdf %s, a pikepdf %s, a GTK %s és a Python %s használata" #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "Kulcsszavak" #: pdfarranger/config.py:252 msgid "Language" msgstr "Nyelv" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "Balról" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "Balról jobbra" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Főmenü" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "Fenntartók és közreműködők" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "Margó" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "Oldalak egyesítése" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "Egyesített oldal mérete:" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "Módosítva" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "Nem egységes oldalméret – a legfeljebb méret használata" #: pdfarranger/exporter.py:559 msgid "None" msgstr "" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Megnyitás" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "Megnyitás…" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "" #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "Átfedés" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "A PDF-rendező egy kis python-gtk alkalmazás, amely egy interaktív és " "intuitív grafikus felület segítségével segíti a felhasználót a pdf " "dokumentumok egyesítésében vagy felosztásában, valamint az oldalak " "elforgatásában, kivágásában és átrendezésében. Ez a pikepdf Python-könyvtár " "kezelőfelülete." #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "A PDF-dokumentum sérült" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "PDF-fájlok" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "Oldalsorrend" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "Oldalméret:" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "" #: pdfarranger/core.py:457 msgid "Password" msgstr "Jelszó" #: pdfarranger/core.py:435 msgid "Password required" msgstr "Jelszó szükséges" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "Irá_nyított beillesztés" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "Beillesztés _átfedésként…" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "Beillesztés _páros oldalakként" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "Beillesztés párat_lan oldalakként" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "Beillesztés _alátfedésként…" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "Beillesztés _után" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "Beillesztés _előtt" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "A beillesztett adatok érvénytelenek. A beillesztés megszakadt." #: data/menu.ui:272 msgid "Pre_ferences" msgstr "_Beállítások" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "Beállítások" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "PDF-rendező verzió nyomtatása és kilépés" #: pdfarranger/config.py:267 msgid "Printing" msgstr "" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "Nyomtatás…" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "Gyártó" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "Tulajdonság" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "Sorrend meg_fordítása" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "Viszonylagos" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "Előnézet megjelenítése…" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "Renderelés folyamatban van…" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "Csere" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "Jobbról" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "Jobbról balra" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Forgatás balra" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Forgatás jobbra" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "Forgatás _balra" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Sorok" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "Ugyanaz az oldal_formátum" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Mentés" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Mentés másként…" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "Mentés másként…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Menté_s másként…" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "Menti a módosításokat a bezárás előtt?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "Menti a módosításokat a kilépés előtt?" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "Menti a változásokat a(z) „{}” fájlba bezárás előtt?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "Menti a(z) „{}” módosításait a kilépés előtt?" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "A mentés néhány figyelmeztetést jelentett" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "Mentés…" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "Nagyságrendi tényező" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "_Az összes kijelölése" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "_Páros oldalak kijelölése" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "Párat_lan oldalak kijelölése" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "Kiválasztott oldalak: " #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Oldalak felosztása" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "Tárgy" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "Támogatott képfájlok" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "Rendszerbeállítás" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "A(z) „{}” dokumentum zárolva van és megnyitásához jelszó szükséges." #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "" #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "A jelszó mindaddig emlékezetes marad, amíg bezárja a PDF-rendezőt" #: pdfarranger/config.py:260 msgid "Theme" msgstr "Téma" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "Cím" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "Felülről" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "Fentről lefelé" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "Alátfedés" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "Ismeretlen fájlformátum" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "Érték" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "Függőleges" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Függőleges felosztása" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "Függőleges eltolása" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "Szélesség" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Szélesség százalékként" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "A változtatások elvesznek, ha nem menti őket." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Nagyítás" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Kicsinyítés" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "_Mérethez igazítás" #: data/menu.ui:247 msgid "Zoom _In" msgstr "Na_gyítás" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "Ki_csinyítés" #: data/menu.ui:278 msgid "_About" msgstr "_Névjegy" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "_Mégse" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "_Bezárás" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "_Másolás" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "_Törlés" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "Öss_zes kijelölés törlése" #: data/menu.ui:87 msgid "_Edit" msgstr "S_zerkesztés" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "" #: data/menu.ui:30 msgid "_Import" msgstr "_Importálás…" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "Kijelölés meg_fordítása" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "Oldalak _egyesítése…" #: data/menu.ui:36 msgid "_New Window" msgstr "Új _ablak" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "_Rendben" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "_Megnyitás…" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "" #: data/menu.ui:71 msgid "_Print…" msgstr "_Nyomtatás…" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "_Kilépés" #: data/menu.ui:82 msgid "_Redo" msgstr "Új_ra" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "Forgatás _jobbra" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "_Mentés" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "_Kijelölés" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "Oldalak fel_osztása…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Visszavonás" #: data/menu.ui:244 msgid "_View" msgstr "_Nézet" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "mm" #: pdfarranger/core.py:326 msgid "page" msgstr "oldal" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "névtelen" pdfarranger-1.11.0/po/id.po000066400000000000000000000442451463504064500154570ustar00rootroot00000000000000# Copyright (C) 2021 pdfarranger contributors # Indonesian translation for pdfarranger. # This file is distributed under the same license as the PACKAGE package. # Translators: # Abdul Munif Hanafi , 2019., 2021. # Ryan Faiz Sanie , 2023. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2023-06-08 10:00+0700\n" "Last-Translator: Abdul Munif Hanafi \n" "Language-Team: \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Kolom" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Baris" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "% dari tinggi" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "% dari lebar" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s adalah alat untuk menyusun dan memodifikasi file PDF" #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "(Libhandy tidak ditemukan)" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "(Mulai ulang diperlukan)" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "File dengan nama \"%s\" sudah ada. Apakah Anda ingin menggantinya?" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "Semua dari Berkas yang _Sama" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "Semua File" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "Semua halaman harus memiliki ukuran yang sama" #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "Semua file yang didukung" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "Bawah" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "Bawah ke Atas" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "Gambar papan klip" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Kolom" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "Dibuat" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "Pencipta" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "Alat pencipta" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "Margin Pangkas" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "Potong Tepian Berwarna Putih" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "_Potong" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "Meskipun ada peringatan, dokumen seharusnya tidak memiliki masalah yang " "terlihat." #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "Buang perubahan dan tutup?" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "Buang perubahan dan keluar?" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "Jangan munculkan dialog ini lagi." #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "Ja_ngan Simpan" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "Jangan tampilkan peringatan lagi saat menyimpan. " #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "Gan_dakan" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "E_kspor" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "_Ekspor Terpilih ke Sebuah Berkas Tunggal…" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "Sunting Prop_erti" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "Ubah properti" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Lebar kolom yang sama" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Lebar baris yang sama" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "Ekspor Terpilih ke _Masing-masing Berkas…" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "Ekspor Semu_a Halaman menjadi Masing-masing Berkas…" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "Ekspor…" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "File bukan dalam format pdf ataupun gambar" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "File yang akan dibuka" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "Untuk opsi lebih lanjut, lihat:" #: data/menu.ui:259 msgid "Full_screen" msgstr "Layar_penuh" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "Lisensi Publik Umum GNU (GNU General Public License/GPL) Versi 3." #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "Membuat Buku Saku" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "Tinggi" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Tinggi dalam %" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "Horizontal" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Pemisahan Horizontal." #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "Offset horizontal" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "File gambar hanya didukung dengan img2pdf." #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "File gambar tidak didukung dengan img2pdf" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Impor" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "Impor…" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "Sisipkan Halaman _Kosong…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "Sisipkan Halaman Kosong" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "Format tanggal tidak valid. Input dibatalkan." #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Ini menggunakan libqpdf %s, pikepdf %s, GTK %s, dan Python %s." #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "Kata kunci" #: pdfarranger/config.py:252 msgid "Language" msgstr "Bahasa" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "Kiri" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "Kiri ke Kanan" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Menu Utama" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "Maintainers and contributors" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "Margin" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "Gabungkan Halaman" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "Ukuran halaman yang digabungkan: " #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "Diubah" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "Ukuran halaman yang tidak seragam - menggunakan ukuran maksimum." #: pdfarranger/exporter.py:559 msgid "None" msgstr "" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Buka" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "Buka…" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "" #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger adalah aplikasi Python-GTK kecil yang membantu pengguna untuk " "menggabungkan atau membagi dokumen PDF serta memutar, memotong, dan menyusun " "ulang halaman-halaman PDF menggunakan antarmuka grafis interaktif dan " "intuitif. Ini adalah antarmuka pengguna untuk pikepdf." #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "Dokumen PDF rusak" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "File PDF" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "Susunan Halaman" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "Ukuran Halaman:" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "" #: pdfarranger/core.py:457 msgid "Password" msgstr "Kata Sandi" #: pdfarranger/core.py:435 msgid "Password required" msgstr "Kata Sandi diperlukan" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "Temp_el Spesial" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "Tempel Sebagai O_verlay…" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "Tempel Sebagai Halaman _Genap" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "Tempel Sebagai Halaman _Ganjil" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "Tempel Sebagai _Underlay…" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "Tempel _Setelah" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "Tempel _Sebelum" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "Data yang ditempelkan tidak valid. Membatalkan tempel." #: data/menu.ui:272 msgid "Pre_ferences" msgstr "Pre_ferensi" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "Preferensi" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "Cetak versi PDF Arranger dan keluar" #: pdfarranger/config.py:267 msgid "Printing" msgstr "" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "Mencetak" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "Produsen" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "Properti" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "Ba_likkan Urutan" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "Relatif" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "Pratinjau Rendering…" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "Rendering…" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "Ganti" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "Kanan" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "Kanan ke Kiri" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Rotasi ke Kiri" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Rotasi ke Kanan" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "Rotasi ke _Kiri" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Baris" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "_Format Halaman yang Sama" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Simpan" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Simpan Sebagai" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "Simpan Sebagai…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Simpan _Sebagai…" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "Simpan perubahan sebelum menutup?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "Simpan perubahan sebelum keluar?" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "Simpan perubahan ke “{}” sebelum menutup?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "Simpan perubahan ke “{}” sebelum keluar?" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "Menyimpan dapat menghasilkan beberapa peringatan" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "Menyimpan…" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "Faktor Skala" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "Pilih _Semua" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "Pilih Halaman _Genap" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "Pilih Halaman _Ganjil" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "Halaman yang dipilih: " #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Pisahkan Halaman" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "Subjek" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "File gambar yang didukung" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "Setelan sistem" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "Dokumen “{}” terkunci dan memerlukan password sebelum bisa dibuka." #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "" #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "Password akan diingat sampai Anda menutup PDF Arranger." #: pdfarranger/config.py:260 msgid "Theme" msgstr "Tema" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "Judul" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "Atas" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "Atas ke Bawah" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "Format file tidak dikenali" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "Nilai" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "Vertikal" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Pemisahan Vertikal" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "Offset vertikal" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "Lebar" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Lebar dalam %" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "Perubahan Anda akan hilang jika Anda tidak menyimpannya." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Zoom Perbesar" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Zoom Perkecil" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "_Sesuaikan Zoom" #: data/menu.ui:247 msgid "Zoom _In" msgstr "Zoom _Perbesar" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "Zoom _Perkecil" #: data/menu.ui:278 msgid "_About" msgstr "Tent_ang" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "_Batalkan" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "_Tutup" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "_Salin" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "_Hapus" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "_Batal Pilih Semua" #: data/menu.ui:87 msgid "_Edit" msgstr "_Sunting" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "" #: data/menu.ui:30 msgid "_Import" msgstr "_Impor" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "Pi_lih Sebaliknya" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "_Gabungkan Halaman…" #: data/menu.ui:36 msgid "_New Window" msgstr "Je_ndela Baru" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "_OKE" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "Buk_a" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "" #: data/menu.ui:71 msgid "_Print…" msgstr "_Cetak…" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "Kelua_r" #: data/menu.ui:82 msgid "_Redo" msgstr "_Mengulangi Tindakan Terakhir" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "Putar ke K_anan" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "_Simpan" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "Pili_h" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "Pe_cah Halaman…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Batalkan Tindakan Terakhir" #: data/menu.ui:244 msgid "_View" msgstr "_Lihat" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "mm" #: pdfarranger/core.py:326 msgid "page" msgstr "halaman" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "tanpa judul" pdfarranger-1.11.0/po/is.po000066400000000000000000000440561463504064500154760ustar00rootroot00000000000000# Icelandic translation of PDF Arranger # Copyright (C) 2021 PDF Arranger # This file is distributed under the same license as the pdfarranger package. # # Sveinn í Felli , 2021, 2022, 2023. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2023-06-06 21:50+0000\n" "Last-Translator: Sveinn í Felli \n" "Language-Team: Icelandic\n" "Language: is\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Lokalize 21.12.3\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Dál" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Röð" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s er verkfæri til að endurraða og breyta PDF-skrám." #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "(Libhandy vantar)" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "(krefst endurræsingar)" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "Það er þegar til skrá sem heitir \"%s\". Viltu skipta henni út?" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "Allt úr _sömu skrá" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "Allar skrár" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "Allar síður verða að hafa sömu stærð." #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "Allar studdar skrár" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "Neðst" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "Neðan og upp" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "Mynd á klippispjaldi" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Dálkar" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "Búið til" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "Höfundur" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "Verkfæri fyrir hönnuði" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "Skera utan af spássíum" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "Skera af hvíta jaðra" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "_Klippa" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "Þrátt fyrir aðvaranirnar er skjalið/skölin ekki með nein sýnileg vandamál." #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "Henda breytingum og loka?" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "Henda breytingum og hætta?" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "Ekki sýna þennan glugga aftur." #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "E_kki vista" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "Ekki birta neinar aðvaranir aftur við vistun." #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "Tvíta_ka" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "Fl_ytja út" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "Fl_ytja út valið í eina skrá…" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "_Breyta eiginleikum" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "Breyta eiginleikum" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Jöfn breidd dálka" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Jöfn hæð raða" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "Flyt_ja út valið í stakar skrár…" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "Flytja út _allar síður í stakar skrár…" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "Flytja út…" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "Skráin er hvorki PDF-skrá né mynd" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "Skrá(r) til að opna" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "Fyrir fleiri valkosti skaltu skoða:" #: data/menu.ui:259 msgid "Full_screen" msgstr "_Skjáfylli" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public notkunarleyfið útgáfa 3." #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "Útbúa bækling" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "Hæð" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Hæð í %" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "Lárétt" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Klofið lárétt" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "Lárétt hliðrun" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "Myndskrár eru einungis studdar í gegnum img2pdf" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "Myndskrársnið er ekki stutt af img2pdf" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Flytja inn" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "Flytja inn…" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "Set_ja inn auða síðu…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "Setja inn auða síðu" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "Ógilt dagsetningasnið. Inntaki hent." #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Notar libqpdf %s, pikepdf %s, GTK %s og Python %s." #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "Stikkorð" #: pdfarranger/config.py:252 msgid "Language" msgstr "Tungumál" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "Vinstri" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "Vinstri til hægri" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Aðalvalmynd" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "Höfundar og önnur framlög" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "Spássía" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "Sameina síður" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "Stærð á sameinaðri síðu:" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "Breytt" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "Ekki-einsleit blaðastærð - nota hámarksstærð" #: pdfarranger/exporter.py:559 msgid "None" msgstr "" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Opna" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "Opna..." #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "" #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "Yfirlag" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger er lítið python-gtk forrit, sem hjálpar notandanum að sameina " "eða skipta upp PDF-skjölum, snúa síðum eða skera utan af þeim, allt í " "gagnvirku og auðveldu myndrænu viðmóti. Það er í grunninn aðgangsviðmót " "fyrir pikepdf." #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "PDF-skjal er skemmt" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "PDF-skrár" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "Síðuröð" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "Blaðsíðustærð:" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "" #: pdfarranger/core.py:457 msgid "Password" msgstr "Lykilorð" #: pdfarranger/core.py:435 msgid "Password required" msgstr "Lykilorð nauðsynlegt" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "Sérstök _líming" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "Líma sem _yfirlag…" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "Líma s_em jafntölusíður" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "Líma sem _oddatölusíður" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "Líma sem _undirlag…" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "Lím_a á eftir" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "Lí_ma á undan" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "Límd gögn ekki gild. Hætti við límingu." #: data/menu.ui:272 msgid "Pre_ferences" msgstr "K_jörstillingar" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "Kjörstillingar" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "Birta upplýsingar um PDF Arranger og hætta" #: pdfarranger/config.py:267 msgid "Printing" msgstr "" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "Prenta..." #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "Framleiðandi" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "Eiginleiki" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "Öfu_g röð" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "Hlutfallslegt" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "Myndgeri forskoðun…" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "Myndgeri…" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "Skipta út" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "Hægri" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "Hægri til vinstri" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Snúa til vinstri" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Snúa til hægri" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "Snúa til _vinstri" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Raðir" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "Sama _blaðsíðusnið" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Vista" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Vista sem" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "Vista sem…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Vist_a sem..." #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "Vista breytingar áður en lokað er?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "Vista breytingar áður en þú hættir?" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "Vista breytingar á '{}' áður en lokað er?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "Vista breytingar á '{}' áður en þú hættir?" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "Vistun gaf einhverjar aðvaranir" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "Vista…" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "Kvörðunargildi" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "Velja _allt" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "V_elja jafntölusíður" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "Velja _oddatölusíður" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "Valdar síður:" #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Kljúfa síður" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "Viðfangsefni" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "Studdar myndskrár" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "Kerfisstilling" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "Skjalið “{}” er læst, til að opna það þarf lykilorð." #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "" #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "Lykilorðið er geymt þar til þú lokar PDF Arranger." #: pdfarranger/config.py:260 msgid "Theme" msgstr "Þema" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "Titill" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "Efst" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "Ofan og niður" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "Undirlag" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "Óþekkt skráarsnið" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "Gildi" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "Lóðrétt" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Klofið lóðrétt" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "Lóðrétt hliðrun" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "Breidd" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Breidd í %" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "Breytingarnar þínar tapast ef þú vistar þær ekki." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Renna að" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Renna frá" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "Aðdráttur svo _passi" #: data/menu.ui:247 msgid "Zoom _In" msgstr "Renna _að" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "Renna _frá" #: data/menu.ui:278 msgid "_About" msgstr "_Um hugbúnaðinn" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "_Hætta við" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "_Loka" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "A_frita" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "_Eyða" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "A_fvelja allt" #: data/menu.ui:87 msgid "_Edit" msgstr "Br_eyta" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "" #: data/menu.ui:30 msgid "_Import" msgstr "Flytja _inn" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "Snúa vali v_ið" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "Sa_meina síður…" #: data/menu.ui:36 msgid "_New Window" msgstr "_Nýr gluggi" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "Í _lagi" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "_Opna" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "" #: data/menu.ui:71 msgid "_Print…" msgstr "_Prenta…" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "_Hætta" #: data/menu.ui:82 msgid "_Redo" msgstr "Endu_rtaka" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "Snúa til _hægri" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "Vi_sta" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "_Velja" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "_Kljúfa síður…" #: data/menu.ui:78 msgid "_Undo" msgstr "Aft_urkalla" #: data/menu.ui:244 msgid "_View" msgstr "S_koða" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "mm" #: pdfarranger/core.py:326 msgid "page" msgstr "síða" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "ónefnt" pdfarranger-1.11.0/po/it.po000066400000000000000000000456251463504064500155020ustar00rootroot00000000000000# Italian translation of pdfarranger # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the pdfarranger package. # # SPDX-FileCopyrightText: 2022, 2023, 2024 Massimo Pissarello msgid "" msgstr "" "Project-Id-Version: pdfarranger master\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2024-02-26 12:02+0100\n" "Last-Translator: Massimo Pissarello \n" "Language-Team: Italian <>\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 23.08.4\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Col" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Riga" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "% in altezza" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "% in larghezza" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s è uno strumento per riorganizzare e modificare i file PDF." #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "(Libhandy mancante)" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "(Richiede riavvio)" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "Esiste già un file denominato \"%s\". Vuoi sostituirlo?" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "Tutto dallo _stesso file" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "Tutti i file" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "Tutte le pagine devono avere le stesse dimensioni." #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "Tutti i file supportati" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "Rotazione automatica" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "Basso" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "Dal basso verso l'alto" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "Immagine appunti" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Colonne" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "Copia _immagine" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "Copia _testo" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "Creato il" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "Autore" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "Applicazione" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "Ritaglia margini" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "Ritaglia bordi bianchi" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" "Ritaglia o Nascondi non rimuove alcun contenuto dal file PDF, lo nasconde " "solo." #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "_Taglia" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "Nonostante gli avvertimenti, i documenti non dovrebbero avere problemi " "visibili." #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "Scartare le modifiche e chiudere?" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "Annullare le modifiche e uscire?" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "Non mostrare più questo messaggio." #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "No_n salvare" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "Non mostrare avvertimenti quando salvi di nuovo." #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "Dupl_ica" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "E_sporta" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "Es_porta selezione su un singolo file..." #: data/menu.ui:266 msgid "Edit _Properties" msgstr "Modifica _proprietà" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "Modifica proprietà" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Uguale larghezza della colonna" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Uguale altezza della riga" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "Conversione in immagini..." #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "Esporta selezione _in singoli file..." #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "Esporta _tutte le pagine in singoli file..." #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "Esporta…" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "Il file non è un pdf o una immagine" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "File da aprire" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "Adatta a pagina intera" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "Adatta all'area stampabile" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "Per maggiori informazioni vedi" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "Per ulteriori opzioni vedi:" #: data/menu.ui:259 msgid "Full_screen" msgstr "Schermo _intero" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL) Version 3." #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "Genera libretto" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "Altezza" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Altezza in %" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "Nascondi margini" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "Orizzontale" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Divisioni orizzontali" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "Spostamento orizzontale" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "I file di immagine sono supportati solo con img2pdf" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "Il formato dell'immagine non è supportato da img2pdf" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "Img2pdf mancante." #: data/pdfarranger.ui:58 msgid "Import" msgstr "Importa" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "Importa…" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "Inserisci pagina _vuota…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "Inserisci pagina vuota" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "Formato data non valido. Input scartato." #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Utilizza libqpdf %s, pikepdf %s, GTK %s e Python %s." #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "Parole chiave" #: pdfarranger/config.py:252 msgid "Language" msgstr "Lingua" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "Sinistra" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "Da sinistra a destra" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Menu principale" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "Manutentori e collaboratori" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "Margine" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "Unisci pagine" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "Dimensione pagine unite:" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "Modificato" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "" "Dimensioni della pagina non uniformi: utilizzo della dimensione massima" #: pdfarranger/exporter.py:559 msgid "None" msgstr "Nessuno" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "Nota" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "Tieni presente le limitazioni:" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Apri" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "Apri…" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "Contorni e collegamenti possono essere conservati solo in alcuni casi." #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "Sovrapposto" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger è una piccola applicazione python-gtk che aiuta l'utente a " "unire o dividere documenti pdf e a ruotare, ritagliare e riordinare le loro " "pagine utilizzando un'interattiva interfaccia grafica intuitiva È un " "frontend per pikepdf." #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "Il documento PDF è danneggiato" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "File PDF" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "Gestione pagine" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "Ordine pagine" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "Dimensioni pagina:" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "Dimensioni pagina" #: pdfarranger/core.py:457 msgid "Password" msgstr "Password" #: pdfarranger/core.py:435 msgid "Password required" msgstr "Password richiesta" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "Incolla sp_eciale" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "Incolla come so_vrapposto..." #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "Incolla come pagine _pari" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "Incolla come pagine _dispari" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "Incolla come so_ttoposto..." #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "Incolla d_opo" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "Incolla pri_ma" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "Dati incollati non validi. Incolla annullato." #: data/menu.ui:272 msgid "Pre_ferences" msgstr "Pre_ferenze" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "Preferenze" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "Stampa la versione di PDF Arranger ed esci" #: pdfarranger/config.py:267 msgid "Printing" msgstr "Stampa" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "Stampa…" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "Produttore" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "Proprietà" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "In_verti ordine" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "Relativa" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "Anteprima di rendering..." #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "Rendering…" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "Sostituisci" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "Destra" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "Da destra a sinistra" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Ruota a sinistra" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Ruota a destra" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "Ruota a _sinistra" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Righe" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "Stesso _formato di pagina" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Salva" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Salva come" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "Salva come…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Salva _come…" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "Salvare le modifiche prima di chiudere?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "Salvare le modifiche prima di uscire?" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "Salvare le modifiche in \"{}\" prima della chiusura?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "Salvare le modifiche in \"{}\" prima di uscire? " #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "Il salvataggio ha prodotto alcuni avvertimenti" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "Salvataggio…" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "Ridimensionamento" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "Modalità scala:" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "Seleziona _tutto" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "Seleziona pagine _pari" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "Seleziona pagine _dispari" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "Pagine selezionate: " #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "Mostra valori" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Dividi pagine" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "Oggetto" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "File di immagine supportati" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "Impostazioni di sistema" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "" "Il documento “{}” è bloccato e richiede una password prima di poter essere " "aperto." #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "La pagina ha diverse immagini. Usa prima \"Converti in immagini\"." #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "La password verrà ricordata fino alla chiusura di PDF Arranger." #: pdfarranger/config.py:260 msgid "Theme" msgstr "Tema" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "Titolo" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "Alto" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "Dall'alto al basso" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "Sottoposto" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "Formato file sconosciuto" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "Manuale d'uso" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "Valore" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "Verticale" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Divisioni verticali" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "Spostamento verticale" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "Larghezza" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Larghezza in %" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "Le modifiche andranno perse se non le salvi." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Zoom avanti" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Zoom indietro" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "Zoom ada_ttivo" #: data/menu.ui:247 msgid "Zoom _In" msgstr "Zoom _avanti" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "Zoom _indietro" #: data/menu.ui:278 msgid "_About" msgstr "_Informazioni su" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "_Applica" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "_Annulla" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "_Chiudi" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "_Copia" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "_Ritaglia margini..." #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "_Elimina" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "_Deseleziona tutto" #: data/menu.ui:87 msgid "_Edit" msgstr "_Modifica" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "_Converti in immagini" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "_Estrai" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "_Nascondi margini…" #: data/menu.ui:30 msgid "_Import" msgstr "_Importa" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "_Inverti selezione" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "_Unisci pagine..." #: data/menu.ui:36 msgid "_New Window" msgstr "_Nuova finestra" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "_OK" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "_Apri" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "_Dimensioni pagina…" #: data/menu.ui:71 msgid "_Print…" msgstr "_Stampa…" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "_Esci" #: data/menu.ui:82 msgid "_Redo" msgstr "_Rifai" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "_Ripristina" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "_Ruota a destra" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "_Salva" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "_Seleziona" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "_Dividi pagine…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Annulla" #: data/menu.ui:244 msgid "_View" msgstr "_Visualizza" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "mm" #: pdfarranger/core.py:326 msgid "page" msgstr "pagina" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "senza titolo" pdfarranger-1.11.0/po/ja.po000066400000000000000000000445501463504064500154540ustar00rootroot00000000000000# Japanese translation for pdfarranger. # Copyright (C) 2008-2017 Konstantinos Poulios # Copyright (C) 2018-2022 pdfarranger's COPYRIGHT HOLDER # This file is distributed under the same license as the pdfarranger package. # Toshiharu Kudoh , 2010. # sicklylife , 2019-2022. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2022-09-01 00:40+0900\n" "Last-Translator: sicklylife \n" "Language-Team: Japanese\n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#列" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#行" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "% (高さ)" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "% (幅)" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "" "%s は PDF ファイルの内容の追加や削除、順序の入れ替えやその他のちょっとした変" "更を行うためのツールです。" #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "同じファイルのページ(_S)" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "すべてのファイル" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "すべてのページが同じサイズである必要があります。" #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "サポートしているすべてのファイル" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "下" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "クリップボードの画像" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "列" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "作成日時" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "作成" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "作成ツール" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "余白のトリミング" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "白枠をトリミング" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "切り取り(_T)" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "警告はありましたが見た目に問題はないはずです。" #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "変更内容を破棄して閉じますか?" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "変更内容を破棄して終了しますか?" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "今後このダイアログを表示しない" #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "保存しない(_N)" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "" #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "複製(_I)" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "エクスポート(_X)" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "選択したものを単一のファイルにエクスポート(_X)…" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "プロパティを編集(_P)" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "プロパティを編集" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "幅を均等にする" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "高さを均等にする" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "選択したものを個別のファイルにエクスポート(_I)…" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "すべてのページを個別のファイルにエクスポート(_A)…" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "エクスポート…" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "ファイルが PDF でも画像でもありません" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "開くファイル" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "" #: data/menu.ui:259 msgid "Full_screen" msgstr "フルスクリーン(_S)" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL) Version 3." #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "ブックレットを生成" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "高さ" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "高さ (%)" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "水平分割" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "画像ファイルは img2pdf でのみサポートしています" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "img2pdf がサポートしていない画像形式です" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "" #: data/pdfarranger.ui:58 msgid "Import" msgstr "" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "インポート…" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "空白ページを挿入(_K)…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "空白ページを挿入" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "日付の書式が正しくありません。破棄します。" #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "libqpdf %s、pikepdf %s、GTK %s、Python %s を使用しています。" #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "キーワード" #: pdfarranger/config.py:252 msgid "Language" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "左" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "メインメニュー" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "メンテナーと貢献者" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "更新日時" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "" #: pdfarranger/exporter.py:559 msgid "None" msgstr "" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "開く" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "開く…" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "" #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger は対話的かつ直感的なグラフィカルインターフェイスで PDF の分割や" "結合、ページの回転・トリミング・入れ替えを行うことができる、pikepdf のフロン" "トエンドとして動作する小さな python-gtk アプリケーションです。" #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "PDF 文書が破損しています" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "PDF ファイル" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "ページサイズ:" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "" #: pdfarranger/core.py:457 msgid "Password" msgstr "パスワード" #: pdfarranger/core.py:435 msgid "Password required" msgstr "パスワードが必要です" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "特殊貼り付け(_E)" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "偶数ページとして貼り付け(_E)" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "奇数ページとして貼り付け(_O)" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "後に貼り付け(_A)" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "前に貼り付け(_B)" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "不正なデータが貼り付けられました。貼り付けを中止します。" #: data/menu.ui:272 msgid "Pre_ferences" msgstr "" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "PDF Arranger のバージョンを表示して終了する" #: pdfarranger/config.py:267 msgid "Printing" msgstr "" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "変換" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "プロパティ" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "逆順(_V)" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "比率" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "描画中…" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "右" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "左に回転" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "右に回転" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "左に回転(_L)" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "行" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "同じページフォーマット(_F)" #: data/pdfarranger.ui:78 msgid "Save" msgstr "保存" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "名前を付けて保存" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "" #: data/menu.ui:47 msgid "Save _As…" msgstr "名前を付けて保存(_A)…" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "閉じる前に変更内容を保存しますか?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "閉じる前に変更内容を“{}”に保存しますか?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "保存時にいくつかの警告がありました" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "保存中…" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "倍率" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "すべて選択(_A)" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "偶数ページを選択(_E)" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "奇数ページを選択(_O)" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "選択したページ: " #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "ページを分割" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "サブタイトル" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "サポートしている画像ファイル" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "ロックされているドキュメント“{}”を開くにはパスワードが必要です。" #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "" #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "パスワードは PDF Arranger を閉じるまで記憶されます。" #: pdfarranger/config.py:260 msgid "Theme" msgstr "" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "タイトル" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "上" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "不明なファイル形式です" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "値" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "垂直分割" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "幅" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "幅 (%)" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "保存しないと変更内容は失われます。" #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "拡大" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "縮小" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "" #: data/menu.ui:247 msgid "Zoom _In" msgstr "拡大(_I)" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "縮小(_O)" #: data/menu.ui:278 msgid "_About" msgstr "情報(_A)" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "キャンセル(_C)" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "閉じる(_C)" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "コピー(_C)" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "削除(_D)" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "すべて選択解除(_D)" #: data/menu.ui:87 msgid "_Edit" msgstr "編集(_E)" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "" #: data/menu.ui:30 msgid "_Import" msgstr "インポート(_I)" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "選択を反転(_I)" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "" #: data/menu.ui:36 msgid "_New Window" msgstr "新しいウィンドウ(_N)" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "開く(_O)" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "" #: data/menu.ui:71 msgid "_Print…" msgstr "印刷(_P)…" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "終了(_Q)" #: data/menu.ui:82 msgid "_Redo" msgstr "やり直す(_R)" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "右に回転(_R)" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "保存(_S)" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "選択(_S)" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "ページを分割(_S)…" #: data/menu.ui:78 msgid "_Undo" msgstr "元に戻す(_U)" #: data/menu.ui:244 msgid "_View" msgstr "表示(_V)" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "mm" #: pdfarranger/core.py:326 msgid "page" msgstr "ページ" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "タイトルなし" pdfarranger-1.11.0/po/ko.po000066400000000000000000000432521463504064500154710ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2021-11-26 15:38+0900\n" "Last-Translator: \n" "Language-Team: \n" "Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.0\n" "Plural-Forms: nplurals=1; plural=0;\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Col" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Row" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s는 PDF 파일을 재정렬하거나 수정하는 도구입니다." #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "같은 파일에서 선택(_S)" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "모든 파일" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "모든 페이지는 같은 크기이여야만 합니다." #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "지원하는 모든 파일" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "아래" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "클립보드 이미지" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "행" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "만든 날짜" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "만든이" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "만든 도구" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "차이 잘라내기" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "흰 테두리 잘라내기" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "잘라내기(_T)" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "변경 사항을 저장하지 않고 닫으시겠습니까?" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "변경 사항을 저장하지 않고 종료하시겠습니까?" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "이 대화상자를 다시 표시하지 않습니다." #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "저장 안 함(_N)" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "" #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "복제(_I)" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "내보내기(_X)" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "선택된 내용들을 하나의 파일로 내보내기…(_X)" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "정보 편집(_E)" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "정보 편집" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "행 너비 맞추기" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "열 높이 맞추기" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "선택된 내용들을 개별의 파일로 내보내기…(_I)" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "모든 페이지를 개별의 파일로 내보내기…(_A)" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "내보내기…" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "PDF 및 그림 파일이 아닙니다" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "파일 선택" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "" #: data/menu.ui:259 msgid "Full_screen" msgstr "전체 화면(_S)" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL) 버전 3을 사용합니다." #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "북클렛 만들기" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "높이" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "높이(%)" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "가로로 나누기" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "이미지 파일은 img2pdf만 지원합니다" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "해당 이미지 형식은 img2pdf에서 지원하지 않습니다" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "" #: data/pdfarranger.ui:58 msgid "Import" msgstr "" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "불러오기…" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "빈 페이지 삽입(_K)…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "빈 페이지 삽입" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "잘못된 날짜 형식입니다." #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "" #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "검색어" #: pdfarranger/config.py:252 msgid "Language" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "왼쪽" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "메인 메뉴" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "만든 사람과 기여자" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "수정 날짜" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "" #: pdfarranger/exporter.py:559 msgid "None" msgstr "" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "열기" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "열기…" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "" #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF 편집기는 사용자가 PDF 문서를 합치거나 나누고 페이지를 재정렬할 수 있는 다" "기능 그래픽 인터페이스를 사용하는 간단한 python-gtk 프로그램입니다." #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "PDF 문서가 손상되었습니다" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "PDF 파일" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "페이지 크기:" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "" #: pdfarranger/core.py:457 msgid "Password" msgstr "비밀번호" #: pdfarranger/core.py:435 msgid "Password required" msgstr "비밀번호 필요" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "다른 방식으로 붙여놓기(_E)" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "짝수 페이지마다 붙여넣기(_E)" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "홀수 페이지마다 붙여넣기(_O)" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "뒤 페이지에 붙여넣기(_A)" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "앞 페이지에 붙여넣기(_B)" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "붙여넣은 데이터가 잘못되었습니다." #: data/menu.ui:272 msgid "Pre_ferences" msgstr "" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "PDF 편집기의 버전을 출력한 후 닫기" #: pdfarranger/config.py:267 msgid "Printing" msgstr "" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "글쓴이" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "우선도" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "순서 바꾸기(_V)" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "렌더링 중…" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "오른쪽" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "왼쪽으로 회전" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "오른쪽으로 회전" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "왼쪽으로 회전(_L)" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "열" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "같은 페이지 형식(_F)" #: data/pdfarranger.ui:78 msgid "Save" msgstr "저장" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "다른 이름으로 저장" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "" #: data/menu.ui:47 msgid "Save _As…" msgstr "다른 이름으로 저장…(_A)" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "닫기 전에 펀집한 사항을 저장하시겠습니까?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "닫기 전에 \"{}\"을 편집한 사항을 저장하시겠습니까?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "만들어진 몇몇 경고를 포함하여 저장하는 중" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "저장 중…" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "확대 상수" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "모두 선택(_A)" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "짝수 페이지만 선택(_E)" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "홀수 페이지만 선택(_O)" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "선택된 페이지: " #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "페이지 나누기" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "주제" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "지원하는 이미지 파일" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "보호된 문서인 \"{}\"(을)를 열기 전에 비밀번호를 입력해야 합니다." #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "" #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "PDF 편집기를 닫기 전까지 비밀번호를 기억합니다." #: pdfarranger/config.py:260 msgid "Theme" msgstr "" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "제목" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "위" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "알 수 없는 형식" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "값" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "세로로 나누기" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "너비" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "너비(%)" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "저장하지 않으면 편집한 사항을 잃게 됩니다." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "확대" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "축소" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "" #: data/menu.ui:247 msgid "Zoom _In" msgstr "확대(_I)" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "축소(_O)" #: data/menu.ui:278 msgid "_About" msgstr "정보(_A)" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "취소(_C)" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "닫기(_C)" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "복사(_C)" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "삭제(_D)" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "모두 선택 해제(_D)" #: data/menu.ui:87 msgid "_Edit" msgstr "편집(_E)" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "" #: data/menu.ui:30 msgid "_Import" msgstr "불러오기(_I)" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "선택 반전(_I)" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "" #: data/menu.ui:36 msgid "_New Window" msgstr "새 창(_N)" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "열기(O)" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "" #: data/menu.ui:71 msgid "_Print…" msgstr "인쇄…(_P)" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "종료(_Q)" #: data/menu.ui:82 msgid "_Redo" msgstr "다시 실행(_R)" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "오른쪽으로 회전(_R)" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "저장(_S)" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "선택(_S)" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "페이지 나누기(_S)…" #: data/menu.ui:78 msgid "_Undo" msgstr "실행 취소(_U)" #: data/menu.ui:244 msgid "_View" msgstr "보기(_V)" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "mm" #: pdfarranger/core.py:326 msgid "page" msgstr "페이지" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "제목 없음" pdfarranger-1.11.0/po/nl.po000066400000000000000000000451111463504064500154650ustar00rootroot00000000000000# PDF-Shuffler translation files. # Copyright (C) 2008-2017 Konstantinos Poulios # This file is part of PDF-Shuffler which is released under the GNU General # Public License version 3 or later. # See file COPYING or go to for full license details. # Translators: # Heimen Stoffels , 2016, 2022. # Thomas De Rocker, 2011. msgid "" msgstr "" "Project-Id-Version: PDF-Shuffler 0.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2023-06-11 14:36+0200\n" "Last-Translator: Heimen Stoffels \n" "Language-Team: Dutch\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.3.1\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Kol." #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Rij" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "" "%s is een hulpprogramma voor het herordenen en bewerken van pdf-bestanden." #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "(Libhandy ontbreekt)" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "(herstart vereist)" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "Er is al een bestand genaamd “%s”. Wilt u dit vervangen?" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "Alles uit _hetzelfde bestand" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "Alle bestanden" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "Alle pagina's dienen even groot te zijn." #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "Alle ondersteunde bestanden" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "Onder" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "Van onder naar boven" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "Klembordafbeelding" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Kolommen" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "Gemaakt op" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "Maker" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "Gemaakt met" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "Marges bijsnijden" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "Witte randen bijsnijden" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "_Knippen" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "Ondanks de waarschuwingen, zou het bestand/de bestanden geen zichtbare " "problemen moet(en) vertonen." #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "Wilt u de aanpassingen negeren en sluiten?" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "Wilt u de aanpassingen negeren en afsluiten?" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "Niet meer tonen" #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "_Niet opslaan" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "Niet meer tonen" #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "Dupl_iceren" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "E_xporteren" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "Selectie _exporteren naar bestand…" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "Eigenschappen bewerken" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "Eigenschappen bewerken" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Gelijke kolombreedtes" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Gelijke rijhoogten" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "Selectie exporteren naar _meerdere bestanden…" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "_Alle pagina's exporteren naar meerdere bestanden…" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "Exporteren…" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "Het bestand is geen pdf of afbeelding" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "Te openen bestand(en)" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "Ga voor meer opties naar:" #: data/menu.ui:259 msgid "Full_screen" msgstr "_Schermvullende weergave" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL), versie 3." #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "Boekje samenstellen" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "Hoogte" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Hoogte, in %" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "Horizontaal" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Horizontale splitsingen" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "Horizontale verschuiving" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "Afbeeldingsbestanden kunnen alleen worden gebruikt met img2pdf" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "Dit afbeeldingsbestand wordt niet ondersteund door img2pdf" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Importeren" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "Importeren…" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "Blan_co pagina invoegen…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "Blanco pagina invoegen" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "Ongeldige datumopmaak - de inhoud is verworpen." #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "" "Het programma maakt gebruik van libqpdf %s, pikepdf %s, GTK %s en Python %s." #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "Trefwoorden" #: pdfarranger/config.py:252 msgid "Language" msgstr "Taal" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "Links" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "Van links naar rechts" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Hoofdmenu" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "Onderhouders en bijdragers" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "Marge" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "Pagina's samenvoegen" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "Samengevoegde paginagrootte:" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "Aangepast op" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "Inconsistente paginagrootte - de max. grootte wordt gebruikt" #: pdfarranger/exporter.py:559 msgid "None" msgstr "" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Openen" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "Openen…" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "" #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "Bovenste laag" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger is een eenvoudig hulpprogramma voor het herordenen en bewerken " "van pdf-bestanden, gemaakt met python-gtk. Pagina's kunnen worden " "samengevoegd, herordend en bijgesneden. Ook kunnen documenten worden " "gesplitst. PDF Arranger is een frontend voor pikepdf." #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "Het pdf-bestand is beschadigd" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "PDF-bestanden" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "Paginavolgorde" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "Paginagrootte:" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "" #: pdfarranger/core.py:457 msgid "Password" msgstr "Wachtwoord" #: pdfarranger/core.py:435 msgid "Password required" msgstr "Wachtwoord vereist" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "Sp_eciaal plakken" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "Plakken als b_ovenste laag…" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "Plakken als _even pagina's" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "Plakken als _oneven pagina's" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "Plakken als on_derste laag…" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "Plakken _na" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "Plakken _vóór" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "De geplakte gegevens zijn ongeldig - het plakken wordt afgebroken." #: data/menu.ui:272 msgid "Pre_ferences" msgstr "_Voorkeuren" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "Voorkeuren" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "Toon het versienummer en sluit af" #: pdfarranger/config.py:267 msgid "Printing" msgstr "" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "Bezig met afdrukken…" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "Producent" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "Eigenschap" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "Omgekeerde _volgorde" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "Relatief" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "Bezig met maken van voorvertoning…" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "Bezig met samenstellen…" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "Vervangen" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "Rechts" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "Van rechts naar links" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Naar links draaien" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Naar rechts draaien" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "Naar _links draaien" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Rijen" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "Hetzelfde pagina_formaat" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Opslaan" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Opslaan als" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "Opslaan als…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Opslaan _als…" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "Aanpassingen opslaan voor afsluiten?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "Aanpassingen opslaan voor afsluiten?" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "Wilt u de aanpassingen aan ‘{}’ opslaan alvorens af te sluiten?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "Wilt u de aanpassingen aan ‘{}’ opslaan alvorens af te sluiten?" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "Waarschuwingen tijdens opslaan" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "Bezig met opslaan…" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "Vergrotingsfactor" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "_Alles selecteren" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "_Even pagina's selecteren" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "_Oneven pagina's selecteren" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "Geselecteerde pagina': " #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Pagina's splitsen" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "Onderwerp" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "Ondersteunde afbeeldingsbestanden" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "Systeemvoorkeur" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "“{}” is beveiligd en kan alleen worden geopend met een wachtwoord." #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "" #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "PDF Arranger bewaart het wachtwoord totdat u afsluit." #: pdfarranger/config.py:260 msgid "Theme" msgstr "Thema" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "Naam" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "Boven" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "Van boven naar onder" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "Onderste laag" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "Onbekend bestandstype" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "Waarde" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "Verticaal" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Verticale splitsingen" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "Verticale verschuiving" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "Breedte" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Breedte, in %" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "Als u dat niet doet, gaan ze definitief verloren." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Inzoomen" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Uitzoomen" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "In_passen" #: data/menu.ui:247 msgid "Zoom _In" msgstr "_Inzoomen" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "_Uitzoomen" #: data/menu.ui:278 msgid "_About" msgstr "_Over" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "_Annuleren" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "_Sluiten" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "_Kopiëren" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "_Verwijderen" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "_Niets selecteren" #: data/menu.ui:87 msgid "_Edit" msgstr "_Bewerken" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "" #: data/menu.ui:30 msgid "_Import" msgstr "_Importeren" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "Selectie _omkeren" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "Pagina's sa_menvoegen…" #: data/menu.ui:36 msgid "_New Window" msgstr "_Nieuw venster" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "_Oké" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "_Openen" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "" #: data/menu.ui:71 msgid "_Print…" msgstr "Afdrukken…" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "_Afsluiten" #: data/menu.ui:82 msgid "_Redo" msgstr "Opnieu_w uitvoeren" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "Naar rechts _draaien" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "Op_slaan" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "_Selecteren" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "Pagina's _splitsen…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Ongedaan maken" #: data/menu.ui:244 msgid "_View" msgstr "_Beeld" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "mm" #: pdfarranger/core.py:326 msgid "page" msgstr "pagina" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "naamloos" pdfarranger-1.11.0/po/oc.po000066400000000000000000000447051463504064500154650ustar00rootroot00000000000000# Occitan translation file # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Quentin PAGÈS, 2023. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2023-05-19 09:47+0200\n" "Last-Translator: Quentin PAGÈS\n" "Language-Team: \n" "Language: oc\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 3.3.1\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Col" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Linha" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "% de la nautor" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "% de la largor" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s es una aisina per reorganizar e modificar los fichièrs PDF." #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "(Libhandy mancanta)" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "(Reaviada necessària)" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "Un fichièr nomenat « %s » existís ja. Lo volètz remplaçar ?" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "Totas del _meteis fichièr" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "Totes los fichièrs" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "Totes las paginas devon aver la meteissa talha." #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "Totes los fichièrs preses en carga" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "En bas" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "D'aval cap amont" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "Imatge del quichapapièr" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Colomnas" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "Creacion" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "Creator" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "Logicial de creacion" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "Talhar los marges" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "Talhar las bordaduras blancas" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "_Copar" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "En defòra dels avertiments lo(s) document(s) deurián pas aver de problèmas " "visibles." #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "Abandonar las modificacion e tampar ?" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "Abandonar las modificacions e quitar ?" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "Afichar pas mai aquesta fenèstra." #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "E_nregistrar pas" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "Mostrar pas mai d’avertiments en enregistrant." #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "Dupl_icar" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "E_xportar" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "E_xportar la seleccion dins un unic fichièr…" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "Modificar las _proprietats" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "Modificar las proprietats" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Egal a la largor de colomna" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Egal a la nautor de la linha" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "Exportar la seleccion dins de fichièrs _individuals…" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "Exportar _totas las paginas dins de fichièrs _individuals…" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "Exportar…" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "Lo fichièr es pas un pdf nimai un imatge" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "Fichièr(s) de dobrir" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "Per mai d’opcions vejatz :" #: data/menu.ui:259 msgid "Full_screen" msgstr "Ecran _complèt" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "Licéncia publica generala GNU (GPL) version 3." #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "Generar lo Booklet" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "Nautor" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Nautor en %" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "Orizontal" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Partison orizontal" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "Descalatge orizontal" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "Los fichièrs imatge son solament preses en carga amb img2pdf" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "Lo format d’imatge pas pres en carga per img2pdf" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Importar" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "Importacion…" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "Inserir una pagina _voida…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "Inserir una pagina voida" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "Format de data invalid. Entrada ignorada." #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Utiliza libqpdf %s, pikepdf %s, GTK %s e Python %s." #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "Mots clau" #: pdfarranger/config.py:252 msgid "Language" msgstr "Lenga " #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "Esquèrra" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "D’esquèrra a drecha" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Menú principal" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "Manteneires e contributors" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "Marge" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "Marge de las paginas" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "Talha de las paginas amb marge :" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "Modificacion" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "Talha de pagina non unifòrma - utilizacion de la talha max" #: pdfarranger/exporter.py:559 msgid "None" msgstr "" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Dobrir" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "Dobrir…" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "" #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "Superposicion" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger es una pichona aplicacion python-gtk qu’ajuda l’utilizaire a " "fusionar o copar de documents pdf e tanben los virar, talhar e reorganizar " "en utilizant una interfàcia interactiva e intuitiva. Es un frontend per " "pikepdf." #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "Lo document PDF es damatjat" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "Fichièrs PDF" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "Òrdre de las paginas" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "Talha de la pagina :" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "" #: pdfarranger/core.py:457 msgid "Password" msgstr "Senhal" #: pdfarranger/core.py:435 msgid "Password required" msgstr "Senhal requesit" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "Emp_egament especial" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "Pegar coma s_uperposicion…" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "Pegar coma paginas _paras" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "Pegar coma paginas _imparas" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "Pegar coma j_os jaç…" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "Pegar _aprèp" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "Pegar _avant" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "Donadas pegadas invalidas. Abandon de l’empegament." #: data/menu.ui:272 msgid "Pre_ferences" msgstr "Pre_feréncias" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "Preferéncias" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "Afichar la version de PDF Arranger e quitar" #: pdfarranger/config.py:267 msgid "Printing" msgstr "" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "Impression…" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "Productor" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "Proprietat" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "In_versar l'òrdre" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "Relativa" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "Generacion de l’apercebut…" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "Rendut en cors…" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "Remplaçar" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "Drecha" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "De drecha a esquèrra" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Pivotar cap a esquèrra" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Pivotar cap a drecha" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "Pivotar cap a es_quèrra" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Linhas" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "Meteis _format de pagina" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Enregistrar" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Enregistrar jos" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "Enregistrar jos…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Enregistrar _jos…" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "Enregistrar las modificacions abans de tampar ?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "Enregistrar las modificacions abans de tampar ?" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "Enregistrar las modificacions de « {} » abans de tampar ?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "Enregistrar las modificacions de « {} » abans de tampar ?" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "L’enregistrament a portat d’unes avertiments" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "Enregistrament…" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "Factor d'escala" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "_Tot seleccionar" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "Seleccionar las paginas _paras" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "Seleccionar las paginas _imparas" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "Paginas seleccionadas : " #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Devesir paginas" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "Subjècte" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "Fichièrs imatge preses en carga" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "Paramètres sistèma" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "Lo document « {} » es verrolhat e requerís un senhal per se dobrir." #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "" #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "S’enregistrarà lo senhal fins que tampetz PDF Arranger." #: pdfarranger/config.py:260 msgid "Theme" msgstr "Tèma" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "Títol" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "Ennaut" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "D'amont cap aval" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "Jos jaç" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "Format de fichièr desconegut" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "Valor" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "Vertical" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Partison vertical" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "Descalatge vertical" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "Largor" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Largor en %" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "Vòstras modificacions seràn perdudas se las enregistratz pas." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Agrandir" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Redusir" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "_Adaptar" #: data/menu.ui:247 msgid "Zoom _In" msgstr "Agran_dir" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "_Reduire" #: data/menu.ui:278 msgid "_About" msgstr "_A prepaus" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "_Anullar" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "_Tampar" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "_Copiar" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "_Suprimir" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "_Tot deseleccionar" #: data/menu.ui:87 msgid "_Edit" msgstr "_Editar" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "" #: data/menu.ui:30 msgid "_Import" msgstr "_Importar" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "_Inversar la seleccion" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "_Marge de las paginas…" #: data/menu.ui:36 msgid "_New Window" msgstr "Fenèstra _novèla" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "_D'acòrdi" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "_Dobrir" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "" #: data/menu.ui:71 msgid "_Print…" msgstr "_Imprimir…" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "_Quitar" #: data/menu.ui:82 msgid "_Redo" msgstr "_Restablir" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "Pivotar cap a _drecha" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "_Enregistrar" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "_Seleccionar" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "_Devesir las paginas…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Desfar" #: data/menu.ui:244 msgid "_View" msgstr "_Afichatge" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "mm" #: pdfarranger/core.py:326 msgid "page" msgstr "pagina" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "sens títol" pdfarranger-1.11.0/po/pdfarranger.pot000066400000000000000000000352671463504064500175460ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "" #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "" #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "" #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "" #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "" #: data/menu.ui:259 msgid "Full_screen" msgstr "" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "" #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "" #: data/pdfarranger.ui:58 msgid "Import" msgstr "" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "" #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "" #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "" #: pdfarranger/config.py:252 msgid "Language" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "" #: pdfarranger/exporter.py:559 msgid "None" msgstr "" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "" #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "" #: pdfarranger/core.py:457 msgid "Password" msgstr "" #: pdfarranger/core.py:435 msgid "Password required" msgstr "" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "" #: data/menu.ui:272 msgid "Pre_ferences" msgstr "" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "" #: pdfarranger/config.py:267 msgid "Printing" msgstr "" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "" #: data/pdfarranger.ui:78 msgid "Save" msgstr "" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "" #: data/menu.ui:47 msgid "Save _As…" msgstr "" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "" #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "" #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "" #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "" #: pdfarranger/config.py:260 msgid "Theme" msgstr "" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "" #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "" #: data/menu.ui:247 msgid "Zoom _In" msgstr "" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "" #: data/menu.ui:278 msgid "_About" msgstr "" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "" #: data/menu.ui:87 msgid "_Edit" msgstr "" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "" #: data/menu.ui:30 msgid "_Import" msgstr "" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "" #: data/menu.ui:36 msgid "_New Window" msgstr "" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "" #: data/menu.ui:71 msgid "_Print…" msgstr "" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "" #: data/menu.ui:82 msgid "_Redo" msgstr "" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "" #: data/menu.ui:78 msgid "_Undo" msgstr "" #: data/menu.ui:244 msgid "_View" msgstr "" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "" #: pdfarranger/core.py:326 msgid "page" msgstr "" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "" pdfarranger-1.11.0/po/pl_PL.po000066400000000000000000000416111463504064500160630ustar00rootroot00000000000000# PDF-Shuffler translation files. # Copyright (C) 2008-2017 Konstantinos Poulios # This file is part of PDF-Shuffler which is released under the GNU General # Public License version 3 or later. # See file COPYING or go to for full license details. # Translators: # Toratora , 2014 msgid "" msgstr "" "Project-Id-Version: PDF-Shuffler 0.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2021-12-30 17:13+0100\n" "Last-Translator: Toratora \n" "Language-Team: Polish (Poland) (http://www.transifex.com/logari81/" "pdfshuffler/language/pl_PL/)\n" "Language: pl_PL\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" "X-Generator: Poedit 3.0.1\n" "X-Language: pl_PL\n" "X-Source-Language: C\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "" #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "Wszystko z _tego samego pliku" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "Wszystkie pliki" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "Wszystkie strony muszą mieć ten sam rozmiar." #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "Dół" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Kolumny" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "Kreator" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "Narzędzie kreatora" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "Przytnij margines" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "Przytnij białe obramowania" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "Wy_tnij" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "Nie pokazuj ponownie tego okna dialogowego." #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "_Nie zapisuj" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "" #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "Zdu_plikowane" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "Edytuj _właściwości" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "Edytuj właściwości" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Równa szerokość kolumny" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "Eksportuj _Wszystkie strony do pojedynczych plików…" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "Eksportuj…" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "Plik nie jest ani pdfem, ani obrazem" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "Plik(i) do otwarcia" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "" #: data/menu.ui:259 msgid "Full_screen" msgstr "" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "" #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "Wygeneruj broszurę" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Wysokość w %" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Podziały poziome" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "Pliki graficzne są obsługiwane tylko przez img2pdf" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "Format obrazu nie jest obsługiwany przez img2pdf" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "" #: data/pdfarranger.ui:58 msgid "Import" msgstr "" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "Importuj…" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "Wstaw pustą stronę…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "Wstaw pustą stronę" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "Zły format daty. Dane wejściowe odrzucone." #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "" #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "Słowa kluczowe" #: pdfarranger/config.py:252 msgid "Language" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "Lewa" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Menu główne" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "Opiekunowie i współpracownicy" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "Zmodyfikowane" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "" #: pdfarranger/exporter.py:559 msgid "None" msgstr "" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "" #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger to niewielka aplikacja python-gtk, która pomaga użytkownikowi " "łączyć lub dzielić dokumenty PDF oraz obracać, przycinać i zmieniać " "kolejność ich stron za pomocą interaktywnego i intuicyjnego interfejsu " "graficznego. Jest to nakładka na pikepdf." #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "Dokument PDF jest uszkodzony" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "Pliki PDF" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "Rozmiar strony:" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "" #: pdfarranger/core.py:457 msgid "Password" msgstr "" #: pdfarranger/core.py:435 msgid "Password required" msgstr "Wymagane hasło" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "Wkle_j specjalne" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "Wklej _po" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "Wklej _przed" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "Wklejone dane są nieprawidłowe. Przerywanie wklejania." #: data/menu.ui:272 msgid "Pre_ferences" msgstr "" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "Wydrukuj wersję PDF Arranger i wyjdź" #: pdfarranger/config.py:267 msgid "Printing" msgstr "" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "Producent" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "Od_wrotna kolejność" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "Względny" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "Wykonanie…" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "Prawa" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Obrót w_lewo" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "_Obrót w prawo" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "Obróć w_lewo" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Linie" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "Ta sama strona _Format" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Zapisz" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Zapisz jako" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "" #: data/menu.ui:47 msgid "Save _As…" msgstr "Zapisz _jako…" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "Zapisać zmiany przed zamknięciem?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "Zapisać zmiany w „{}” przed zamknięciem?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "Współczynnik skali" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "Zaznacz wszystko" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "" #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "Przedmiot" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "Obsługiwane pliki graficzne" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "" #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "" #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "" #: pdfarranger/config.py:260 msgid "Theme" msgstr "" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "Tytuł" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "Góra" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "Nieznany format pliku" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "Wartość" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Podziały pionowe" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "Szerokość" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Szerokość w %" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "Twoje zmiany zostaną utracone, jeśli ich nie zapiszesz." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Powiększ" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Pomniejsz" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "" #: data/menu.ui:247 msgid "Zoom _In" msgstr "Powiększ" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "Pomniejsz" #: data/menu.ui:278 msgid "_About" msgstr "_O programie" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "Anuluj" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "_Kopiuj" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "_Usuń" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "Odznacz wszystkie" #: data/menu.ui:87 msgid "_Edit" msgstr "_Edycja" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "" #: data/menu.ui:30 msgid "_Import" msgstr "_Importuj" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "" #: data/menu.ui:36 msgid "_New Window" msgstr "_Nowe okno" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "" #: data/menu.ui:71 msgid "_Print…" msgstr "" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "_Wyjście" #: data/menu.ui:82 msgid "_Redo" msgstr "_Ponów" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "_Obróć w prawo" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "_Zapisz" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "Zaznacz" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "_Podziel strony…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Cofnij" #: data/menu.ui:244 msgid "_View" msgstr "" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "mm" #: pdfarranger/core.py:326 msgid "page" msgstr "strona" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "" pdfarranger-1.11.0/po/pt_BR.po000066400000000000000000000460321463504064500160650ustar00rootroot00000000000000# Brazilian portuguese translation for PDF Arranger. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Rogênio Belém , 2013 # Túlio César do Nascimento Peroni ; 2022 # msgid "" msgstr "" "Project-Id-Version: pdfarranger\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2024-03-30 12:18-0300\n" "Last-Translator: Túlio Peroni \n" "Language-Team: BR (Brazil)\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.4.2\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Col" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Lin" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "% da altura" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "% da largura" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s é uma ferramenta que reorganiza e modifica arquivos PDF." #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "(Libhandy ausente)" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "(Requer reinício)" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "Já existe um arquivo chamado \"%s\". Deseja substituí-lo?" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "Todas as páginas do me_smo arquivo" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "Todos os arquivos" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "Todas as páginas devem ter o mesmo tamanho." #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "Todos os arquivos suportados" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "Rotação automática" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "Inferior" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "De baixo para cima" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "Imagem da área de transferência" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Colunas" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "Copiar _Imagem" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "Copiar _Texto" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "Criado em" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "Autor" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "Ferramenta de criação" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "Recortar as margens" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "Recortar _margens em branco" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" "Cortar/ocultar não remove qualquer conteúdo do arquivo PDF, apenas o oculta." #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "Cor_tar" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "Apesar dos avisos, o(s) documento(s) não deve(m) ter problemas visíveis." #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "Descartar alterações e fechar?" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "Descartar alterações e sair?" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "Não mostrar este diálogo novamente." #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "_Não salvar" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "Não mostrar avisos ao salvar novamente." #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "Dupl_icar" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "E_xportar" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "E_xportar seleção para um único arquivo…" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "Editar _Propriedades" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "Editar propriedades" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Igualar largura das colunas" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Igualar altura das linhas" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "Explodindo em imagens…" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "Exportar seleção em arquivos _individuais…" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "Export_ar todas as páginas em arquivos individuais…" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "Exportar…" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "O arquivo não é PDF nem imagem" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "Arquivo(s) a abrir" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "Ajustar à página inteira" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "Ajustar à área de impressão" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "Para mais informações, consulte" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "Para mais opções consulte:" #: data/menu.ui:259 msgid "Full_screen" msgstr "_Tela cheia" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL) Versão 3." #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "_Gerar livreto" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "Altura" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Altura em %" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "Ocultar Margens" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "Horizontal" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Divisões na horizontal" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "Deslocamento horizontal" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "Arquivos de imagem somente são suportados com o img2pdf" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "A imagem não é suportada pelo img2pdf" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "Img2pdf ausente." #: data/pdfarranger.ui:58 msgid "Import" msgstr "Importar" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "Importar…" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "Inserir página em _branco…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "Inserir página em branco" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "Formato de data inválido. Entrada descartada." #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Utiliza libqpdf %s, pikepdf %s, GTK %s e Python %s." #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "Palavras-chave" #: pdfarranger/config.py:252 msgid "Language" msgstr "Idioma" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "Esquerda" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "Da esquerda para direita" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Menu principal" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "Programadores e colaboradores" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "Margem" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "Mesclar páginas" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "Tamanho da página mesclada:" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "Modificado em" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "Tamanho de página não uniforme - usando o tamanho máximo" #: pdfarranger/exporter.py:559 msgid "None" msgstr "Nenhum" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "Observação" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "Observe as limitações:" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Abrir" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "Abrir…" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "" "Os contornos e links podem ser preservados somente em determinados casos." #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "Sobreposição" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger é um pequeno aplicativo python-gtk, que ajuda o usuário a " "mesclar ou dividir documentos PDF e girar, cortar e reorganizar suas páginas " "usando uma interface gráfica interativa e intuitiva. É um frontend para o " "pikepdf." #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "O documento PDF está danificado" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "Arquivos PDF" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "Manipulação de Página" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "Ordem das páginas" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "Tamanho da página:" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "Tamanho da página" #: pdfarranger/core.py:457 msgid "Password" msgstr "Senha" #: pdfarranger/core.py:435 msgid "Password required" msgstr "Senha obrigatória" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "Colar _especial" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "Colar como S_obreposição…" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "Colar como páginas par_es" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "Co_lar como páginas ímpares" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "Colar como _Subposição…" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "Col_ar depois" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "Colar a_ntes" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "Os dados colados são inválidos. Cancelando operação." #: data/menu.ui:272 msgid "Pre_ferences" msgstr "Pre_ferências" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "Preferências" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "Mostrar a versão do PDF Arranger e sair" #: pdfarranger/config.py:267 msgid "Printing" msgstr "Imprimir" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "Imprimir…" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "Produtor" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "Propriedade" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "Inverter _ordem" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "Relativo" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "Pré-visualização de renderização…" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "Renderizando…" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "Substituir" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "Direita" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "Da direita para esquerda" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Rotacionar à esquerda" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Rotacionar à direita" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "Rotacionar à es_querda" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Linhas" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "Páginas com o mesmo _formato" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Salvar" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Salvar como" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "Salvar como…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Salvar _Como…" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "Salvar alterações antes de fechar?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "Salvar alterações antes de sair?" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "Salvar as alterações em “{}” antes de fechar?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "Salvar as alterações em “{}” antes de sair?" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "Salvar produziu alguns avisos" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "Salvando…" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "Fator de escala" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "Modo de escala:" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "Selecion_ar tudo" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "Selecionar páginas par_es" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "Seleci_onar páginas ímpares" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "Páginas selecionadas: " #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "Mostrar valores" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Dividir página" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "Assunto" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "Arquivos de imagem suportados" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "Configuração do sistema" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "" "O documento “{}” está bloqueado e requer uma senha antes de ser aberto." #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "A página tem várias imagens. Use \"Explodir em imagens\" primeiro." #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "A senha será lembrada até que você feche o PDF Arranger." #: pdfarranger/config.py:260 msgid "Theme" msgstr "Tema" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "Título" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "Superior" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "De cima para baixo" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "Subposição" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "Formato de arquivo desconhecido" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "Manual do Usuário" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "Valor" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "Vertical" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Divisões na vertical" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "Deslocamento vertical" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "Largura" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Largura em %" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "Suas alterações serão perdidas se você não salvá-las." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Ampliar" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Reduzir" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "Ajustar _zoom" #: data/menu.ui:247 msgid "Zoom _In" msgstr "_Ampliar" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "_Reduzir" #: data/menu.ui:278 msgid "_About" msgstr "S_obre" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "_Aplicar" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "_Cancelar" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "_Fechar" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "_Copiar" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "_Recortar margens…" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "Remo_ver" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "_Desmarcar tudo" #: data/menu.ui:87 msgid "_Edit" msgstr "_Editar" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "_Explodir em imagens" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "_Extrair" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "_Ocultar margens…" #: data/menu.ui:30 msgid "_Import" msgstr "_Importar" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "_Inverter seleção" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "_Mesclar páginas…" #: data/menu.ui:36 msgid "_New Window" msgstr "_Nova Janela" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "_OK" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "_Abrir" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "Tamanho da _página…" #: data/menu.ui:71 msgid "_Print…" msgstr "Im_primir…" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "_Sair" #: data/menu.ui:82 msgid "_Redo" msgstr "_Refazer" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "_Reverter" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "_Rotacionar à direita" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "_Salvar" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "_Selecionar" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "_Dividir página…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Desfazer" #: data/menu.ui:244 msgid "_View" msgstr "_Visualização" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "mm" #: pdfarranger/core.py:326 msgid "page" msgstr "página" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "sem título" pdfarranger-1.11.0/po/pt_PT.po000066400000000000000000000462771463504064500161200ustar00rootroot00000000000000# Portuguese(Portugal) translation for pdfarranger. # Copyright (C) 2020 Jérôme Robert # This file is part of pdfarranger which is released under the GNU General # Public License version 3 or later. # See file COPYING or go to for full license details. # Translators: # Sérgio Marques , 2021, 2022, 2023. # Hugo Carvalho , 2021, 2022, 2023, 2024. # msgid "" msgstr "" "Project-Id-Version: pdfarranger\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2024-03-20 21:14+0000\n" "Last-Translator: Hugo Carvalho \n" "Language-Team: Portuguese (Portugal)\n" "Language: pt_PT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Loco-Source-Locale: en_PT\n" "X-Generator: Poedit 3.4.2\n" "X-Loco-Parser: loco_parse_po\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Coluna" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Linha" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "% de altura" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "% de largura" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s é uma ferramenta para organizar e modificar ficheiros PDF." #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "(Biblioteca libhandy em falta)" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "(Tem que reiniciar)" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "" "Já existe um ficheiro com o nome \"%s\". Deseja substituir o ficheiro " "existente?" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "Tudo do me_smo ficheiro" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "Todos os ficheiros" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "Todas as páginas devem ter o mesmo tamanho." #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "Todos os ficheiros suportados" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "Rotação automática" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "Baixo" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "Baixo para cima" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "Imagem da área de transferência" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Colunas" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "Copiar _imagem" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "Copiar _texto" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "Criado" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "Criador" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "Criado por" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "Margens de recorte" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "Recortar margens brancas" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" "Recortar/ocultar não remove qualquer conteúdo do ficheiro PDF, apenas o " "oculta." #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "Cor_tar" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "Apesar dos avisos, o(s) documento(s) não parece(m) ter problemas visíveis." #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "Descartar alterações e fechar?" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "Descartar alterações e sair?" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "Não mostrar novamente." #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "_Não guardar" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "Não mostrar avisos ao guardar novamente." #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "Dupl_icar" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "E_xportar" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "E_xportar seleção para um ficheiro…" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "Editar _propriedades" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "Editar propriedades" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Igualar largura de colunas" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Igualar altura de linhas" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "Explodindo em imagens…" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "Exportar seleção para f_icheiros distintos…" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "Export_ar todas as páginas para ficheiros distintos…" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "Exportar…" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "O ficheiro não é um PDF nem uma imagem" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "Ficheiro(s) a abrir" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "Ajustar à página inteira" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "Ajustar à área de impressão" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "Para mais informações, consultar" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "Para mais opções, consultar:" #: data/menu.ui:259 msgid "Full_screen" msgstr "Ecrã completo" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL), versão 3." #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "Gerar folheto" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "Altura" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Altura em %" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "Ocultar margens" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "Horizontal" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Separação horizontal" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "Desvio horizontal" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "Ficheiros de imagem apenas suportados com img2pdf" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "Formato de imagem não suportado por img2pdf" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "Img2pdf em falta." #: data/pdfarranger.ui:58 msgid "Import" msgstr "Importar" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "Importar…" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "Inserir página em bran_co…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "Inserir página vazia" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "Formato de data inválido. Será descartado." #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Utiliza libqpdf %s, pikepdf %s, GTK %s e Python %s." #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "Palavras-chave" #: pdfarranger/config.py:252 msgid "Language" msgstr "Idioma" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "Esquerda" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "Direita para esquerda" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Menu" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "Programadores e colaboradores" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "Margem" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "Unir páginas" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "Tamanho das páginas unidas:" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "Modificado" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "Tamanho não uniforme - utilizar tamanho máximo" #: pdfarranger/exporter.py:559 msgid "None" msgstr "Nenhum" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "Nota" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "Note as limitações:" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Abrir" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "Abrir…" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "" "Os contornos e as ligações só podem ser preservados em determinados casos." #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "Sobreposição" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "O PDF Arranger é uma pequena aplicação em python-gtk, que ajuda o utilizador " "a juntar ou dividir documentos pdf e a rodar, cortar e reorganizar as suas " "páginas usando uma interface gráfica interativa e intuitiva. É uma interface " "para pikepdf." #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "O documento PDF está danificado" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "Ficheiros PDF" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "Manuseamento de páginas" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "Ordem das páginas" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "Tamanho da página:" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "Tamanho da página" #: pdfarranger/core.py:457 msgid "Password" msgstr "Palavra-passe" #: pdfarranger/core.py:435 msgid "Password required" msgstr "Requer palavra-passe" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "Colar _especial" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "Colar por _cima…" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "Colar como páginas par_es" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "C_olar como páginas ímpares" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "Colar por _baixo…" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "Col_ar depois" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "Colar a_ntes" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "Os dados colados são inválidos. A abortar." #: data/menu.ui:272 msgid "Pre_ferences" msgstr "Pre_ferências" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "Preferências" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "Mostra a versão do PDF Arranger e sai" #: pdfarranger/config.py:267 msgid "Printing" msgstr "Impressão" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "A imprimir…" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "Produtor" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "Propriedade" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "Ordem in_versa" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "Relativa" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "Pré-visualização da renderização…" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "Renderização…" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "Substituir" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "Direita" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "Direita para esquerda" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Rodar à esquerda" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Rodar à direita" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "Rodar à _esquerda" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Linhas" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "Mesmo _formato de página" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Guardar" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Guardar como" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "Guardar como…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Guard_ar como…" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "Guardar alterações antes de fechar?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "Guardar alterações antes de sair?" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "Guardar alterações a “{}” antes de fechar?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "Guardar alterações a “{}” antes de sair?" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "A gravação gerou alguns avisos" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "A guardar…" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "Fator de escala" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "Modo de escala:" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "M_arcar tudo" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "Marcar páginas par_es" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "Marcar páginas í_mpares" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "Páginas selecionadas: " #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "Mostrar valores" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Separar páginas" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "Assunto" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "Ficheiros de imagem suportados" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "Definição do sistema" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "" "O documento “{}” está bloqueado e requer uma palavra-passe para poder ser " "aberto." #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "A página tem várias imagens. Utilize primeiro \"Explodir em imagens\"." #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "O PDF Arranger apenas irá memorizar a palavra-passe para esta sessão." #: pdfarranger/config.py:260 msgid "Theme" msgstr "Tema" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "Título" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "Cima" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "Cima para baixo" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "Colar por baixo" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "Formato desconhecido" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "Manual do utilizador" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "Valor" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "Vertical" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Separação vertical" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "Desvio vertical" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "Largura" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Largura em %" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "Se não as guardar, perderá todas as alterações." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Ampliar" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Reduzir" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "A_justar" #: data/menu.ui:247 msgid "Zoom _In" msgstr "Ampl_iar" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "Redu_zir" #: data/menu.ui:278 msgid "_About" msgstr "_Acerca" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "_Aplicar" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "_Cancelar" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "Fe_char" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "_Copiar" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "_Recortar margens…" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "E_liminar" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "_Desmarcar tudo" #: data/menu.ui:87 msgid "_Edit" msgstr "_Editar" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "_Explodir em imagens" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "_Extrair" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "_Ocultar margens…" #: data/menu.ui:30 msgid "_Import" msgstr "_Importar" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "_Inverter seleção" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "Unir pági_nas…" #: data/menu.ui:36 msgid "_New Window" msgstr "_Nova janela" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "_OK" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "_Abrir" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "_Tamanho da página…" #: data/menu.ui:71 msgid "_Print…" msgstr "Im_primir…" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "_Sair" #: data/menu.ui:82 msgid "_Redo" msgstr "_Refazer" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "_Reverter" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "Rodar à _direita" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "_Guardar" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "_Selecionar" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "_Separar páginas…" #: data/menu.ui:78 msgid "_Undo" msgstr "An_ular" #: data/menu.ui:244 msgid "_View" msgstr "_Ver" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "mm" #: pdfarranger/core.py:326 msgid "page" msgstr "página" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "sem título" pdfarranger-1.11.0/po/ru.po000066400000000000000000000546461463504064500155170ustar00rootroot00000000000000# Russian translation for pdfarranger. # Copyright (C) 2020 Alexander Volkov # This file is distributed under the same license as the pdfarranger package. # Translators: # Alexander Volkov, 2020 # Ser82-png , 2022, 2023. # msgid "" msgstr "" "Project-Id-Version: pdfarranger master\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2024-02-26 21:56+1000\n" "Last-Translator: Ser82-png \n" "Language-Team: \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.0.1\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Столбец" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Ряд" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "% oт высоты" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "% oт ширины" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s - инструмент для переупорядочивания и изменения файлов PDF." #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "(Libhandy отсутствует)" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "(Требуется перезагрузка)" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "Файл «%s» уже существует. Заменить его?" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "Все из _одного файла" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "Все файлы" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "Все страницы должны иметь одинаковый размер." #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "Все поддерживаемые файлы" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "Поворачивать автоматически" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "Снизу" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "Снизу вверх" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "Изображение буфера обмена" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Столбцы" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "Копировать _изображение" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "Копировать _текст" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "Создан" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "Автор" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "Создано с помощью" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "Обрезать поля" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "Обрезать белые края" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" "Обрезка/скрытие не удаляет содержимое PDF-файла, а только скрывает его." #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "Вы_резать" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "Несмотря на предупреждения, документ(ы) не должен(ны) иметь видимых проблем." #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "Отменить изменения и закрыть?" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "Отменить изменения и выйти?" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "Не показывать этот диалог снова." #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "_Не сохранять" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "Не показывать предупреждения при повторном сохранении." #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "_Дублировать" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "_Экспорт" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "Экспорт выделенного фрагмента в _один файл…" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "Редактировать _свойства" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "Редактировать свойства" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Равная ширина столбцов" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Равная высота рядов" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "Изъятие встроенных изображений…" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "Экспорт выделенных фрагментов в от_дельные файлы…" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "Экспорт _всех страниц в отдельные файлы…" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "Экспорт…" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "Файл не является ни PDF, ни изображением" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "Файл(ы) для открытия" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "По размеру страницы" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "По размеру области печати" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "Для получения дополнительной информации смотрите" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "Дополнительные параметры смотрите в:" #: data/menu.ui:259 msgid "Full_screen" msgstr "_Во весь экран" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL) версия 3." #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "Создать буклет" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "Высота" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Высота в %" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "Скрыть поля" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "Горизонтальная" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Горизонтальные разделения" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "Горизонтальное смещение" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "Файлы изображений поддерживаются только с img2pdf" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "Формат изображения не поддерживается img2pdf" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "Отсутствует Img2pdf." #: data/pdfarranger.ui:58 msgid "Import" msgstr "Импортировать" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "Импорт…" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "Вставить _пустую страницу…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "Вставить пустую страницу" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "Неверный формат даты. Вход отклонен." #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Приложение использует libqpdf %s, и pikepdf %s, GTK %s и Python %s." #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "Ключевые слова" #: pdfarranger/config.py:252 msgid "Language" msgstr "Язык" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "Слева" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "Слева направо" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Главное меню" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "Сопровождающие и участники проекта" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "Поле" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "Объединение страниц" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "Размер объединённой страницы:" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "Изменён" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "Неравномерный размер страниц — используется максимальный размер" #: pdfarranger/exporter.py:559 msgid "None" msgstr "Ничего" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "Примечание" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "Обратите внимание на ограничения:" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Открыть" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "Открыть…" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "Контуры и ссылки могут быть сохранены лишь в некоторых ситуациях." #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "Наложение" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger - это небольшое python-gtk приложение, которое помогает " "пользователю объединять или разделять документы PDF, а также вращать, " "обрезать и изменять порядок страниц с помощью интерактивного и интуитивно " "понятного графического интерфейса. Это клиентский интерфейс для pikepdf." #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "Документ PDF повреждён" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "Файлы PDF" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "Управление страницами" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "Порядок страниц" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "Размер страницы:" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "Размер страницы" #: pdfarranger/core.py:457 msgid "Password" msgstr "Пароль" #: pdfarranger/core.py:435 msgid "Password required" msgstr "Требуется пароль" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "_Специальная вставка" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "Вставить как нало_жение…" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "Вставить как _чётные страницы" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "Вставить как _нечётные страницы" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "Вставить как _подложку…" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "Вставить п_осле" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "Вставить пе_ред" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "Вставляемые данные недопустимы. Вставка прервана." #: data/menu.ui:272 msgid "Pre_ferences" msgstr "_Параметры" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "Параметры" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "Распечатать версию программы PDF Arranger и выйти" #: pdfarranger/config.py:267 msgid "Printing" msgstr "Печать" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "Печать…" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "Программа" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "Свойство" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "_Обратный порядок" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "Относительный" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "Предварительная визуализация…" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "Визуализация…" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "Заменить" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "Справа" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "Справа налево" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Повернуть влево" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Повернуть вправо" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "Повернуть в_лево" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Ряды" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "Страницы того же _формата" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Сохранить" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Сохранить как" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "Сохранить как…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Сохранить _как…" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "Сохранить изменения в перед закрытием?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "Сохранить изменения в перед выходом?" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "Сохранить изменения в «{}» перед закрытием?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "Сохранить изменения в «{}» перед выходом?" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "Сохранение выдало несколько предупреждений" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "Сохранение…" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "Масштаб" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "Режим масштабирования:" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "Выделить _всё" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "Выделить _чётные страницы" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "Выделить _нечётные страницы" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "Выбранные страницы: " #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "Показать значения" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Разделить страницы" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "Тема" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "Поддерживаемые файлы изображений" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "Системные настройки" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "Документ «{}» заблокирован, для его открытия требуется пароль." #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "" "На странице есть несколько изображений. Сначала используйте действие «Изъять " "встроенные изображения»." #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "Пароль будет запомнен, пока вы не закроете PDF Arranger." #: pdfarranger/config.py:260 msgid "Theme" msgstr "Тема" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "Заголовок" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "Сверху" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "Сверху вниз" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "Подложка" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "Неизвестный формат файла" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "Руководство пользователя" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "Значение" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "Вертикальная" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Вертикальные разделения" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "Вертикальное смещение" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "Ширина" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Ширина в %" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "Ваши изменения будут потеряны, если их не сохранить." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Увеличить" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Уменьшить" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "Страница _целиком" #: data/menu.ui:247 msgid "Zoom _In" msgstr "У_величить" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "У_меньшить" #: data/menu.ui:278 msgid "_About" msgstr "_О приложении" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "_Применить" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "_Отменить" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "_Закрыть" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "_Копировать" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "О_брезать поля…" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "_Удалить" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "Сн_ять выделение" #: data/menu.ui:87 msgid "_Edit" msgstr "П_равка" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "_Изъять встроенные изображения" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "И_звлечь" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "Скрыть _поля…" #: data/menu.ui:30 msgid "_Import" msgstr "_Импорт" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "Инвертировать _выделение" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "_Объединение страниц…" #: data/menu.ui:36 msgid "_New Window" msgstr "_Создать окно" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "_ОК" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "_Открыть" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "_Размер страницы…" #: data/menu.ui:71 msgid "_Print…" msgstr "_Печать…" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "В_ыход" #: data/menu.ui:82 msgid "_Redo" msgstr "_Повторить" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "_Восстановить" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "Повернуть в_право" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "_Сохранить" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "В_ыделить" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "Раз_делить страницы…" #: data/menu.ui:78 msgid "_Undo" msgstr "О_тменить" #: data/menu.ui:244 msgid "_View" msgstr "_Вид" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "мм" #: pdfarranger/core.py:326 msgid "page" msgstr "страница" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "без_названия" pdfarranger-1.11.0/po/sl.po000066400000000000000000000447121463504064500155000ustar00rootroot00000000000000# Slovenian translation for pdfarranger. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the pdfarranger package. # Janez G , 2024. # msgid "" msgstr "" "Project-Id-Version: pdfarranger\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2023-06-06 13:27+0200\n" "Last-Translator: Janez G \n" "Language-Team: \n" "Language: sl_SI\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.0\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || " "n%100==4 ? 3 : 0);\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "Št. stolpcev" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "Št. vrstic" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "% višine" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "% širine" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s je orodje za prerazporejanje in spreminjanje datotek PDF." #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "(manjka Libhandy)" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "(Potreben pozagon)" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "Datoteka z imenom \"%s\" že obstaja. Ali jo želite nadomestiti?" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "V_se iz iste datoteke" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "Vse datoteke" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "Vse strani morajo biti enako velike." #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "Vse podprte datoteke" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "Spodaj" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "Od spodaj do vrha" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "Slika iz medpomnilnika" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Stolpci" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "Kop_iraj sliko" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "Kopiraj _besedilo" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "Ustvarjeno" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "Ustvarjalec" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "Orodje ustvarjalca" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "Obreži robove" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "Obreži bele robove" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" "Z obrezovanjem/zakrivanjem ne izgubite vsebine PDF datoteke, temveč jo le " "skrijete" #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "Iz_reži" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "Kljub opozorilom naj dokumenti ne bi imeli vidnih težav." #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "Želite zavreči spremembe in zapreti?" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "Želite zavreči spremembe in zaustaviti program?" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "Ne prikazuj več tega pogovornega okna." #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "_Ne shrani" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "Med shranjevanjem ne prikazuj več opozoril." #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "Po_dvoji" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "Iz_vozi" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "Iz_vozi izbrano v eno datoteko …" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "Uredi _lastnosti" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "Uredi lastnosti" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Enotna širina stolpcev" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Enotna višina vrstic" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "Razstrelitev na slike …" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "Izvozi izbrano v _ločene datoteke …" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "Izvozi v_se strani v ločene datoteke …" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "Izvozi …" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "Datoteka ni niti PDF, niti slika" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "Datoteke za odpiranje" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "Poglejte več možnosti:" #: data/menu.ui:259 msgid "Full_screen" msgstr "Celoza_slonski način" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "Splošno GNU dovoljenje, različica 3." #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "Ustvari knjižico" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "Višina" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Višina v %" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "Skrij robove" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "Vodoravno" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Vodoravne delitve" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "Vodoravni odmik" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "Slikovne datoteke so podprte le za img2pdf" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "img2pdf ne podpira zapisa slike" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "Img2pdf manjka" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Uvozi" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "Uvozi …" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "Vstavi pra_zno stran …" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "Vstavi prazno stran" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "Neveljavna oblika datuma. Vnos prezrt." #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Program uporablja libqpdf %s, pikepdf %s, GTK %s in Python %s." #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "Ključniki" #: pdfarranger/config.py:252 msgid "Language" msgstr "Jezik" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "Levo" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "Z leve proti desni" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Glavni izbirnik" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "Vzdrževalci in prispevkarji" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "Robovi" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "Združi strani" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "Velikost združenih strani:" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "Spremenjeno" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "Različne velikosti strani - uporabljena bo največja" #: pdfarranger/exporter.py:559 msgid "None" msgstr "" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Odpri" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "Odpri …" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "" #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "Naplastitev" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger je majhen python-gtk program, ki pomaga uporabniku združiti ali " "razcepiti pdf dokumente ter zasukati, obrezati in prerazporediti njihove " "strani s pomočjo sodejnega uporabniškega vmesnika. Gre za obličje programa " "pikepdf." #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "PDF dokument je okvarjen" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "PDF datoteke" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "Zaporedje strani" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "Velikost strani:" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "Velikost strani" #: pdfarranger/core.py:457 msgid "Password" msgstr "Geslo" #: pdfarranger/core.py:435 msgid "Password required" msgstr "Potrebno je geslo" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "Pos_ebno lepljenje" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "Prilepi _v ospredje …" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "Prilepi kot _sode strani" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "Prilepi kot _lihe strani" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "Prilepi v oza_dje …" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "Prilepi _za" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "Prilepi _pred" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "Prilepljeni podatki niso veljavni. Lepljenje opuščeno." #: data/menu.ui:272 msgid "Pre_ferences" msgstr "P_rednastavitve" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "Prednastavitve" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "Natisni različico PDF Arrangerja in ga zaustavi" #: pdfarranger/config.py:267 msgid "Printing" msgstr "" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "Tiskanje …" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "Narejen v programu" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "Lastnost" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "O_brni zaporedje" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "Odnosno" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "Izrisovanje predogleda …" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "Izrisovanje …" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "Zamenjaj" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "Desno" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "Z desne proti levi" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Zasukaj levo" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Zasukaj desno" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "Zasukaj _levo" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Vrstice" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "Enaka _oblika strani" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Shrani" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Shrani kot" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "Shrani kot …" #: data/menu.ui:47 msgid "Save _As…" msgstr "Shr_ani kot …" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "Ali želite pred zaprtjem shraniti spremembe?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "Ali želite pred izhodom iz programa shraniti spremembe?" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "Ali želite pred zaprtjem shraniti spremembe v „{}”?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "Ali želite pred izhodom iz programa shraniti spremembe v „{}”?" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "Med shranjevanjem se je pojavilo nekaj opozoril" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "Shranjevanje …" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "Povečava" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "Izberi _vse" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "Izberi _sode strani" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "Izberi _lihe strani" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "Izbrane strani: " #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "Prikaži vrednosti" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Razdeli strani" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "Predmet" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "Podprte slikovne datoteke" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "Sistemske nastavitve" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "Dokument „{}” je zaklenjen. Za odprtje morate vpisati geslo." #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "Na strani je več slik. Uporabite najprej \"Raztreli na slike\". " #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "Geslo bo pomnjeno do zaprtja PDF urejevalnika Arranger." #: pdfarranger/config.py:260 msgid "Theme" msgstr "Tema" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "Naslov" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "Zgoraj" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "Od zgoraj navzdol" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "Podloži" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "Neznan datotečni zapis" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "Vrednost" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "Pokončno" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Navpična delitev" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "Navpični odmik" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "Širina" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Širina v %" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "Če ne shranite vaših sprememb, bodo izgubljene." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Približaj" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Oddalji" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "_Prilegajoča povečava" #: data/menu.ui:247 msgid "Zoom _In" msgstr "Pr_ibližaj" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "_Oddalji" #: data/menu.ui:278 msgid "_About" msgstr "_O programu" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "_Uporabi" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "_Prekliči" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "_Zapri" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "_Kopiraj" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "Iz_briši" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "O_dizberi vse" #: data/menu.ui:87 msgid "_Edit" msgstr "Ur_edi" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "Raztreli na slike" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "Izvleci" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "S_krij robove" #: data/menu.ui:30 msgid "_Import" msgstr "_Uvozi" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "_Obrni izbor" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "_Združi strani …" #: data/menu.ui:36 msgid "_New Window" msgstr "_Novo okno" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "V _redu" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "_Odpri" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "_Velikost strani" #: data/menu.ui:71 msgid "_Print…" msgstr "Na_tisni …" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "_Izhod" #: data/menu.ui:82 msgid "_Redo" msgstr "_Ponovi" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "P_ovrni" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "Zasukaj _desno" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "_Shrani" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "_Izberi" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "_Razcepi strani …" #: data/menu.ui:78 msgid "_Undo" msgstr "Razvel_javi" #: data/menu.ui:244 msgid "_View" msgstr "_Pogled" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "mm" #: pdfarranger/core.py:326 msgid "page" msgstr "stran" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "nenaslovljen" pdfarranger-1.11.0/po/sv.po000066400000000000000000000451601463504064500155100ustar00rootroot00000000000000# Swedish translation for pdfarranger. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the pdfarranger package. # Translators: # kbengs, 2020-2024 msgid "" msgstr "" "Project-Id-Version: pdfarranger\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2024-03-24 18:10+0200\n" "Last-Translator: kbengs\n" "Language-Team: Swedish\n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.0.1\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Kolumn" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Rad" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "% av höjd" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "% av bredd" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s är ett verktyg för att arrangera om och modifiera PDF filer." #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "(Libhandy saknas)" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "(Kräver omstart)" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "En fil med namnet \"%s\" finns redan. Vill du skriva över den?" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "Alla från samma _fil" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "Alla filer" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "Alla sidor måste ha samma storlek." #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "Alla filer som stöds" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "Rotera automatiskt" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "Under" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "Nerifrån uppåt" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "Urklipp bild" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Kolumner" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "Kopiera _bild" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "Kopiera _text" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "Skapad" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "Författare" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "Program" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "Beskär marginaler" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "_Beskär vita marginaler" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" "Beskär/dölj tar inte bort innehåll från PDF-filen utan gömmer endast bort " "det." #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "_Klipp ut" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "Trots varningarna borde dokumenten inte ha noterbara problem." #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "Förkasta ändringar och stäng?" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "Förkasta ändringar och avsluta?" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "Visa inte detta meddelande igen." #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "Spara _inte" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "Visa inte varningar när dokument sparas." #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "Dupli_cera" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "E_xportera" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "E_xportera markerade sidor till en fil…" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "Redigera _egenskaper" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "Dokument egenskaper" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Samma kolumnbredd" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Samma radhöjd" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "Exploderar till bilder…" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "Exportera markerade sidor till _enskilda filer…" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "Exportera _alla sidor till enskilda filer…" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "Exportera…" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "Filen är varken en PDF eller en bildfil" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "Fil(er) att öppna" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "Anpassa till hel sida" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "Anpassa till utskrivbart område" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "För mer info se:" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "För fler inställningar se:" #: data/menu.ui:259 msgid "Full_screen" msgstr "_Helskärm" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL) Version 3." #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "Skapa ett häfte" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "Höjd" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Höjd i %" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "Dölj marginaler" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "Horizontell" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Horisontell delning" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "Horizontell offset" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "Img2pdf krävs för stöd av bildfiler" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "Bildformatet stöds inte av img2pdf" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "Img2pdf saknas." #: data/pdfarranger.ui:58 msgid "Import" msgstr "Importera" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "Importera…" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "_Infoga tom sida…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "Infoga tom sida" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "Ogiltigt datumformat." #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Programmet använder libqpdf %s, pikepdf %s, GTK %s och Python %s." #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "Nyckelord" #: pdfarranger/config.py:252 msgid "Language" msgstr "Språk" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "Vänster" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "Vänster till höger" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Huvudmeny" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "Administratörer och bidragsgivare" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "Marginal" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "Slå samman sidor" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "Sammanslagna sidstorleken:" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "Ändrad" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "Sidorna har olika storlek - max storleken används" #: pdfarranger/exporter.py:559 msgid "None" msgstr "Ingen" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "Notera" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "Notera begränsningarna:" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Öppna" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "Öppna…" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "Bokmärken och länkar kan bevaras endast i vissa fall." #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "Klistra in ovanpå" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger är ett litet python-gtk program som hjälper användaren att slå " "samman och dela pdf dokument samt att rotera och arrangera om dess sidor med " "ett interaktivt och intuitivt grafiskt användargränssnitt. Programmet " "använder pikepdf i bakgrunden." #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "PDF dokumentet är skadat" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "PDF filer" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "Sidhantering" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "Sidordning" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "Sidstorlek:" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "Sidstorlek" #: pdfarranger/core.py:457 msgid "Password" msgstr "Lösenord" #: pdfarranger/core.py:435 msgid "Password required" msgstr "Lösenord krävs" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "Klistra in _special" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "Klistra in ovanp_å…" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "Klistra in som _jämna sidor" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "Klistra in som _udda sidor" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "Klistra in unde_r…" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "Klistra in _efter" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "Klistra in _före" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "Inklistrat data är inte giltigt. Inklistringen avbryts." #: data/menu.ui:272 msgid "Pre_ferences" msgstr "_Inställningar" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "Inställningar" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "Skriv ut PDF Arranger versionen och avsluta" #: pdfarranger/config.py:267 msgid "Printing" msgstr "Utskrift" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "Skriver ut…" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "PDF-framställning" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "Fält" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "Omv_änd ordningen" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "Relativt" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "Renderar förhandsgranskning…" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "Renderar…" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "Ersätt" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "Höger" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "Höger till vänster" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Rotera åt vänster" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Rotera åt höger" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "Rotera åt _vänster" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Rader" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "Alla med samma _sidformat" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Spara" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Spara som" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "Spara som…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Spara s_om…" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "Spara ändringar innan stängning?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "Spara ändringar innan programmet avslutas?" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "Spara ändringar till “{}” innan stängning?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "Spara ändringar till “{}” innan programmet avslutas?" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "Spara-processen skapade varningar" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "Sparar…" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "Skalningsfaktor" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "Skalningsmetod:" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "_Markera allt" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "Markera _jämna sidor" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "Markera _udda sidor" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "Markerade sidor: " #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "Visa värden" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Dela sidor" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "Ämne" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "Bildfiler som stöds" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "Systemets inställning" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "Dokumentet “{}” är låst och ett lösenord krävs innan det kan öppnas." #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "Sidan har flera bilder. Använd \"Explodera till bilder\" först." #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "Lösenordet kommer att vara sparat tills du stänger PDF Arranger." #: pdfarranger/config.py:260 msgid "Theme" msgstr "Tema" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "Titel" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "Över" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "Uppifrån neråt" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "Klistra in under" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "Okänt filformat" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "Användarmanual" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "Innehåll" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "Vertikal" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Vertikal delning" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "Vertikal offset" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "Bredd" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Bredd i %" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "Dina ändringar går förlorade om du inte sparar dem." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Zooma in" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Zooma ut" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "_Anpassa zoom" #: data/menu.ui:247 msgid "Zoom _In" msgstr "Zooma _in" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "Zooma _ut" #: data/menu.ui:278 msgid "_About" msgstr "_Om PDF Arranger" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "_Verkställ" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "_Avbryt" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "_Stäng" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "K_opiera" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "_Beskär marginaler…" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "_Ta bort" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "_Avmarkera allt" #: data/menu.ui:87 msgid "_Edit" msgstr "_Redigera" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "_Explodera till bilder" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "_Extrahera" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "_Dölj marginaler…" #: data/menu.ui:30 msgid "_Import" msgstr "Im_portera" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "_Invertera markeringen" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "Sl_å samman sidor…" #: data/menu.ui:36 msgid "_New Window" msgstr "_Nytt fönster" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "_OK" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "_Öppna" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "_Sidstorlek…" #: data/menu.ui:71 msgid "_Print…" msgstr "_Skriv ut…" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "_Avsluta" #: data/menu.ui:82 msgid "_Redo" msgstr "_Gör om" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "_Återställ" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "Rotera åt _höger" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "_Spara" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "_Markera" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "_Dela sidor…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Ångra" #: data/menu.ui:244 msgid "_View" msgstr "_Visa" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "mm" #: pdfarranger/core.py:326 msgid "page" msgstr "sida" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "Osparat dokument" pdfarranger-1.11.0/po/tr.po000066400000000000000000000460751463504064500155130ustar00rootroot00000000000000# Turkish translation of pdfarranger # This file is distributed under the same license as the pdfarranger package. # Murathan BOSTANCI , 2018 # Emin Tufan Çetin , 2020, 2021, 2022, 2024. # Oğuz Ersen , 2021-2024. # msgid "" msgstr "" "Project-Id-Version: pdfarranger master\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2024-03-16 18:11+0300\n" "Last-Translator: Oğuz Ersen \n" "Language-Team: Türkçe \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Gtranslator 45.3\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Süt" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Sat" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "% olarak yükseklik" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "% olarak genişlik" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "" "%s, PDF dosyalarını yeniden düzenlemek ve değiştirmek için bir araçtır." #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "(Libhandy eksik)" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "(Yeniden başlatma gerektirir)" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "\"%s\" adında bir dosya zaten var. Değiştirmek istiyor musunuz?" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "_Aynı Dosyadan Tümü" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "Tüm dosyalar" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "Tüm sayfalar aynı boyutta olmalıdır." #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "Desteklenen tüm dosyalar" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "Kendiliğinden Döndür" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "Alt" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "Alttan Üste" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "Pano resmi" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Sütunlar" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "_Resmi Kopyala" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "_Metni Kopyala" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "Oluşturulma" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "Oluşturucu" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "Oluşturucu araç" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "Kenarları Kırp" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "Beyaz Kenarları Kırp" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" "Kırpma/gizleme PDF dosyasından herhangi bir içeriği kaldırmaz, yalnızca " "gizler." #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "_Kes" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "Uyarılara rağmen belge(ler)de görünür sorun yoktur." #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "Değişiklikler atılsın ve kapatılsın mı?" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "Değişiklikler atılsın ve çıkılsın mı?" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "Bu pencereyi yeniden gösterme." #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "Kaydet_me" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "Kaydederken uyarıları yeniden gösterme." #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "_Çoğalt" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "_Dışa Aktar" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "Seçimi Tek Dosyaya D_ışa Aktar…" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "_Özellikleri Düzenle" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "Özellikleri düzenle" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Eşit sütun genişliği" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Eşit satır yüksekliği" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "Resimlere dönüştürülüyor…" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "Seçimi _Ayrı Dosyalara Dışa Aktar…" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "_Tüm Sayfaları Ayrı Dosyalara Dışa Aktar…" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "Dışa Aktar…" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "Dosya ne pdf ne de resimdir" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "Açılacak dosya(lar)" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "Tam Sayfaya Sığdır" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "Yazdırılabilir Alana Sığdır" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "Daha fazla bilgi için bakınız:" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "Daha çok seçenek için bakınız:" #: data/menu.ui:259 msgid "Full_screen" msgstr "Tam _Ekran" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU Genel Kamu Lisansı (GPL) Sürüm 3." #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "Kitapçık Oluştur" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "Yükseklik" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "% olarak yükseklik" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "Kenarları Gizle" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "Yatay" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Yatay Bölmeler" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "Yatay ofset" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "Yalnızca img2pdf ile desteklenen resim dosyaları" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "Resim dosyası, img2pdf tarafından desteklenmiyor" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "Img2pdf eksik." #: data/pdfarranger.ui:58 msgid "Import" msgstr "İçe Aktar" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "İçe Aktar…" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "B_oş Sayfa Ekle…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "Boş Sayfa Ekle" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "Geçersiz tarih biçimi. Girdi görmezden gelindi." #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "libqpdf %s, pikepdf %s, GTK %s ve Python %s kullanmaktadır." #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "Anahtar sözcükler" #: pdfarranger/config.py:252 msgid "Language" msgstr "Dil" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "Sol" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "Soldan Sağa" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Ana Menü" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "Bakımcılar ve katkıcılar" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "Kenar" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "Sayfaları Birleştir" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "Birleştirilmiş sayfa boyutu:" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "Değiştirilme" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "Bir örnek olmayan sayfa boyutu - azami boyut kullanılıyor" #: pdfarranger/exporter.py:559 msgid "None" msgstr "Hiçbiri" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "Dikkat" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "Sınırlamalara dikkat edin:" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Aç" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "Aç…" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "Yer imleri ve bağlantılar yalnızca belirli durumlarda korunabilir." #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "Örtü" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger, kullanıcının etkileşimli ve sezgisel bir grafiksel arayüz " "kullanarak pdf belgelerini birleştirmesine veya bölmesine ve sayfalarını " "döndürmesine, kırpmasına ve yeniden düzenlemesine yardımcı olan küçük bir " "python-gtk uygulamasıdır. Pikepdf için bir ön yüzdür." #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "PDF belgesi hasarlı" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "PDF dosyaları" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "Sayfa Yönetimi" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "Sayfa Sırası" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "Sayfa Boyutu:" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "Sayfa boyutu" #: pdfarranger/core.py:457 msgid "Password" msgstr "Parola" #: pdfarranger/core.py:435 msgid "Password required" msgstr "Parola gerekli" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "Öz_el Yapıştır" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "_Örtü Olarak Yapıştır…" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "_Çift Sayfalar Olarak Yapıştır" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "_Tek Sayfalar Olarak Yapıştır" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "_Altlık Olarak Yapıştır…" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "_Sonrasına Yapıştır" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "_Öncesine Yapıştır" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "Yapıştırılan veri geçersiz. Yapıştırılmıyor." #: data/menu.ui:272 msgid "Pre_ferences" msgstr "_Tercihler" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "Tercihler" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "PDF Arranger sürümünü yazdır ve çık" #: pdfarranger/config.py:267 msgid "Printing" msgstr "Yazdırma" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "Yazdırılıyor…" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "Üretici" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "Özellik" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "Sırayı _Evir" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "Göreceli" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "Ön İzleme Oluşturuluyor…" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "Oluşturuluyor…" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "Değiştir" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "Sağ" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "Sağdan Sola" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Sola Döndür" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Sağa Döndür" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "So_la Döndür" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Satırlar" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "Aynı Sayfa _Biçimi" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Kaydet" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Farklı Kaydet" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "Farklı Kaydet…" #: data/menu.ui:47 msgid "Save _As…" msgstr "_Farklı Kaydet…" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "Kapatmadan önce değişiklikler kaydedilsin mi?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "Çıkmadan önce değişiklikler kaydedilsin mi?" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "Kapatmadan önce değişiklikler “{}” dosyasına kaydedilsin mi?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "Çıkmadan önce değişiklikler “{}” dosyasına kaydedilsin mi?" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "Kaydetme bazı uyarılar üretti" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "Kaydediliyor…" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "Ölçek çarpanı" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "Ölçek kipi:" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "_Tümünü Seç" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "_Çift Sayfaları Seç" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "_Tek Sayfaları Seç" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "Seçili sayfalar: " #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "Değerleri göster" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Sayfaları Böl" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "Konu" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "Desteklenen resim dosyaları" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "Sistem ayarı" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "“{}” belgesi kilitli ve açılmadan önce parola gerekiyor." #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "" "Sayfada birkaç resim var. Önce \"Resimlere Dönüştür\" seçeneğini kullanın." #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "Parola, siz PDF Arrangerʼi kapatana dek anımsanacak." #: pdfarranger/config.py:260 msgid "Theme" msgstr "Tema" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "Başlık" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "Üst" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "Üstten Alta" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "Altlık" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "Bilinmeyen dosya biçimi" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "Kullanım Kılavuzu" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "Değer" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "Dikey" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Dikey Bölmeler" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "Dikey ofset" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "Genişlik" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "% olarak genişlik" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "Kaydetmezseniz değişiklikleriniz yitecektir." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Yakınlaştır" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Uzaklaştır" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "Yakınlaştırmayı _Sığdır" #: data/menu.ui:247 msgid "Zoom _In" msgstr "_Yakınlaştır" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "_Uzaklaştır" #: data/menu.ui:278 msgid "_About" msgstr "_Hakkında" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "_Uygula" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "_İptal" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "_Kapat" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "K_opyala" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "Kenarları Kır_p…" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "_Sil" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "_Hiçbirini Seçme" #: data/menu.ui:87 msgid "_Edit" msgstr "_Düzenle" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "Resimlere _Dönüştür" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "_Ayıkla" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "Kenarları _Gizle…" #: data/menu.ui:30 msgid "_Import" msgstr "İç_e Aktar" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "Seçimi _Evir" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "Sayfaları _Birleştir…" #: data/menu.ui:36 msgid "_New Window" msgstr "_Yeni Pencere" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "_Tamam" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "_Aç" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "_Sayfa Boyutu…" #: data/menu.ui:71 msgid "_Print…" msgstr "_Yazdır…" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "_Çık" #: data/menu.ui:82 msgid "_Redo" msgstr "_Yinele" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "İptal _Et" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "Sağa Döndü_r" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "_Kaydet" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "_Seç" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "Sayfaları _Böl…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Geri Al" #: data/menu.ui:244 msgid "_View" msgstr "_Görünüm" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "mm" #: pdfarranger/core.py:326 msgid "page" msgstr "sayfa" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "başlıksız" pdfarranger-1.11.0/po/uk.po000066400000000000000000000524401463504064500154760ustar00rootroot00000000000000# Ukraininan translation for pdfarranger. # Copyright (C) 2023 THE pdfarranger COPYRIGHT HOLDER # This file is distributed under the same license as the pdfarranger package. # volkov , 2023. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2023-09-10 23:45+0300\n" "Last-Translator: volkov \n" "Language-Team: \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" "X-Generator: Poedit 3.3.1\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Стовпця" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Рядку" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "" "%s це інструмент для перестановки сторінок і редагування змісту PDF файлів." #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "(Бібліотека Libhandy відсутня)" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "(Потрібно перезавантажити додаток, щоб налаштування вступили в дію.)" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "Файл з ім'ям \"%s\" вже існує. Бажаєте перезаписати його?" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "Все із _одного файлу" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "Усі файли" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "Усі сторінки мають бути однакового розміру." #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "Усі підтримані файлі" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "Знизу" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "Знизу вгору" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "Зображення із буферу обміну" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Стовпців" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "Створено" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "Автор" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "Інструмент створення" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "Обрізати межи" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "Обрізати білі межи" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "Ви_різати" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "Не зважаючи на повідомлення, документ(и) не будуть мати помітних проблем." #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "Відкинути зміни та зачинити?" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "Відкинути зміни та закрити додаток?" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "Не показувати це діалогове вікно знову." #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "_Не зберігати" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "Не показувати це повідомлення при збереженні знову." #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "_Дублювати" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "_Експортувати" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "Експортувати обране в _один файл…" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "Редагувати влас_тивості" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "Редагувати властивості" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Рівна ширина столбців" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Рівна висота рядків" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "Експортувати обране в _індивідуальні файли…" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "Експортувати _усі сторінки в індивідуальні файли…" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "Експортувати…" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "Файл не є pdf або зображенням" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "Файл(и) для відкриття" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "Більше налаштувань можна знайти тут:" #: data/menu.ui:259 msgid "Full_screen" msgstr "Повний _екран" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL) Version 3." #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "Створити буклет" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "Висота" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Висота у процентах %" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "Горизонтально" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Горизонтальні поділки" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "Горизонтальний зсув" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "Файли зображень які підтримуються img2pdf" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "Формат зображення не підтримується img2pdf" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Імпортувати" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "Імпортувати…" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "Вставити _порожню сторінку…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "Вставити порожню сторінку" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "Не правильний формат даних. Вхідні дані відхилено." #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Цей додаток використовує libqpdf %s, pikepdf %s, GTK %s і Python %s." #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "Ключові слова" #: pdfarranger/config.py:252 msgid "Language" msgstr "Мова" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "Зліва" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "Зліва направо" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Головне меню" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "Розробники та спільнота" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "Поле" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "Об'єднання сторінок" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "Розмір об'єднаної сторінки:" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "Змінено" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "Не однаковий розмір сторінки - використовується максімальний розмір" #: pdfarranger/exporter.py:559 msgid "None" msgstr "" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Відкрити" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "Відкрити…" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "" #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "Накладка" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger це маленький python-gtk додаток, який допоможе користувачу " "зливати разом або розділяти pdf документи і перегортати, обрізати і " "переставляти місцями сторінки за допомогою інтерактивного і інтуітивного " "графічного інтерфейсу. Це графічна оболонка для pikepdf." #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "Цей PDF документ пошкоджений" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "PDF файли" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "Порядок сторінок" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "Розмір сторінки:" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "" #: pdfarranger/core.py:457 msgid "Password" msgstr "Пароль" #: pdfarranger/core.py:435 msgid "Password required" msgstr "Потрібен пароль" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "_Особлива вставка" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "Вставити як _накладку…" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "Вставити як _парні сторінки" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "Вставити як _непарні сторінки" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "Вставити як підкладку…" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "Вставити піс_ля" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "Вставити _до" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "Дані для вставки є не дійсними. Скасування вставки." #: data/menu.ui:272 msgid "Pre_ferences" msgstr "_Налаштування" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "Налаштування" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "Вивести версію PDF Arranger та вийти" #: pdfarranger/config.py:267 msgid "Printing" msgstr "" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "Друкувати…" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "Програма" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "Властивість" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "_Зворотний порядок" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "Відносний" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "Обробка попереднього перегляду…" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "Обробка…" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "Замінити" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "Справа" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "Справа наліво" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Перегорнути вліво" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Перегорнути вправо" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "Перегорнути в_ліво" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Рядки" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "Сторінки такого ж _формату" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Зберегти" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Зберегти як" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "Зберегти як…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Зберегти _як…" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "Зберегти зміни перед тим як закрити?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "Зберегти зміни перед тим як закрити додаток?" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "Зберегти зміну у “{}” перед тим як закрити?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "Зберегти зміни у “{}” перед тим як закрити додаток?" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "Збереження було завершено з деякими попередженнями" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "Збереження…" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "Масштаб" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "Обрати _усі" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "Обрати _парні сторінки" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "Обрати _непарні сторінки" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "Обрані сторінки: " #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Розділити сторінки" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "Тема" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "Підтримувані файли зображень" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "Системні налаштування" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "" "Документ “{}” заблокований і потребує пароль, перед тим як він зможе буде " "відкритим." #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "" #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "Пароль буде запам'ятовано доки ви не зачините PDF Arranger." #: pdfarranger/config.py:260 msgid "Theme" msgstr "Тема" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "Назва" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "Зверху" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "Зверху вниз" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "Підкладка" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "Невідомий формат файлу" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "Значення" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "Вертикальний" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Вертикальні поділки" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "Вертикальний зсув" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "Ширина" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Ширина у %" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "Ваші зміни будуть втрачені, якщо ви не збережете їх." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Збільшити" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Зменшити" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "Сторінка _повністю" #: data/menu.ui:247 msgid "Zoom _In" msgstr "З_більшити" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "З_меншити" #: data/menu.ui:278 msgid "_About" msgstr "Про програ_му" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "_Скасувати" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "За_крити" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "_Скопіювати" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "_Видалити" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "_Скасувати вибір" #: data/menu.ui:87 msgid "_Edit" msgstr "_Редагувати" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "" #: data/menu.ui:30 msgid "_Import" msgstr "_Імпортувати" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "_Інвертувати вибір" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "_Об'єднати сторінки…" #: data/menu.ui:36 msgid "_New Window" msgstr "_Нове вікно" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "_Добре" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "_Відкрити" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "" #: data/menu.ui:71 msgid "_Print…" msgstr "_Друк…" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "Ви_йти" #: data/menu.ui:82 msgid "_Redo" msgstr "_Повторити дію" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "Перегорнути в_право" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "_Зберегти" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "_Обрати" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "_Розділити сторінки…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Скасувати дію" #: data/menu.ui:244 msgid "_View" msgstr "Перегля_д" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "мм" #: pdfarranger/core.py:326 msgid "page" msgstr "сторінка" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "без назви" pdfarranger-1.11.0/po/updatepo.sh000077500000000000000000000020461463504064500166740ustar00rootroot00000000000000#!/bin/sh # # pdfarranger - GTK+ based utility for splitting, rearrangement and # modification of PDF documents. # Copyright (C) 2008-2017 Konstantinos Poulios # # pdfarranger 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. # # Update translation files cd "$(dirname "$0")/.." for po in po/*.po do msgmerge --backup none -U "$po" po/pdfarranger.pot msgattrib --no-obsolete --clear-fuzzy --empty -o "$po" "$po" done pdfarranger-1.11.0/po/zh_CN.po000066400000000000000000000426361463504064500160660ustar00rootroot00000000000000# PDF-Shuffler translation files. # Copyright (C) 2008-2017 Konstantinos Poulios # This file is part of PDF-Shuffler which is released under the GNU General # Public License version 3 or later. # See file COPYING or go to for full license details. # Translators: # Dean Lee , 2011,2014 msgid "" msgstr "" "Project-Id-Version: PDF-Shuffler 0.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2014-11-05 07:31+0000\n" "Last-Translator: Dean Lee \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/" "pdfshuffler/language/zh_CN/)\n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Col" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Row" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "% 高度" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "% 宽度" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s 是用于重新排列和修改 PDF 文件的工具。" #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "所有来自同一文件(_S)" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "所有文件" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "所有页面必须具有相同的大小。" #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "所有支持的文件" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "底部" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "剪贴板图像" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "列" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "已创建" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "创建者" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "创建者工具" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "裁剪边距" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "裁剪白色边框" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "" #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "剪切(_T)" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "尽管有警告,但文档应该没有明显的问题。" #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "放弃更改并关闭?" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "放弃更改并退出?" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "不要再显示此对话框。" #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "不保存(_N)" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "再次保存时不显示警告。" #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "重复(_I)" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "导出(_X)" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "导出所选到单个文件(_X)..." #: data/menu.ui:266 msgid "Edit _Properties" msgstr "编辑属性(_P)" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "编辑属性" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "列宽相等" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "行高相等" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "导出所选到个体文件(_I)..." #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "所有页面导出到个体文件(_A)..." #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "导出..." #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "文件既不是 PDF 也不是图像" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "要打开的文件" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "" #: data/menu.ui:259 msgid "Full_screen" msgstr "全屏幕(_C)" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU 通用公共许可证 (GPL) 第 3 版。" #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "生成手册" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "高度" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "高度 %" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "水平拆分" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "图像文件仅支持 img2pdf" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "img2pdf 不支持图片格式" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "" #: data/pdfarranger.ui:58 msgid "Import" msgstr "导入" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "导入..." #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "插入空白页面(_K)…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "插入空白页面" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "日期格式无效。 输入已放弃。" #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "它使用 libqpdf %s、pikepdf %s、GTK %s 和 Python %s。" #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "关键词" #: pdfarranger/config.py:252 msgid "Language" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "左边" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "主菜单" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "维护者和贡献者" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "已修改" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "" #: pdfarranger/exporter.py:559 msgid "None" msgstr "" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "打开" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "打开..." #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "" #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger 是一个小型的 python-gtk 应用程序,它可以帮助用户使用交互式和直观" "的图形界面来合并或拆分 pdf 文档以及旋转、裁剪和重新排列他们的页面。 它是 " "pikepdf 的前端。" #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "PDF 文件已损坏" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "PDF 文件" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "页面大小" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "" #: pdfarranger/core.py:457 msgid "Password" msgstr "密码" #: pdfarranger/core.py:435 msgid "Password required" msgstr "需要密码" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "特殊粘贴(_E)" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "粘贴为偶数页(_F)" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "粘贴为奇数页(_O)" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "粘贴之后(_A)" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "粘贴之前(_B)" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "粘贴的数据无效。 中止粘贴。" #: data/menu.ui:272 msgid "Pre_ferences" msgstr "" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "打印 PDF Arranger 版本并退出" #: pdfarranger/config.py:267 msgid "Printing" msgstr "" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "正在打印..." #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "制作者" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "属性" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "相反顺序(_V)" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "相对" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "渲染预览…" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "正在渲染..." #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "右边" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "向左旋转" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "向右旋转" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "向左旋转(_L)" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "行" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "相同页面格式(_F)" #: data/pdfarranger.ui:78 msgid "Save" msgstr "保存" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "另存为" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "保存为" #: data/menu.ui:47 msgid "Save _As…" msgstr "另存为(_A)..." #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "关闭前保存更改?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "退出前保存更改?" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "在关闭之前保存对“{}”的更改?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "退出前保存对“{}”的更改?" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "保存会产生一些警告" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "正在保存..." #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "比例因子" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "全选(_A)" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "选择偶数页面(_E)" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "选择奇数页面(_O)" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "所选页面:" #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "拆分页面" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "主题" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "支持的图像文件" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "文档“{}”被锁定,需要密码才能打开。" #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "" #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "密码将被记住,直到您关闭 PDF Arranger。" #: pdfarranger/config.py:260 msgid "Theme" msgstr "" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "标题" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "顶部" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "未知文件格式" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "值" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "垂直拆分" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "宽度" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "宽度 %" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "如果您不保存,您的更改将会丢失。" #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "放大" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "缩小" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "缩放适合(_F)" #: data/menu.ui:247 msgid "Zoom _In" msgstr "放大(_I)" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "缩小(_O)" #: data/menu.ui:278 msgid "_About" msgstr "关于(_A)" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "取消(_C)" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "关闭(_C)" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "复制(_C)" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "删除(_D)" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "取消全选(_D)" #: data/menu.ui:87 msgid "_Edit" msgstr "编辑(_E)" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "" #: data/menu.ui:30 msgid "_Import" msgstr "导入(_I)" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "反向选择(_I)" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "" #: data/menu.ui:36 msgid "_New Window" msgstr "新建窗口(_N)" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "打开(_O)" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "" #: data/menu.ui:71 msgid "_Print…" msgstr "打印(_P)" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "退出(_Q)" #: data/menu.ui:82 msgid "_Redo" msgstr "重做(_R)" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "向右旋转(_R)" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "保存(_S)" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "选择(_S)" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "拆分页面(_S)…" #: data/menu.ui:78 msgid "_Undo" msgstr "撤销(_U)" #: data/menu.ui:244 msgid "_View" msgstr "查看(_V)" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "mm" #: pdfarranger/core.py:326 msgid "page" msgstr "页面" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "未命名" pdfarranger-1.11.0/po/zh_TW.po000066400000000000000000000453121463504064500161120ustar00rootroot00000000000000# pdfarranger translation files. # Copyright (C) 2020 Jérôme Robert # This file is part of pdfarranger which is released under the GNU General # Public License version 3 or later. # See file COPYING or go to for full license details. # Translators: # 錢政維 , 2024 # Franklin Weng , 2013. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-24 20:19+0100\n" "PO-Revision-Date: 2024-03-20 17:20+0800\n" "Last-Translator: 錢政維 \n" "Language-Team: \n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Poedit-SourceCharset: utf-8\n" "X-Generator: Poedit 3.4.2\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#欄" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#列" #: pdfarranger/pageutils.py:127 pdfarranger/pageutils.py:453 #: pdfarranger/pageutils.py:455 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of height" msgstr "(%)頁高" #: pdfarranger/pageutils.py:176 #, python-format msgid "% of width" msgstr "(%)頁寬" #: pdfarranger/pdfarranger.py:2764 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s 是一個用來重新排列和修改 PDF 檔案的工具。" #: pdfarranger/config.py:262 msgid "(Libhandy missing)" msgstr "(Libhandy 未安裝)" #: pdfarranger/config.py:254 msgid "(Requires restart)" msgstr "(需要重新啟動)" #: pdfarranger/pdfarranger.py:1144 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "名為 \"%s\" 的檔案已存在。您確定要覆寫嗎?" #: data/menu.ui:227 data/menu.ui:391 msgid "All From _Same File" msgstr "相同檔案的所有頁面(_S)" #: pdfarranger/pdfarranger.py:518 msgid "All files" msgstr "所有檔案" #: pdfarranger/pdfarranger.py:470 msgid "All pages must have the same size." msgstr "所有頁面大小必須一致。" #: pdfarranger/pdfarranger.py:506 msgid "All supported files" msgstr "所有支援的檔案" #: pdfarranger/exporter.py:563 msgid "Auto Rotate" msgstr "自動旋轉" #: pdfarranger/pageutils.py:154 msgid "Bottom" msgstr "下" #: pdfarranger/pageutils.py:386 msgid "Bottom to Top" msgstr "由下而上" #: pdfarranger/core.py:569 msgid "Clipboard image" msgstr "剪貼簿內的影像" #: pdfarranger/pageutils.py:369 pdfarranger/splitter.py:60 msgid "Columns" msgstr "欄數" #: data/menu.ui:141 data/menu.ui:354 msgid "Copy _Image" msgstr "複製影像(_I)" #: data/menu.ui:146 data/menu.ui:359 msgid "Copy _Text" msgstr "複製文字(_T)" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "建立日期" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "作者" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "應用程式" #: pdfarranger/pageutils.py:846 msgid "Crop Margins" msgstr "裁切邊界" #: data/menu.ui:174 data/menu.ui:432 msgid "Crop White Borders" msgstr "裁切白邊" #: pdfarranger/pageutils.py:166 pdfarranger/pdfarranger.py:2730 msgid "" "Cropping/hiding does not remove any content from the PDF file, it only hides " "it." msgstr "裁切或隱藏並不會從 PDF 檔案移除任何內容,只是隱藏起來。" #: data/menu.ui:94 data/menu.ui:302 msgid "Cu_t" msgstr "剪下(_T)" #: pdfarranger/pdfarranger.py:1258 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "儘管有警告訊息,文件應該不會有明顯的問題。" #: pdfarranger/pdfarranger.py:993 msgid "Discard changes and close?" msgstr "您確定要放棄修改並關閉檔案?" #: pdfarranger/pdfarranger.py:1030 msgid "Discard changes and quit?" msgstr "您確定要放棄修改並結束程式?" #: pdfarranger/pdfarranger.py:2737 msgid "Do not show this dialog again." msgstr "不要再顯示這個對話框。" #: pdfarranger/pdfarranger.py:984 msgid "Do_n’t Save" msgstr "不儲存(_N)" #: pdfarranger/pdfarranger.py:1265 msgid "Don't show warnings when saving again." msgstr "再次儲存時不要顯示警告訊息。" #: data/menu.ui:178 data/menu.ui:436 msgid "Dupl_icate" msgstr "複寫(_I)" #: data/menu.ui:52 data/menu.ui:462 msgid "E_xport" msgstr "匯出(_X)" #: data/menu.ui:55 data/menu.ui:465 msgid "E_xport Selection to a Single File…" msgstr "將選取頁面匯出成一個檔案(_X)…" #: data/menu.ui:266 msgid "Edit _Properties" msgstr "編輯文件內容(_P)" #: pdfarranger/metadata.py:202 msgid "Edit properties" msgstr "編輯文件內容" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "平均分配欄寬" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "平均分配列高" #: pdfarranger/pdfarranger.py:1792 msgid "Exploding into images…" msgstr "轉換成多張影像…" #: data/menu.ui:60 data/menu.ui:470 msgid "Export Selection to _Individual Files…" msgstr "將選取頁面細分成單頁檔案(_I)…" #: data/menu.ui:65 data/menu.ui:475 msgid "Export _All Pages to Individual Files…" msgstr "將所有頁面細分成單頁檔案(_A)…" #: pdfarranger/pdfarranger.py:1102 msgid "Export…" msgstr "匯出…" #: pdfarranger/core.py:571 pdfarranger/pdfarranger.py:1512 msgid "File is neither pdf nor image" msgstr "檔案既不是 PDF 也不是影像" #: pdfarranger/pdfarranger.py:300 msgid "File(s) to open" msgstr "要開啟的檔案" #: pdfarranger/exporter.py:561 msgid "Fit to Full Page" msgstr "符合整頁" #: pdfarranger/exporter.py:560 msgid "Fit to Printable Area" msgstr "符合可列印範圍" #: pdfarranger/pdfarranger.py:2734 msgid "For more info see" msgstr "更多資訊請見" #: pdfarranger/config.py:271 msgid "For more options see:" msgstr "更多選項請見:" #: data/menu.ui:259 msgid "Full_screen" msgstr "全螢幕" #: pdfarranger/pdfarranger.py:2778 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU 通用公眾授權條款 (GPL) 第 3 版。" #: data/menu.ui:198 data/menu.ui:456 msgid "Generate Booklet" msgstr "製作小冊子" #: pdfarranger/pageutils.py:248 pdfarranger/pageutils.py:252 #: pdfarranger/pageutils.py:334 msgid "Height" msgstr "頁高" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "列高(%)" #: pdfarranger/pageutils.py:846 msgid "Hide Margins" msgstr "隱藏邊界" #: pdfarranger/pageutils.py:381 msgid "Horizontal" msgstr "循列排列" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "橫切" #: pdfarranger/pageutils.py:452 msgid "Horizontal offset" msgstr "水平位移" #: pdfarranger/core.py:560 msgid "Image files are only supported with img2pdf" msgstr "必須安裝 img2pdf 才能支援影像檔" #: pdfarranger/core.py:566 msgid "Image format is not supported by img2pdf" msgstr "img2pdf 不支援此種影像格式" #: pdfarranger/pdfarranger.py:1789 msgid "Img2pdf missing." msgstr "img2pdf 未安裝。" #: data/pdfarranger.ui:58 msgid "Import" msgstr "匯入" #: pdfarranger/pdfarranger.py:1335 msgid "Import…" msgstr "匯入…" #: data/menu.ui:194 data/menu.ui:452 msgid "Insert Blan_k Page…" msgstr "插入空白頁(_K)…" #: pdfarranger/pageutils.py:331 msgid "Insert Blank Page" msgstr "插入空白頁" #: pdfarranger/metadata.py:173 msgid "Invalid date format. Input discarded." msgstr "無效的日期格式。輸入值不採用。" #: pdfarranger/pdfarranger.py:2767 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "它使用 libqpdf %s, pikepdf %s, GTK %s 及 Python %s。" #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "關鍵字" #: pdfarranger/config.py:252 msgid "Language" msgstr "介面語言" #: pdfarranger/pageutils.py:154 msgid "Left" msgstr "左" #: pdfarranger/pageutils.py:383 msgid "Left to Right" msgstr "由左至右" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "主選單" #: pdfarranger/pdfarranger.py:2773 msgid "Maintainers and contributors" msgstr "維護者及貢獻者" #: pdfarranger/pageutils.py:367 msgid "Margin" msgstr "邊界" #: pdfarranger/pageutils.py:353 msgid "Merge Pages" msgstr "合併頁面" #: pdfarranger/pageutils.py:418 msgid "Merged page size:" msgstr "合併後頁面大小:" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "修改日期" #: pdfarranger/pageutils.py:398 msgid "Non-uniform page size - using max size" msgstr "頁面大小不一致 - 依最大頁面為準" #: pdfarranger/exporter.py:559 msgid "None" msgstr "實際大小" #: pdfarranger/pdfarranger.py:2723 msgid "Note" msgstr "注意" #: pdfarranger/pdfarranger.py:2729 msgid "Note the limitations:" msgstr "請注意以下限制:" #: data/pdfarranger.ui:37 msgid "Open" msgstr "開啟舊檔" #: pdfarranger/pdfarranger.py:1200 msgid "Open…" msgstr "開啟舊檔…" #: pdfarranger/pdfarranger.py:2731 msgid "Outlines and links can be preserved only in certain cases." msgstr "在特定情形下才能保留大綱及連結。" #: pdfarranger/pageutils.py:899 msgid "Overlay" msgstr "置於上層" #: pdfarranger/pdfarranger.py:281 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger 是一個用 python-gtk 寫的小程式,讓使用者能透過直覺的互動式圖形" "介面,合併、分割 PDF 文件並裁切及重新排列頁面。它是 pikepdf 的前端之一。" #: pdfarranger/pdfarranger.py:1506 msgid "PDF document is damaged" msgstr "PDF 文件已損毀" #: pdfarranger/pdfarranger.py:510 msgid "PDF files" msgstr "PDF 檔案" #: pdfarranger/exporter.py:599 msgid "Page Handling" msgstr "版面設定" #: pdfarranger/pageutils.py:394 msgid "Page Order" msgstr "頁面排序" #: pdfarranger/pdfarranger.py:2801 msgid "Page Size:" msgstr "頁面大小:" #: pdfarranger/pageutils.py:243 msgid "Page size" msgstr "頁面大小" #: pdfarranger/core.py:457 msgid "Password" msgstr "密碼" #: pdfarranger/core.py:435 msgid "Password required" msgstr "必須輸入密碼" #: data/menu.ui:107 data/menu.ui:315 msgid "Past_e Special" msgstr "選擇性貼上(_E)" #: data/menu.ui:124 data/menu.ui:333 msgid "Paste As O_verlay…" msgstr "貼在此頁上層(_V)…" #: data/menu.ui:119 data/menu.ui:328 msgid "Paste As _Even Pages" msgstr "貼上成為偶數頁(_E)" #: data/menu.ui:114 data/menu.ui:323 msgid "Paste As _Odd Pages" msgstr "貼上成為奇數頁(_O)" #: data/menu.ui:129 data/menu.ui:338 msgid "Paste As _Underlay…" msgstr "貼在此頁下層(_U)…" #: data/menu.ui:102 data/menu.ui:310 msgid "Paste _After" msgstr "貼在此頁之後(_A)" #: data/menu.ui:109 data/menu.ui:318 msgid "Paste _Before" msgstr "貼在此頁之前(_B)" #: pdfarranger/pdfarranger.py:1636 msgid "Pasted data not valid. Aborting paste." msgstr "貼上的資料無效。取消貼上。" #: data/menu.ui:272 msgid "Pre_ferences" msgstr "偏好設定(_F)" #: pdfarranger/config.py:242 msgid "Preferences" msgstr "偏好設定" #: pdfarranger/pdfarranger.py:292 msgid "Print the version of PDF Arranger and exit" msgstr "列出 PDF Arranger 版本並結束" #: pdfarranger/config.py:267 msgid "Printing" msgstr "列印" #: pdfarranger/exporter.py:579 msgid "Printing…" msgstr "列印…" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "PDF 製作程式" #: pdfarranger/metadata.py:216 msgid "Property" msgstr "文件內容" #: data/menu.ui:182 data/menu.ui:440 msgid "Re_verse Order" msgstr "反向排列(_v)" #: pdfarranger/pageutils.py:250 msgid "Relative" msgstr "相對值" #: pdfarranger/exporter.py:617 msgid "Rendering Preview…" msgstr "正在渲染預覽…" #: pdfarranger/pdfarranger.py:746 msgid "Rendering…" msgstr "正在渲染…" #: pdfarranger/pdfarranger.py:1146 msgid "Replace" msgstr "取代" #: pdfarranger/pageutils.py:154 msgid "Right" msgstr "右" #: pdfarranger/pageutils.py:384 msgid "Right to Left" msgstr "由右至左" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "向左旋轉" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "向右旋轉" #: data/menu.ui:152 data/menu.ui:410 msgid "Rotate _Left" msgstr "向左旋轉(_L)" #: pdfarranger/pageutils.py:370 pdfarranger/splitter.py:60 msgid "Rows" msgstr "列數" #: data/menu.ui:232 data/menu.ui:396 msgid "Same Page _Format" msgstr "相同頁面格式(_F)" #: data/pdfarranger.ui:78 msgid "Save" msgstr "儲存" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "另存新檔" #: pdfarranger/pdfarranger.py:1102 msgid "Save As…" msgstr "另存新檔…" #: data/menu.ui:47 msgid "Save _As…" msgstr "另存新檔(_A)…" #: pdfarranger/pdfarranger.py:1002 msgid "Save changes before closing?" msgstr "關閉檔案前要儲存修改嗎?" #: pdfarranger/pdfarranger.py:1039 msgid "Save changes before quitting?" msgstr "結束程式前要儲存修改嗎?" #: pdfarranger/pdfarranger.py:999 msgid "Save changes to “{}” before closing?" msgstr "關閉檔案前要儲存修改至 “{}” 嗎?" #: pdfarranger/pdfarranger.py:1036 msgid "Save changes to “{}” before quitting?" msgstr "結束程式前要儲存修改至 “{}” 嗎?" #: pdfarranger/pdfarranger.py:1257 msgid "Saving produced some warnings" msgstr "儲存時有警告訊息" #: pdfarranger/pdfarranger.py:1296 msgid "Saving…" msgstr "儲存…" #: pdfarranger/pageutils.py:121 msgid "Scale factor" msgstr "縮放比例" #: pdfarranger/exporter.py:557 msgid "Scale mode:" msgstr "縮放模式:" #: data/menu.ui:207 data/menu.ui:371 msgid "Select _All" msgstr "全部選取(_A)" #: data/menu.ui:222 data/menu.ui:386 msgid "Select _Even Pages" msgstr "選取偶數頁(_E)" #: data/menu.ui:217 data/menu.ui:381 msgid "Select _Odd Pages" msgstr "選取奇數頁(_O)" #: pdfarranger/pdfarranger.py:2796 msgid "Selected pages: " msgstr "選取頁面:" #: pdfarranger/pageutils.py:548 msgid "Show values" msgstr "顯示值" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "分割頁面" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "主題" #: pdfarranger/pdfarranger.py:523 msgid "Supported image files" msgstr "支援的影像檔" #: pdfarranger/config.py:282 pdfarranger/config.py:290 msgid "System setting" msgstr "依系統設定" #: pdfarranger/core.py:447 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "文件 “{}” 有密碼保護,必須輸入密碼才能開啟。" #: pdfarranger/pdfarranger.py:1765 msgid "The page has several images. Use \"Explode into Images\" first.\"" msgstr "此頁面有多張影像。請先執行「展開多張影像」。\"" #: pdfarranger/core.py:446 msgid "The password will be remembered until you close PDF Arranger." msgstr "此密碼會保存到您關閉 PDF Arranger 為止。" #: pdfarranger/config.py:260 msgid "Theme" msgstr "佈景主題" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "標題" #: pdfarranger/pageutils.py:154 msgid "Top" msgstr "上" #: pdfarranger/pageutils.py:385 msgid "Top to Bottom" msgstr "由上而下" #: pdfarranger/pageutils.py:899 msgid "Underlay" msgstr "置於下層" #: pdfarranger/core.py:544 pdfarranger/pdfarranger.py:1502 msgid "Unknown file format" msgstr "未知的檔案格式" #: pdfarranger/pdfarranger.py:2735 msgid "User Manual" msgstr "使用者手冊" #: pdfarranger/metadata.py:216 msgid "Value" msgstr "值" #: pdfarranger/pageutils.py:382 msgid "Vertical" msgstr "循欄排列" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "縱切" #: pdfarranger/pageutils.py:454 msgid "Vertical offset" msgstr "垂直位移" #: pdfarranger/pageutils.py:247 pdfarranger/pageutils.py:251 #: pdfarranger/pageutils.py:333 msgid "Width" msgstr "頁寬" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "欄寬(%)" #: pdfarranger/pdfarranger.py:983 msgid "Your changes will be lost if you don’t save them." msgstr "您所做的修改若不儲存將會遺失。" #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "放大顯示" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "縮小顯示" #: data/menu.ui:255 msgid "Zoom _Fit" msgstr "縮放至符合視窗(_F)" #: data/menu.ui:247 msgid "Zoom _In" msgstr "放大顯示(_I)" #: data/menu.ui:251 msgid "Zoom _Out" msgstr "縮小顯示(_O)" #: data/menu.ui:278 msgid "_About" msgstr "關於(_A)" #: pdfarranger/pageutils.py:856 msgid "_Apply" msgstr "套用(_A)" #: pdfarranger/config.py:246 pdfarranger/pageutils.py:227 #: pdfarranger/pdfarranger.py:975 pdfarranger/pdfarranger.py:984 #: pdfarranger/pdfarranger.py:1108 pdfarranger/pdfarranger.py:1158 msgid "_Cancel" msgstr "取消(_C)" #: pdfarranger/pdfarranger.py:994 data/menu.ui:284 msgid "_Close" msgstr "關閉檔案(_C)" #: data/menu.ui:98 data/menu.ui:306 msgid "_Copy" msgstr "複製(_C)" #: data/menu.ui:166 data/menu.ui:424 msgid "_Crop Margins…" msgstr "裁切邊界(_C)…" #: data/menu.ui:90 data/menu.ui:298 msgid "_Delete" msgstr "刪除(_D)" #: data/menu.ui:212 data/menu.ui:376 msgid "_Deselect All" msgstr "全部取消選取(_D)" #: data/menu.ui:87 msgid "_Edit" msgstr "編輯(_E)" #: data/menu.ui:137 data/menu.ui:350 msgid "_Explode into Images" msgstr "展開多張影像(_E)" #: data/menu.ui:135 data/menu.ui:347 msgid "_Extract" msgstr "擷取(_E)" #: data/menu.ui:170 data/menu.ui:428 msgid "_Hide Margins…" msgstr "隱藏邊界(_H)…" #: data/menu.ui:30 msgid "_Import" msgstr "匯入(_I)" #: data/menu.ui:237 data/menu.ui:401 msgid "_Invert Selection" msgstr "反向選取(_I)" #: data/menu.ui:190 data/menu.ui:448 msgid "_Merge Pages…" msgstr "合併頁面(_M)…" #: data/menu.ui:36 msgid "_New Window" msgstr "開新視窗(_N)" #: pdfarranger/config.py:247 pdfarranger/pageutils.py:228 msgid "_OK" msgstr "確定(_O)" #: pdfarranger/pdfarranger.py:1157 data/menu.ui:24 msgid "_Open" msgstr "開啟舊檔(_O)" #: data/menu.ui:162 data/menu.ui:420 msgid "_Page Size…" msgstr "頁面大小(_P)…" #: data/menu.ui:71 msgid "_Print…" msgstr "列印(_P)…" #: pdfarranger/pdfarranger.py:1031 data/menu.ui:290 msgid "_Quit" msgstr "結束程式(_Q)" #: data/menu.ui:82 msgid "_Redo" msgstr "取消復原(_R)" #: pdfarranger/pageutils.py:856 msgid "_Revert" msgstr "還原(_R)" #: data/menu.ui:157 data/menu.ui:415 msgid "_Rotate Right" msgstr "向右旋轉(_R)" #: pdfarranger/pdfarranger.py:984 pdfarranger/pdfarranger.py:1107 #: data/menu.ui:42 msgid "_Save" msgstr "儲存(_S)" #: data/menu.ui:204 data/menu.ui:368 msgid "_Select" msgstr "選取(_S)" #: data/menu.ui:186 data/menu.ui:444 msgid "_Split Pages…" msgstr "分割頁面(_S)…" #: data/menu.ui:78 msgid "_Undo" msgstr "復原(_U)" #: data/menu.ui:244 msgid "_View" msgstr "檢視(_V)" #: pdfarranger/pageutils.py:144 pdfarranger/pageutils.py:368 #: pdfarranger/pageutils.py:418 msgid "mm" msgstr "mm" #: pdfarranger/core.py:326 msgid "page" msgstr "頁面" #: pdfarranger/pdfarranger.py:825 msgid "untitled" msgstr "未命名" pdfarranger-1.11.0/setup.py000077500000000000000000000100141463504064500156050ustar00rootroot00000000000000#!/usr/bin/env python3 # # pdfarranger - GTK+ based utility for splitting, rearrangement and # modification of PDF documents. # Copyright (C) 2008-2017 Konstantinos Poulios # # 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from setuptools import Command from setuptools import setup from setuptools import __version__ as setuptools_version # support distros that ship old setuptools setuptools_version = tuple(int(n) for n in setuptools_version.split('.')[:2]) if setuptools_version < (65, 2): from distutils.command.build import build else: from setuptools.command.build import build from os.path import join import glob import os import subprocess data_files = [ ('share/applications', ['data/com.github.jeromerobert.pdfarranger.desktop']), ('share/pdfarranger', ['data/pdfarranger.ui', 'data/menu.ui']), ('share/man/man1', ['doc/pdfarranger.1']), ('share/metainfo', ['data/com.github.jeromerobert.pdfarranger.metainfo.xml']), ] def _dir_to_data_files(src_dir, target_dir): data_files = [] for root, _, files in os.walk(src_dir): tgt = join(target_dir, os.path.relpath(root, src_dir)) if files: data_files.append((tgt, [join(root, f) for f in files])) return data_files def _data_files(command): """Return the data_files of a command""" data_files = command.distribution.data_files if data_files is None: data_files = [] command.distribution.data_files = data_files return data_files class build_i18n(Command): description = "Build gettext .mo files" def initialize_options(self): self.build_base = None def finalize_options(self): self.set_undefined_options("build", ("build_base", "build_base")) def run(self): mo_dir = join(self.build_base, "mo") for filename in glob.glob(join("po", "*.po")): lang = os.path.basename(filename)[:-3] lang_dir = join(self.build_base, "mo", lang, "LC_MESSAGES") os.makedirs(lang_dir, exist_ok=True) subprocess.check_call( ["msgfmt", filename, "-o", join(lang_dir, "pdfarranger.mo")] ) data_files = _data_files(self) data_files += _dir_to_data_files(mo_dir, join("share", "locale")) class build_icons(Command): description = "Ensure icons get installed" def initialize_options(self): pass def finalize_options(self): pass def run(self): src_icons = join("data", "icons") tgt_icons = join("share", "icons") data_files = _data_files(self) data_files += _dir_to_data_files(src_icons, tgt_icons) build.sub_commands += [(x, lambda _: True) for x in ["build_i18n", "build_icons"]] setup( name='pdfarranger', version='1.11.0', author='Jerome Robert', author_email='jeromerobert@gmx.com', description='A simple application for PDF Merging, Rearranging, and Splitting', url='https://github.com/pdfarranger/pdfarranger', license='GNU GPL-3', packages=['pdfarranger'], data_files=data_files, zip_safe=False, cmdclass={ "build": build, "build_i18n": build_i18n, "build_icons": build_icons, }, entry_points={ 'console_scripts': ['pdfarranger=pdfarranger.pdfarranger:main'] }, install_requires=['pikepdf>=6','python-dateutil>=2.4.0', 'packaging'], extras_require={ 'image': ['img2pdf>=0.3.4'], }, ) pdfarranger-1.11.0/setup_win32.py000066400000000000000000000136701463504064500166370ustar00rootroot00000000000000VERSION='1.11.0' from cx_Freeze import setup, Executable import os import sys import distutils import shutil import glob include_files = [ ('data/pdfarranger.ui', 'share/pdfarranger/pdfarranger.ui'), ('data/menu.ui', 'share/pdfarranger/menu.ui'), ('data/icons/hicolor/scalable', 'share/icons/hicolor/scalable'), ('build/mo', 'share/locale'), ] def clean_build(): dirs = os.listdir('build') keep = ['mo', 'lib'] for d in dirs: if d not in keep: shutil.rmtree(os.path.join('build', d)) clean_build() def addfile(relpath, warn_missing=False): f = os.path.join(sys.prefix, relpath) if warn_missing and not os.path.isfile(f): print("{} cannot be found.".format(f), file=sys.stderr) else: include_files.append((f, relpath)) def addlocale(name): langs = os.listdir('build/mo') for path in glob.glob(os.path.join(sys.prefix, "share/locale/*/LC_MESSAGES/{}.mo".format(name))): lang = os.path.split(os.path.split(os.path.split(path)[0])[0])[1] if lang in langs: addfile(os.path.relpath(path, sys.prefix)) addlocale("gtk30") def addicons(): addfile("share/icons/hicolor/index.theme") addfile("share/icons/Adwaita/index.theme") for i in ['places/folder', 'mimetypes/text-x-generic']: addfile(os.path.join('share/icons/Adwaita/16x16/', i + '.png')) icons = [ 'places/user-desktop', 'places/user-home', 'actions/bookmark-new', 'actions/document-open-recent', 'actions/folder-new', 'actions/list-add', 'actions/list-remove', 'actions/media-eject', 'actions/document-save', 'actions/document-save-as', 'actions/document-open', 'actions/insert-image', 'actions/object-rotate-left', 'actions/object-rotate-right', 'actions/open-menu', 'actions/zoom-in', 'actions/zoom-out', 'ui/pan-down', 'ui/pan-end', 'ui/pan-start', 'ui/pan-up', 'ui/window-close', 'ui/window-maximize', 'ui/window-minimize', 'ui/window-restore', 'devices/drive-harddisk', 'devices/drive-optical', 'places/folder-documents', 'places/folder-download', 'places/folder-music', 'places/folder-pictures', 'places/folder-videos', 'places/user-trash', ] for i in icons: addfile(os.path.join('share/icons/Adwaita/symbolic/', i + '-symbolic.svg')) required_dlls = [ 'poppler-glib-8', 'handy-1-0', ] for dll in required_dlls: fn = 'lib' + dll + '.dll' include_files.append((os.path.join(sys.prefix, 'bin', fn), fn)) required_gi_namespaces = [ "Gtk-3.0", "Gdk-3.0", "cairo-1.0", "Pango-1.0", "GObject-2.0", "GLib-2.0", "Gio-2.0", "GdkPixbuf-2.0", "GModule-2.0", "Atk-1.0", "Poppler-0.18", "HarfBuzz-0.0", "Handy-1", "freetype2-2.0", ] for ns in required_gi_namespaces: addfile("lib/girepository-1.0/{}.typelib".format(ns)) addfile("lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-bmp.dll") addfile("lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-svg.dll") addfile("lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-png.dll") addfile("lib/gdk-pixbuf-2.0/2.10.0/loaders.cache") addfile("share/glib-2.0/schemas/gschemas.compiled") addicons() # gspawn-helper is needed for website link in AboutDialog from_path = os.path.join(sys.prefix, 'bin', 'gspawn-win64-helper.exe') to_path = 'gspawn-win64-helper.exe' include_files.append((from_path, to_path)) build_options = dict( packages=['gi', 'packaging', 'pikepdf'], excludes=['tkinter', 'test'], include_files=include_files, ) def get_target_name(suffix): return 'pdfarranger-{}-windows-{}'.format(VERSION, suffix) msi_options = dict( upgrade_code='{ab1752a6-575c-42e1-a261-b85cb8a6b524}' ) class bdist_zip(distutils.cmd.Command): """ Minimalist command to create a Windows portable .zip distribution """ description = "create a \"zip\" distribution" user_options = [] def initialize_options(self): pass def finalize_options(self): pass def run(self): build_base = self.get_finalized_command('build').build_base build_exe = self.get_finalized_command('build_exe') fullname = self.distribution.get_fullname() build_exe.build_exe = os.path.join(build_base, fullname) build_exe.run() config_ini = os.path.join(build_exe.build_exe, 'config.ini') f = open(config_ini, 'w') f.close() dist_dir = self.get_finalized_command('bdist').dist_dir archname = os.path.join(dist_dir, get_target_name('portable')) self.make_archive(archname, 'zip', root_dir=build_base, base_dir=fullname) shutil.rmtree(build_exe.build_exe) setup(name='pdfarranger', version=VERSION, description='A simple application for PDF Merging, Rearranging, and Splitting', options=dict(build_exe=build_options, bdist_msi=msi_options), cmdclass={'bdist_zip': bdist_zip}, packages=['pdfarranger'], executables=[Executable('pdfarranger/__main__.py', base='Win32GUI' if sys.platform == 'win32' else None, target_name='pdfarranger.exe', icon='data/pdfarranger.ico', shortcut_name='PDF Arranger', shortcut_dir='StartMenuFolder' )]) def rename_msi(): # cx_freeze 6.15: Workaround for having different filename and "ProductName" for the msi. dist_dir = os.path.join(os.getcwd(), 'dist') msi = [f for f in os.listdir(dist_dir) if f.endswith('.msi')] if len(msi) > 0: old_name = os.path.join(dist_dir, msi[0]) new_name = os.path.join(dist_dir, get_target_name('installer.msi')) shutil.move(old_name, new_name) if 'bdist_msi' in sys.argv: rename_msi() pdfarranger-1.11.0/snapcraft.yaml000066400000000000000000000054451463504064500167510ustar00rootroot00000000000000name: pdfarranger base: core22 adopt-info: pdfarranger grade: stable confinement: strict compression: lzo architectures: - build-on: amd64 - build-on: arm64 slots: pdfarranger: interface: dbus bus: session name: com.github.jeromerobert.pdfarranger plugs: shared-memory: private: true apps: pdfarranger: command: usr/bin/pdfarranger desktop: usr/share/applications/com.github.jeromerobert.pdfarranger.desktop extensions: - gnome plugs: - home common-id: com.github.jeromerobert.pdfarranger environment: PYTHONPATH: $SNAP/usr/lib/python3.10/dist-packages:$PYTHONPATH parts: pdfarranger: plugin: python source: https://github.com/pdfarranger/pdfarranger.git parse-info: - usr/share/metainfo/com.github.jeromerobert.pdfarranger.metainfo.xml source-depth: 1 python-packages: - distutils-extra-python==2.39.2 - lxml==4.9.2 - packaging==23.1 - pillow==9.5.0 - pybind11==2.10.4 - setuptools-scm==7.1.0 - tomli==2.0.1 - typing_extensions==4.6.3 - deprecation==2.1.0 - pikepdf==7.2.0 - python_dateutil==2.8.2 - img2pdf==0.4.4 build-environment: - PATH: ${CRAFT_PART_INSTALL}/bin:${PATH} - PYTHONPATH: '' build-packages: - intltool prime: - -usr/bin/activate - -usr/bin/activate.csh - -usr/bin/activate.fish - -usr/bin/Activate.ps1 - -usr/bin/python - -usr/bin/python3 - -usr/bin/python3.10 - -usr/bin/pip - -usr/bin/pip3 - -usr/bin/pip3.10 - -pyvenv.cfg - -include - -etc - -lib - -usr/lib/python3.10/site-packages/distutils_extra_python-2.39.2.dist-info - -usr/lib/python3.10/site-packages/_distutils_hack - -usr/lib/python3.10/site-packages/pikepdf.libs - -usr/lib/python3.10/site-packages/Pillow.libs - -usr/lib/python3.10/site-packages/pip* - -usr/lib/python3.10/site-packages/pkg_re* - -usr/lib/python3.10/site-packages/setuptools - -usr/lib/python3.10/site-packages/setuptools-59* - -usr/lib/python3.10/site-packages/six* - -lib64 organize: bin: usr/bin share: usr/share lib/python3.10/site-packages: usr/lib/python3.10/dist-packages deps: plugin: nil stage-packages: - gir1.2-poppler-0.18 - libpoppler118 - libpoppler-glib8 - libqpdf28 prime: - usr/lib/$CRAFT_ARCH_TRIPLET/girepository-1.0/Poppler-0.18.typelib - usr/lib/$CRAFT_ARCH_TRIPLET/libpoppler.so.118 - usr/lib/$CRAFT_ARCH_TRIPLET/libpoppler.so.118.0.0 - usr/lib/$CRAFT_ARCH_TRIPLET/libpoppler-glib.so.8 - usr/lib/$CRAFT_ARCH_TRIPLET/libpoppler-glib.so.8.23.0 - usr/lib/$CRAFT_ARCH_TRIPLET/libqpdf.so.28 - usr/lib/$CRAFT_ARCH_TRIPLET/libqpdf.so.28.6.3 pdfarranger-1.11.0/tests/000077500000000000000000000000001463504064500152365ustar00rootroot00000000000000pdfarranger-1.11.0/tests/1x1.jpg000066400000000000000000000005761463504064500163610ustar00rootroot00000000000000JFIFExifMM*bj(2ri2022:05:08 18:19:1202100100C       ?Tpdfarranger-1.11.0/tests/exporter/000077500000000000000000000000001463504064500171065ustar00rootroot00000000000000pdfarranger-1.11.0/tests/exporter/basic.pdf000066400000000000000000000074471463504064500206760ustar00rootroot00000000000000%PDF-1.6 % 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj 2 0 obj << /Count 7 /Kids [ 3 0 R 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R ] /Type /Pages >> endobj 3 0 obj << /Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Type /Page >> endobj 4 0 obj << /Contents 11 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Type /Page >> endobj 5 0 obj << /Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Rotate 90 /Type /Page >> endobj 6 0 obj << /Contents 11 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Rotate 180 /Type /Page >> endobj 7 0 obj << /Annots [ 12 0 R 13 0 R 14 0 R 15 0 R 16 0 R ] /Contents 17 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources 18 0 R /Type /Page >> endobj 8 0 obj << /Contents 19 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources 18 0 R /Type /Page >> endobj 9 0 obj << /Contents 20 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources 18 0 R /Type /Page >> endobj 10 0 obj << /Filter /FlateDecode /Length 42 >> stream x3T0¢tScC \s#G@@v endstream endobj 11 0 obj << /Filter /FlateDecode /Length 43 >> stream x3P0T0P(JW056P00PU00r L $i'. endstream endobj 12 0 obj << /Border [ 0 0 5 ] /C [ 1 0.6666666667 0 ] /CA 0.8 /Contents /F 4 /P 7 0 R /Rect [ 71.32546 726.063953 125.166469 745.507135 ] /Subtype /Square /T /Type /Annot >> endobj 13 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 4 /P 7 0 R /QuadPoints [ 92.0276617597 675.0934997344 138.0414926395 675.0934997344 92.0276617597 659.2766126267 138.0414926395 659.2766126267 ] /Rect [ 91.862752 659.401616 137.932894 675.233921 ] /Subtype /Highlight /T /Type /Annot >> endobj 14 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 20 /IT /FreeText /P 7 0 R /Q 0 /Rect [ 57.17138 549.131001 107.404487 563.852267 ] /Subtype /FreeText /T /Type /Annot >> endobj 15 0 obj << /Border [ 0 0 0 ] /CA 1 /Contents /F 20 /IT /FreeTextTypeWriter /P 7 0 R /Q 0 /Rect [ 56.338788 455.430421 112.122513 478.580027 ] /Subtype /FreeText /T /Type /Annot >> endobj 16 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 4 /P 7 0 R /Rect [ 61.611876 405.70976 79.470994 423.583599 ] /Subtype /Text /T /Type /Annot >> endobj 17 0 obj << /Length 177 /Filter /FlateDecode >> stream x} 0{b*6I&WA,kZ*[",{lFvC2a"Q(g 碛dsǔ&B R1[r]cY1܅-$ ZU(Um}+ɦ4*Dxm{{?XZ)~3hsO{ф7V^M\endstream endobj 18 0 obj << /Font 21 0 R /ProcSet [ /PDF /Text ] >> endobj 19 0 obj << /Length 102 /Filter /FlateDecode >> stream x33T(*T0P030P04327U01Գ03T(J Rȃ¢t..#c>SS =# K}7Cc34 ԢJ͐,.@@.Aaendstream endobj 20 0 obj << /Length 103 /Filter /FlateDecode >> stream x%ʱ 0ÙIB8 B߾|X+bo5 z7ݍ$+'8hU\&5^8km}y~؇FBtrendstream endobj 21 0 obj << /F1 22 0 R >> endobj 22 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> endobj xref 0 23 0000000000 65535 f 0000000015 00000 n 0000000064 00000 n 0000000159 00000 n 0000000249 00000 n 0000000339 00000 n 0000000440 00000 n 0000000542 00000 n 0000000697 00000 n 0000000805 00000 n 0000000913 00000 n 0000001026 00000 n 0000001140 00000 n 0000001363 00000 n 0000001711 00000 n 0000001987 00000 n 0000002261 00000 n 0000002492 00000 n 0000002741 00000 n 0000002800 00000 n 0000002974 00000 n 0000003149 00000 n 0000003182 00000 n trailer << /Root 1 0 R /Size 23 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 3278 %%EOF pdfarranger-1.11.0/tests/exporter/forms.pdf000066400000000000000000000070441463504064500207340ustar00rootroot00000000000000%PDF-1.6 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /AcroForm << /DR 2 0 R /Fields [ 3 0 R 4 0 R ] >> /Pages 5 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Font << /F1 6 0 R /ZaDb 7 0 R >> >> endobj %% Original object ID: 3 0 3 0 obj << /AP << /N 8 0 R >> /DA (0 0 0 rg /F1 12 Tf) /DV (******) /FT /Tx /Ff 0 /Rect [ 150 550 298 570 ] /Subtype /Widget /T (t1) /Type /Annot /V (******) >> endobj %% Original object ID: 4 0 4 0 obj << /DV /1 /FT /Btn /Ff 49152 /Kids [ 10 0 R 11 0 R 12 0 R ] /T (r1) /V /1 >> endobj %% Original object ID: 5 0 5 0 obj << /Count 1 /Kids [ 13 0 R ] /Type /Pages >> endobj %% Original object ID: 6 0 6 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> endobj %% Original object ID: 7 0 7 0 obj << /BaseFont /ZapfDingbats /Subtype /Type1 /Type /Font >> endobj %% Original object ID: 8 0 8 0 obj << /BBox [ -2 -2 148 10 ] /Resources 2 0 R /Subtype /Form /Type /XObject /Length 9 0 R >> stream /Tx BMC q BT /F1 10 Tf (******) Tj ET Q EMC endstream endobj 9 0 obj 48 endobj %% Original object ID: 10 0 10 0 obj << /AP << /N << /1 14 0 R /Off 16 0 R >> >> /AS /1 /DA (/F1 0 Tf) /F 4 /FT /Btn /MK << /CA (l) >> /Parent 4 0 R /Rect [ 150 650 165 665 ] /Subtype /Widget /Type /Annot >> endobj %% Original object ID: 11 0 11 0 obj << /AP << /N << /2 14 0 R /Off 16 0 R >> >> /AS /Off /DA (/F1 0 Tf) /F 4 /FT /Btn /MK << /CA (l) >> /Parent 4 0 R /Rect [ 150 630 165 645 ] /Subtype /Widget /Type /Annot >> endobj %% Original object ID: 12 0 12 0 obj << /AP << /N << /3 14 0 R /Off 16 0 R >> >> /AS /Off /DA (/F1 0 Tf) /F 4 /FT /Btn /MK << /CA (l) >> /Parent 4 0 R /Rect [ 150 610 165 625 ] /Subtype /Widget /Type /Annot >> endobj %% Page 1 %% Original object ID: 13 0 13 0 obj << /Annots [ 3 0 R 10 0 R 11 0 R 12 0 R ] /Contents 18 0 R /MediaBox [ 0 0 612 792 ] /Parent 5 0 R /Resources 2 0 R /Type /Page >> endobj %% Original object ID: 14 0 14 0 obj << /BBox [ 0 0 15 15 ] /Resources 2 0 R /Subtype /Form /Type /XObject /Length 15 0 R >> stream q 0 1 0 rg BT /ZaDb 12 Tf 0 0 Td ( 4 ) Tj ET Q endstream endobj 15 0 obj 47 endobj %% Original object ID: 16 0 16 0 obj << /BBox [ 0 0 15 15 ] /Resources 2 0 R /Subtype /Form /Type /XObject /Length 17 0 R >> stream q 1 0 0 rg BT /ZaDb 12 Tf 0 0 Td ( 8 ) Tj ET Q endstream endobj 17 0 obj 47 endobj %% Contents for page 1 %% Original object ID: 18 0 18 0 obj << /Length 19 0 R >> stream q 1 1 1 rg 150 550 150 20 re B Q q /F1 16 Tf 20 TL 170 650 Td (Radio Button 1) Tj (Radio Button 2) ' (Radio Button 3) ' Q endstream endobj 19 0 obj 122 endobj xref 0 20 0000000000 65535 f 0000000052 00000 n 0000000211 00000 n 0000000306 00000 n 0000000546 00000 n 0000000692 00000 n 0000000792 00000 n 0000000923 00000 n 0000001030 00000 n 0000001229 00000 n 0000001276 00000 n 0000001558 00000 n 0000001842 00000 n 0000002136 00000 n 0000002360 00000 n 0000002557 00000 n 0000002605 00000 n 0000002802 00000 n 0000002873 00000 n 0000003052 00000 n trailer << /Root 1 0 R /Size 20 /ID [<31415926535897932384626433832795>] >> startxref 3073 %%EOF pdfarranger-1.11.0/tests/exporter/outlines.pdf000066400000000000000000000213051463504064500214440ustar00rootroot00000000000000%PDF-1.6 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Outlines 2 0 R /Pages 3 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 4 /First 4 0 R /Last 5 0 R >> endobj %% Original object ID: 3 0 3 0 obj << /Count 4 /Kids [ 6 0 R 7 0 R 8 0 R 9 0 R ] /MediaBox [ 0 0 612 792 ] /Resources 10 0 R /Type /Pages >> endobj %% Original object ID: 4 0 4 0 obj << /Count 0 /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Next 11 0 R /Parent 2 0 R /Title (Page 1) >> endobj %% Original object ID: 5 0 5 0 obj << /Count 0 /Dest [ 9 0 R /XYZ 56.7 773.189 0 ] /Parent 2 0 R /Prev 12 0 R /Title (Page 4) >> endobj %% Page 1 %% Original object ID: 6 0 6 0 obj << /Annots [ 13 0 R 14 0 R 15 0 R 16 0 R ] /Contents 17 0 R /Group << /CS /DeviceRGB /I true /S /Transparency >> /MediaBox [ 0 0 612 792 ] /Parent 3 0 R /Resources 10 0 R /Type /Page >> endobj %% Page 2 %% Original object ID: 7 0 7 0 obj << /Annots [ 19 0 R 20 0 R 21 0 R 22 0 R ] /Contents 23 0 R /Group << /CS /DeviceRGB /I true /S /Transparency >> /MediaBox [ 0 0 612 792 ] /Parent 3 0 R /Resources 10 0 R /Type /Page >> endobj %% Page 3 %% Original object ID: 8 0 8 0 obj << /Annots [ 25 0 R 26 0 R 27 0 R 28 0 R ] /Contents 29 0 R /Group << /CS /DeviceRGB /I true /S /Transparency >> /MediaBox [ 0 0 612 792 ] /Parent 3 0 R /Resources 10 0 R /Type /Page >> endobj %% Page 4 %% Original object ID: 9 0 9 0 obj << /Annots [ 31 0 R 32 0 R 33 0 R 34 0 R ] /Contents 35 0 R /Group << /CS /DeviceRGB /I true /S /Transparency >> /MediaBox [ 0 0 612 792 ] /Parent 3 0 R /Resources 10 0 R /Type /Page >> endobj %% Original object ID: 10 0 10 0 obj << /Font 37 0 R /ProcSet [ /PDF /Text ] >> endobj %% Original object ID: 11 0 11 0 obj << /Count 0 /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Next 12 0 R /Parent 2 0 R /Prev 4 0 R /Title (Page 2) >> endobj %% Original object ID: 12 0 12 0 obj << /Count 0 /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Next 5 0 R /Parent 2 0 R /Prev 11 0 R /Title (Page 3) >> endobj %% Original object ID: 13 0 13 0 obj << /Border [ 0 0 0 ] /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 695 100 708 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 14 0 14 0 obj << /Border [ 0 0 0 ] /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 645 100 658 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 15 0 15 0 obj << /Border [ 0 0 0 ] /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 595 100 608 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 16 0 16 0 obj << /Border [ 0 0 0 ] /Dest [ 9 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 545 100 558 ] /Subtype /Link /Type /Annot >> endobj %% Contents for page 1 %% Original object ID: 17 0 17 0 obj << /Length 18 0 R >> stream 0.1 w q 0 0 0 rg BT 55 750 Td /F2 18 Tf (Page 1) Tj ET Q q 0 0 0.5019607843 rg BT 55 700 Td /F2 12 Tf (Page 1) Tj ET Q q 0 0 0.5019607843 rg BT 55 650 Td /F2 12 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 600 Td /F2 12 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 550 Td /F2 12 Tf (Page 4) Tj ET Q endstream endobj 18 0 obj 314 endobj %% Original object ID: 19 0 19 0 obj << /Border [ 0 0 0 ] /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 695 100 708 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 20 0 20 0 obj << /Border [ 0 0 0 ] /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 645 100 658 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 21 0 21 0 obj << /Border [ 0 0 0 ] /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 595 100 608 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 22 0 22 0 obj << /Border [ 0 0 0 ] /Dest [ 9 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 545 100 558 ] /Subtype /Link /Type /Annot >> endobj %% Contents for page 2 %% Original object ID: 23 0 23 0 obj << /Length 24 0 R >> stream 0.1 w q 0 0 0 rg BT 55 750 Td /F2 18 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 700 Td /F2 12 Tf (Page 1) Tj ET Q q 0 0 0.5019607843 rg BT 55 650 Td /F2 12 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 600 Td /F2 12 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 550 Td /F2 12 Tf (Page 4) Tj ET Q endstream endobj 24 0 obj 314 endobj %% Original object ID: 25 0 25 0 obj << /Border [ 0 0 0 ] /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 695 100 708 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 26 0 26 0 obj << /Border [ 0 0 0 ] /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 645 100 658 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 27 0 27 0 obj << /Border [ 0 0 0 ] /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 595 100 608 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 28 0 28 0 obj << /Border [ 0 0 0 ] /Dest [ 9 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 545 100 558 ] /Subtype /Link /Type /Annot >> endobj %% Contents for page 3 %% Original object ID: 29 0 29 0 obj << /Length 30 0 R >> stream 0.1 w q 0 0 0 rg BT 55 750 Td /F2 18 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 700 Td /F2 12 Tf (Page 1) Tj ET Q q 0 0 0.5019607843 rg BT 55 650 Td /F2 12 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 600 Td /F2 12 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 550 Td /F2 12 Tf (Page 4) Tj ET Q endstream endobj 30 0 obj 314 endobj %% Original object ID: 31 0 31 0 obj << /Border [ 0 0 0 ] /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 695 100 708 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 32 0 32 0 obj << /Border [ 0 0 0 ] /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 645 100 658 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 33 0 33 0 obj << /Border [ 0 0 0 ] /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 595 100 608 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 34 0 34 0 obj << /Border [ 0 0 0 ] /Dest [ 9 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 545 100 558 ] /Subtype /Link /Type /Annot >> endobj %% Contents for page 4 %% Original object ID: 35 0 35 0 obj << /Length 36 0 R >> stream 0.1 w q 0 0 0 rg BT 55 750 Td /F2 18 Tf (Page 4) Tj ET Q q 0 0 0.5019607843 rg BT 55 700 Td /F2 12 Tf (Page 1) Tj ET Q q 0 0 0.5019607843 rg BT 55 650 Td /F2 12 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 600 Td /F2 12 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 550 Td /F2 12 Tf (Page 4) Tj ET Q endstream endobj 36 0 obj 314 endobj %% Original object ID: 37 0 37 0 obj << /F2 38 0 R >> endobj %% Original object ID: 38 0 38 0 obj << /BaseFont /Courier /Subtype /TrueType /Type /Font >> endobj xref 0 39 0000000000 65535 f 0000000052 00000 n 0000000151 00000 n 0000000240 00000 n 0000000435 00000 n 0000000604 00000 n 0000000783 00000 n 0000001086 00000 n 0000001389 00000 n 0000001692 00000 n 0000001986 00000 n 0000002088 00000 n 0000002273 00000 n 0000002458 00000 n 0000002680 00000 n 0000002902 00000 n 0000003124 00000 n 0000003369 00000 n 0000003740 00000 n 0000003789 00000 n 0000004011 00000 n 0000004233 00000 n 0000004455 00000 n 0000004700 00000 n 0000005071 00000 n 0000005120 00000 n 0000005342 00000 n 0000005564 00000 n 0000005786 00000 n 0000006031 00000 n 0000006402 00000 n 0000006451 00000 n 0000006673 00000 n 0000006895 00000 n 0000007117 00000 n 0000007362 00000 n 0000007733 00000 n 0000007782 00000 n 0000007846 00000 n trailer << /DocChecksum /C0B7B02D232A8DFB9E661438F22D70FD /Root 1 0 R /Size 39 /ID [<747ec04935be9a8770701ac5cb22ab64>] >> startxref 7925 %%EOF pdfarranger-1.11.0/tests/exporter/overlay.pdf000066400000000000000000000031731463504064500212660ustar00rootroot00000000000000%PDF-1.6 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 2 /Kids [ 3 0 R 4 0 R ] /Type /Pages >> endobj %% Page 1 %% Original object ID: 3 0 3 0 obj << /Contents 5 0 R /MediaBox [ 0 0 611.5 791.5 ] /Parent 2 0 R /Resources << /Font << /F1 7 0 R >> /ProcSet [ /PDF /Text ] >> /Type /Page >> endobj %% Page 2 %% Original object ID: 4 0 4 0 obj << /Contents 8 0 R /MediaBox [ 612 792 0 0 ] /Parent 2 0 R /Resources << /Font << /F1 7 0 R >> /ProcSet [ /PDF /Text ] >> /Type /Page >> endobj %% Contents for page 1 %% Original object ID: 5 0 5 0 obj << /Length 6 0 R >> stream 0.1 w q 0 0.028 595.275 841.861 re W* n q 0 0 0 rg BT 234.1 558.289 Td /F1 36 Tf (Overlay)Tj ET Q Q endstream endobj 6 0 obj 101 endobj %% Original object ID: 7 0 7 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> endobj %% Contents for page 2 %% Original object ID: 8 0 8 0 obj << /Length 9 0 R >> stream 0.1 w q 0 0.028 595.275 841.861 re W* n q 0 0 0 rg BT 198.6 544.489 Td /F1 36 Tf (Underlay) Tj ET Q Q endstream endobj 9 0 obj 103 endobj xref 0 10 0000000000 65535 f 0000000052 00000 n 0000000133 00000 n 0000000252 00000 n 0000000510 00000 n 0000000777 00000 n 0000000933 00000 n 0000000980 00000 n 0000001134 00000 n 0000001292 00000 n trailer << /Root 1 0 R /Size 10 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 1312 %%EOF pdfarranger-1.11.0/tests/exporter/test10_out.pdf000066400000000000000000000040601463504064500216100ustar00rootroot00000000000000%PDF-1.3 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 1 /Kids [ 3 0 R ] /Type /Pages >> endobj %% Page 1 %% Original object ID: 11 0 3 0 obj << /Contents 4 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /XObject << /0IYFBgCYi5bltZTLXkc8mA 6 0 R% /PNK1egMAH1NQImqPtwW2nQ 8 0 R% >> >> /Type /Page >> endobj %% Contents for page 1 %% Original object ID: 23 0 4 0 obj << /Length 5 0 R >> stream q q 1 0 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B Q q 0.5 0 0 0.5 306 198 cm /PNK1egMAH1NQImqPtwW2nQ Do Q Q q 0.5 0 0 0.5 0 198 cm /0IYFBgCYi5bltZTLXkc8mA Do Q endstream endobj %QDF: ignore_newline 5 0 obj 166 endobj %% Original object ID: 19 0 6 0 obj << /BBox [ 0 0 612 792 ] /Resources << /Font << /F1 10 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 7 0 R >> stream 0.1 w q 0 0.028 595.275 841.861 re W* n q 0 0 0 rg BT 234.1 558.289 Td /F1 36 Tf (Overlay)Tj ET Q Q endstream endobj %QDF: ignore_newline 7 0 obj 101 endobj %% Original object ID: 14 0 8 0 obj << /BBox [ 0 0 612 792 ] /Resources << /Font << /F1 10 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 9 0 R >> stream 0.1 w q 0 0.028 595.275 841.861 re W* n q 0 0 0 rg BT 234.1 558.289 Td /F1 36 Tf (Overlay)Tj ET Q Q endstream endobj %QDF: ignore_newline 9 0 obj 101 endobj %% Original object ID: 9 0 10 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> endobj xref 0 11 0000000000 65535 f 0000000052 00000 n 0000000133 00000 n 0000000243 00000 n 0000000526 00000 n 0000000769 00000 n 0000000817 00000 n 0000001173 00000 n 0000001221 00000 n 0000001577 00000 n 0000001624 00000 n trailer << /Root 1 0 R /Size 11 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 1729 %%EOF pdfarranger-1.11.0/tests/exporter/test11_out.pdf000066400000000000000000000040601463504064500216110ustar00rootroot00000000000000%PDF-1.3 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 1 /Kids [ 3 0 R ] /Type /Pages >> endobj %% Page 1 %% Original object ID: 11 0 3 0 obj << /Contents 4 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /XObject << /_hwskaaNGKvGWtW3FoJESA 6 0 R% /xx6aLKX2AVKQ0BzfmBbfdg 8 0 R% >> >> /Type /Page >> endobj %% Contents for page 1 %% Original object ID: 23 0 4 0 obj << /Length 5 0 R >> stream q q 1 0 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B Q q 0.5 0 0 0.5 153 0 cm /xx6aLKX2AVKQ0BzfmBbfdg Do Q Q q 0.5 0 0 0.5 153 396 cm /_hwskaaNGKvGWtW3FoJESA Do Q endstream endobj %QDF: ignore_newline 5 0 obj 166 endobj %% Original object ID: 19 0 6 0 obj << /BBox [ 0 0 612 792 ] /Resources << /Font << /F1 10 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 7 0 R >> stream 0.1 w q 0 0.028 595.275 841.861 re W* n q 0 0 0 rg BT 234.1 558.289 Td /F1 36 Tf (Overlay)Tj ET Q Q endstream endobj %QDF: ignore_newline 7 0 obj 101 endobj %% Original object ID: 14 0 8 0 obj << /BBox [ 0 0 612 792 ] /Resources << /Font << /F1 10 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 9 0 R >> stream 0.1 w q 0 0.028 595.275 841.861 re W* n q 0 0 0 rg BT 234.1 558.289 Td /F1 36 Tf (Overlay)Tj ET Q Q endstream endobj %QDF: ignore_newline 9 0 obj 101 endobj %% Original object ID: 9 0 10 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> endobj xref 0 11 0000000000 65535 f 0000000052 00000 n 0000000133 00000 n 0000000243 00000 n 0000000526 00000 n 0000000769 00000 n 0000000817 00000 n 0000001173 00000 n 0000001221 00000 n 0000001577 00000 n 0000001624 00000 n trailer << /Root 1 0 R /Size 11 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 1729 %%EOF pdfarranger-1.11.0/tests/exporter/test12_8_out.pdf000066400000000000000000000132031463504064500220400ustar00rootroot00000000000000%PDF-1.6 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 2 /Kids [ 3 0 R 4 0 R ] /Type /Pages >> endobj %% Page 1 %% Original object ID: 7 0 3 0 obj << /Annots [ 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R ] /Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 12 0 R >> /ProcSet [ /PDF /Text ] >> /Rotate 0 /Type /Page >> endobj %% Page 2 %% Original object ID: 23 0 4 0 obj << /Annots [ 13 0 R 14 0 R 15 0 R 16 0 R 17 0 R ] /Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 12 0 R >> /ProcSet [ /PDF /Text ] >> /Rotate 0 /Type /Page >> endobj %% Original object ID: 12 0 5 0 obj << /Border [ 0 0 5 ] /C [ 1 0.6666666667 0 ] /CA 0.8 /Contents /F 4 /P 3 0 R /Rect [ 71.32546 726.063953 125.166469 745.507135 ] /Subtype /Square /T /Type /Annot >> endobj %% Original object ID: 13 0 6 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 4 /P 3 0 R /QuadPoints [ 92.0276617597 675.0934997344 138.0414926395 675.0934997344 92.0276617597 659.2766126267 138.0414926395 659.2766126267 ] /Rect [ 91.862752 659.401616 137.932894 675.233921 ] /Subtype /Highlight /T /Type /Annot >> endobj %% Original object ID: 14 0 7 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 20 /IT /FreeText /P 3 0 R /Q 0 /Rect [ 57.17138 549.131001 107.404487 563.852267 ] /Subtype /FreeText /T /Type /Annot >> endobj %% Original object ID: 15 0 8 0 obj << /Border [ 0 0 0 ] /CA 1 /Contents /F 20 /IT /FreeTextTypeWriter /P 3 0 R /Q 0 /Rect [ 56.338788 455.430421 112.122513 478.580027 ] /Subtype /FreeText /T /Type /Annot >> endobj %% Original object ID: 16 0 9 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 4 /P 3 0 R /Rect [ 61.611876 405.70976 79.470994 423.583599 ] /Subtype /Text /T /Type /Annot >> endobj %% Contents for page 2 %% Original object ID: 17 0 10 0 obj << /Length 11 0 R >> stream 0.1 w q 0 0.028 595.275 841.861 re W* n q 0 0 0 rg BT 56.8 732.589 Td /F1 8 Tf( Rectangle) Tj ET Q q 0 0 0 rg BT 92.3 663.589 Td /F1 8 Tf (Highlight) Tj ET Q q 0 0 0 rg BT 56.8 566.989 Td /F1 8 Tf (inline note) Tj ET Q q 0 0 0 rg BT 56.8 539.389 Td /F1 8 Tf (----------) Tj ET Q q 0 0 0 rg BT 56.8 484.189 Td /F1 8 Tf (Typewriter) Tj ET Q q 0 0 0 rg BT 56.8 428.989 Td /F1 8 Tf (Popup) Tj ET Q Q endstream endobj 11 0 obj 400 endobj %% Original object ID: 22 0 12 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> endobj %% Original object ID: 24 0 13 0 obj << /Border [ 0 0 5 ] /C [ 1 0.6666666667 0 ] /CA 0.8 /Contents /F 4 /P 3 0 R /Rect [ 71.32546 726.063953 125.166469 745.507135 ] /Subtype /Square /T /Type /Annot >> endobj %% Original object ID: 25 0 14 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 4 /P 3 0 R /QuadPoints [ 92.0276617597 675.0934997344 138.0414926395 675.0934997344 92.0276617597 659.2766126267 138.0414926395 659.2766126267 ] /Rect [ 91.862752 659.401616 137.932894 675.233921 ] /Subtype /Highlight /T /Type /Annot >> endobj %% Original object ID: 26 0 15 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 20 /IT /FreeText /P 3 0 R /Q 0 /Rect [ 57.17138 549.131001 107.404487 563.852267 ] /Subtype /FreeText /T /Type /Annot >> endobj %% Original object ID: 27 0 16 0 obj << /Border [ 0 0 0 ] /CA 1 /Contents /F 20 /IT /FreeTextTypeWriter /P 3 0 R /Q 0 /Rect [ 56.338788 455.430421 112.122513 478.580027 ] /Subtype /FreeText /T /Type /Annot >> endobj %% Original object ID: 28 0 17 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 4 /P 3 0 R /Rect [ 61.611876 405.70976 79.470994 423.583599 ] /Subtype /Text /T /Type /Annot >> endobj xref 0 18 0000000000 65535 f 0000000052 00000 n 0000000133 00000 n 0000000252 00000 n 0000000587 00000 n 0000000917 00000 n 0000001234 00000 n 0000001712 00000 n 0000002086 00000 n 0000002442 00000 n 0000002790 00000 n 0000003247 00000 n 0000003296 00000 n 0000003429 00000 n 0000003747 00000 n 0000004226 00000 n 0000004601 00000 n 0000004958 00000 n trailer << /Root 1 0 R /Size 18 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 5256 %%EOF pdfarranger-1.11.0/tests/exporter/test12_out.pdf000066400000000000000000000132111463504064500216100ustar00rootroot00000000000000%PDF-1.3 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 2 /Kids [ 3 0 R 4 0 R ] /Type /Pages >> endobj %% Page 1 %% Original object ID: 26 0 3 0 obj << /Annots 5 0 R /Contents 6 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 8 0 R >> /ProcSet [ /PDF /Text ] >> /Type /Page >> endobj %% Page 2 %% Original object ID: 27 0 4 0 obj << /Annots 9 0 R /Contents 6 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 8 0 R >> /ProcSet [ /PDF /Text ] >> /Type /Page >> endobj %% Original object ID: 13 0 5 0 obj [ 10 0 R 11 0 R 12 0 R 13 0 R 14 0 R ] endobj %% Contents for page 2 %% Original object ID: 9 0 6 0 obj << /Length 7 0 R >> stream 0.1 w q 0 0.028 595.275 841.861 re W* n q 0 0 0 rg BT 56.8 732.589 Td /F1 8 Tf( Rectangle) Tj ET Q q 0 0 0 rg BT 92.3 663.589 Td /F1 8 Tf (Highlight) Tj ET Q q 0 0 0 rg BT 56.8 566.989 Td /F1 8 Tf (inline note) Tj ET Q q 0 0 0 rg BT 56.8 539.389 Td /F1 8 Tf (----------) Tj ET Q q 0 0 0 rg BT 56.8 484.189 Td /F1 8 Tf (Typewriter) Tj ET Q q 0 0 0 rg BT 56.8 428.989 Td /F1 8 Tf (Popup) Tj ET Q Q endstream endobj %QDF: ignore_newline 7 0 obj 400 endobj %% Original object ID: 12 0 8 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> endobj %% Original object ID: 20 0 9 0 obj [ 15 0 R 16 0 R 17 0 R 18 0 R 19 0 R ] endobj %% Original object ID: 14 0 10 0 obj << /Border [ 0 0 5 ] /C [ 1 0.6666666667 0 ] /CA 0.8 /Contents /F 4 /Rect [ 71.32546 726.063953 125.166469 745.507135 ] /Subtype /Square /T /Type /Annot >> endobj %% Original object ID: 15 0 11 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 4 /QuadPoints [ 92.0276617597 675.0934997344 138.0414926395 675.0934997344 92.0276617597 659.2766126267 138.0414926395 659.2766126267 ] /Rect [ 91.862752 659.401616 137.932894 675.233921 ] /Subtype /Highlight /T /Type /Annot >> endobj %% Original object ID: 16 0 12 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 20 /IT /FreeText /Q 0 /Rect [ 57.17138 549.131001 107.404487 563.852267 ] /Subtype /FreeText /T /Type /Annot >> endobj %% Original object ID: 17 0 13 0 obj << /Border [ 0 0 0 ] /CA 1 /Contents /F 20 /IT /FreeTextTypeWriter /Q 0 /Rect [ 56.338788 455.430421 112.122513 478.580027 ] /Subtype /FreeText /T /Type /Annot >> endobj %% Original object ID: 18 0 14 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 4 /Rect [ 61.611876 405.70976 79.470994 423.583599 ] /Subtype /Text /T /Type /Annot >> endobj %% Original object ID: 21 0 15 0 obj << /Border [ 0 0 5 ] /C [ 1 0.6666666667 0 ] /CA 0.8 /Contents /F 4 /Rect [ 71.32546 726.063953 125.166469 745.507135 ] /Subtype /Square /T /Type /Annot >> endobj %% Original object ID: 22 0 16 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 4 /QuadPoints [ 92.0276617597 675.0934997344 138.0414926395 675.0934997344 92.0276617597 659.2766126267 138.0414926395 659.2766126267 ] /Rect [ 91.862752 659.401616 137.932894 675.233921 ] /Subtype /Highlight /T /Type /Annot >> endobj %% Original object ID: 23 0 17 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 20 /IT /FreeText /Q 0 /Rect [ 57.17138 549.131001 107.404487 563.852267 ] /Subtype /FreeText /T /Type /Annot >> endobj %% Original object ID: 24 0 18 0 obj << /Border [ 0 0 0 ] /CA 1 /Contents /F 20 /IT /FreeTextTypeWriter /Q 0 /Rect [ 56.338788 455.430421 112.122513 478.580027 ] /Subtype /FreeText /T /Type /Annot >> endobj %% Original object ID: 25 0 19 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 4 /Rect [ 61.611876 405.70976 79.470994 423.583599 ] /Subtype /Text /T /Type /Annot >> endobj xref 0 20 0000000000 65535 f 0000000052 00000 n 0000000133 00000 n 0000000253 00000 n 0000000524 00000 n 0000000785 00000 n 0000000900 00000 n 0000001377 00000 n 0000001425 00000 n 0000001557 00000 n 0000001650 00000 n 0000001957 00000 n 0000002425 00000 n 0000002789 00000 n 0000003135 00000 n 0000003450 00000 n 0000003757 00000 n 0000004225 00000 n 0000004589 00000 n 0000004935 00000 n trailer << /Root 1 0 R /Size 20 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 5222 %%EOF pdfarranger-1.11.0/tests/exporter/test13_8_out.pdf000066400000000000000000000132061463504064500220440ustar00rootroot00000000000000%PDF-1.6 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 2 /Kids [ 3 0 R 4 0 R ] /Type /Pages >> endobj %% Page 1 %% Original object ID: 7 0 3 0 obj << /Annots [ 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R ] /Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 12 0 R >> /ProcSet [ /PDF /Text ] >> /Rotate 90 /Type /Page >> endobj %% Page 2 %% Original object ID: 23 0 4 0 obj << /Annots [ 13 0 R 14 0 R 15 0 R 16 0 R 17 0 R ] /Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 12 0 R >> /ProcSet [ /PDF /Text ] >> /Rotate 180 /Type /Page >> endobj %% Original object ID: 12 0 5 0 obj << /Border [ 0 0 5 ] /C [ 1 0.6666666667 0 ] /CA 0.8 /Contents /F 4 /P 3 0 R /Rect [ 71.32546 726.063953 125.166469 745.507135 ] /Subtype /Square /T /Type /Annot >> endobj %% Original object ID: 13 0 6 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 4 /P 3 0 R /QuadPoints [ 92.0276617597 675.0934997344 138.0414926395 675.0934997344 92.0276617597 659.2766126267 138.0414926395 659.2766126267 ] /Rect [ 91.862752 659.401616 137.932894 675.233921 ] /Subtype /Highlight /T /Type /Annot >> endobj %% Original object ID: 14 0 7 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 20 /IT /FreeText /P 3 0 R /Q 0 /Rect [ 57.17138 549.131001 107.404487 563.852267 ] /Subtype /FreeText /T /Type /Annot >> endobj %% Original object ID: 15 0 8 0 obj << /Border [ 0 0 0 ] /CA 1 /Contents /F 20 /IT /FreeTextTypeWriter /P 3 0 R /Q 0 /Rect [ 56.338788 455.430421 112.122513 478.580027 ] /Subtype /FreeText /T /Type /Annot >> endobj %% Original object ID: 16 0 9 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 4 /P 3 0 R /Rect [ 61.611876 405.70976 79.470994 423.583599 ] /Subtype /Text /T /Type /Annot >> endobj %% Contents for page 2 %% Original object ID: 17 0 10 0 obj << /Length 11 0 R >> stream 0.1 w q 0 0.028 595.275 841.861 re W* n q 0 0 0 rg BT 56.8 732.589 Td /F1 8 Tf( Rectangle) Tj ET Q q 0 0 0 rg BT 92.3 663.589 Td /F1 8 Tf (Highlight) Tj ET Q q 0 0 0 rg BT 56.8 566.989 Td /F1 8 Tf (inline note) Tj ET Q q 0 0 0 rg BT 56.8 539.389 Td /F1 8 Tf (----------) Tj ET Q q 0 0 0 rg BT 56.8 484.189 Td /F1 8 Tf (Typewriter) Tj ET Q q 0 0 0 rg BT 56.8 428.989 Td /F1 8 Tf (Popup) Tj ET Q Q endstream endobj 11 0 obj 400 endobj %% Original object ID: 22 0 12 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> endobj %% Original object ID: 24 0 13 0 obj << /Border [ 0 0 5 ] /C [ 1 0.6666666667 0 ] /CA 0.8 /Contents /F 4 /P 3 0 R /Rect [ 71.32546 726.063953 125.166469 745.507135 ] /Subtype /Square /T /Type /Annot >> endobj %% Original object ID: 25 0 14 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 4 /P 3 0 R /QuadPoints [ 92.0276617597 675.0934997344 138.0414926395 675.0934997344 92.0276617597 659.2766126267 138.0414926395 659.2766126267 ] /Rect [ 91.862752 659.401616 137.932894 675.233921 ] /Subtype /Highlight /T /Type /Annot >> endobj %% Original object ID: 26 0 15 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 20 /IT /FreeText /P 3 0 R /Q 0 /Rect [ 57.17138 549.131001 107.404487 563.852267 ] /Subtype /FreeText /T /Type /Annot >> endobj %% Original object ID: 27 0 16 0 obj << /Border [ 0 0 0 ] /CA 1 /Contents /F 20 /IT /FreeTextTypeWriter /P 3 0 R /Q 0 /Rect [ 56.338788 455.430421 112.122513 478.580027 ] /Subtype /FreeText /T /Type /Annot >> endobj %% Original object ID: 28 0 17 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 4 /P 3 0 R /Rect [ 61.611876 405.70976 79.470994 423.583599 ] /Subtype /Text /T /Type /Annot >> endobj xref 0 18 0000000000 65535 f 0000000052 00000 n 0000000133 00000 n 0000000252 00000 n 0000000588 00000 n 0000000920 00000 n 0000001237 00000 n 0000001715 00000 n 0000002089 00000 n 0000002445 00000 n 0000002793 00000 n 0000003250 00000 n 0000003299 00000 n 0000003432 00000 n 0000003750 00000 n 0000004229 00000 n 0000004604 00000 n 0000004961 00000 n trailer << /Root 1 0 R /Size 18 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 5259 %%EOF pdfarranger-1.11.0/tests/exporter/test13_out.pdf000066400000000000000000000132441463504064500216170ustar00rootroot00000000000000%PDF-1.3 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 2 /Kids [ 3 0 R 4 0 R ] /Type /Pages >> endobj %% Page 1 %% Original object ID: 26 0 3 0 obj << /Annots 5 0 R /Contents 6 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 8 0 R >> /ProcSet [ /PDF /Text ] >> /Rotate 90 /Type /Page >> endobj %% Page 2 %% Original object ID: 27 0 4 0 obj << /Annots 9 0 R /Contents 6 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 8 0 R >> /ProcSet [ /PDF /Text ] >> /Rotate 180 /Type /Page >> endobj %% Original object ID: 13 0 5 0 obj [ 10 0 R 11 0 R 12 0 R 13 0 R 14 0 R ] endobj %% Contents for page 2 %% Original object ID: 9 0 6 0 obj << /Length 7 0 R >> stream 0.1 w q 0 0.028 595.275 841.861 re W* n q 0 0 0 rg BT 56.8 732.589 Td /F1 8 Tf( Rectangle) Tj ET Q q 0 0 0 rg BT 92.3 663.589 Td /F1 8 Tf (Highlight) Tj ET Q q 0 0 0 rg BT 56.8 566.989 Td /F1 8 Tf (inline note) Tj ET Q q 0 0 0 rg BT 56.8 539.389 Td /F1 8 Tf (----------) Tj ET Q q 0 0 0 rg BT 56.8 484.189 Td /F1 8 Tf (Typewriter) Tj ET Q q 0 0 0 rg BT 56.8 428.989 Td /F1 8 Tf (Popup) Tj ET Q Q endstream endobj %QDF: ignore_newline 7 0 obj 400 endobj %% Original object ID: 12 0 8 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> endobj %% Original object ID: 20 0 9 0 obj [ 15 0 R 16 0 R 17 0 R 18 0 R 19 0 R ] endobj %% Original object ID: 14 0 10 0 obj << /Border [ 0 0 5 ] /C [ 1 0.6666666667 0 ] /CA 0.8 /Contents /F 4 /Rect [ 71.32546 726.063953 125.166469 745.507135 ] /Subtype /Square /T /Type /Annot >> endobj %% Original object ID: 15 0 11 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 4 /QuadPoints [ 92.0276617597 675.0934997344 138.0414926395 675.0934997344 92.0276617597 659.2766126267 138.0414926395 659.2766126267 ] /Rect [ 91.862752 659.401616 137.932894 675.233921 ] /Subtype /Highlight /T /Type /Annot >> endobj %% Original object ID: 16 0 12 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 20 /IT /FreeText /Q 0 /Rect [ 57.17138 549.131001 107.404487 563.852267 ] /Subtype /FreeText /T /Type /Annot >> endobj %% Original object ID: 17 0 13 0 obj << /Border [ 0 0 0 ] /CA 1 /Contents /F 20 /IT /FreeTextTypeWriter /Q 0 /Rect [ 56.338788 455.430421 112.122513 478.580027 ] /Subtype /FreeText /T /Type /Annot >> endobj %% Original object ID: 18 0 14 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 4 /Rect [ 61.611876 405.70976 79.470994 423.583599 ] /Subtype /Text /T /Type /Annot >> endobj %% Original object ID: 21 0 15 0 obj << /Border [ 0 0 5 ] /C [ 1 0.6666666667 0 ] /CA 0.8 /Contents /F 4 /Rect [ 71.32546 726.063953 125.166469 745.507135 ] /Subtype /Square /T /Type /Annot >> endobj %% Original object ID: 22 0 16 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 4 /QuadPoints [ 92.0276617597 675.0934997344 138.0414926395 675.0934997344 92.0276617597 659.2766126267 138.0414926395 659.2766126267 ] /Rect [ 91.862752 659.401616 137.932894 675.233921 ] /Subtype /Highlight /T /Type /Annot >> endobj %% Original object ID: 23 0 17 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 20 /IT /FreeText /Q 0 /Rect [ 57.17138 549.131001 107.404487 563.852267 ] /Subtype /FreeText /T /Type /Annot >> endobj %% Original object ID: 24 0 18 0 obj << /Border [ 0 0 0 ] /CA 1 /Contents /F 20 /IT /FreeTextTypeWriter /Q 0 /Rect [ 56.338788 455.430421 112.122513 478.580027 ] /Subtype /FreeText /T /Type /Annot >> endobj %% Original object ID: 25 0 19 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 4 /Rect [ 61.611876 405.70976 79.470994 423.583599 ] /Subtype /Text /T /Type /Annot >> endobj xref 0 20 0000000000 65535 f 0000000052 00000 n 0000000133 00000 n 0000000253 00000 n 0000000537 00000 n 0000000812 00000 n 0000000927 00000 n 0000001404 00000 n 0000001452 00000 n 0000001584 00000 n 0000001677 00000 n 0000001984 00000 n 0000002452 00000 n 0000002816 00000 n 0000003162 00000 n 0000003477 00000 n 0000003784 00000 n 0000004252 00000 n 0000004616 00000 n 0000004962 00000 n trailer << /Root 1 0 R /Size 20 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 5249 %%EOF pdfarranger-1.11.0/tests/exporter/test14_out.pdf000066400000000000000000000033501463504064500216150ustar00rootroot00000000000000%PDF-1.3 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 1 /Kids [ 3 0 R ] /Type /Pages >> endobj %% Page 1 %% Original object ID: 21 0 3 0 obj << /Contents 4 0 R /MediaBox [ 0 0 153 198 ] /Parent 2 0 R /Resources << /XObject << /p1 6 0 R% >> >> /Rotate 0 /Type /Page >> endobj %% Contents for page 1 %% Original object ID: 20 0 4 0 obj << /Length 5 0 R >> stream q 0.25 0 0 0.25 0 0 cm /p1 Do Q endstream endobj %QDF: ignore_newline 5 0 obj 31 endobj %% Original object ID: 19 0 6 0 obj << /BBox [ 0 0 612 792 ] /Resources << /Font << /F1 8 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 7 0 R >> stream 0.1 w q 0 0.028 595.275 841.861 re W* n q 0 0 0 rg BT 56.8 732.589 Td /F1 8 Tf( Rectangle) Tj ET Q q 0 0 0 rg BT 92.3 663.589 Td /F1 8 Tf (Highlight) Tj ET Q q 0 0 0 rg BT 56.8 566.989 Td /F1 8 Tf (inline note) Tj ET Q q 0 0 0 rg BT 56.8 539.389 Td /F1 8 Tf (----------) Tj ET Q q 0 0 0 rg BT 56.8 484.189 Td /F1 8 Tf (Typewriter) Tj ET Q q 0 0 0 rg BT 56.8 428.989 Td /F1 8 Tf (Popup) Tj ET Q Q endstream endobj %QDF: ignore_newline 7 0 obj 400 endobj %% Original object ID: 12 0 8 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> endobj xref 0 9 0000000000 65535 f 0000000052 00000 n 0000000133 00000 n 0000000243 00000 n 0000000482 00000 n 0000000590 00000 n 0000000637 00000 n 0000001291 00000 n 0000001339 00000 n trailer << /Root 1 0 R /Size 9 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 1443 %%EOF pdfarranger-1.11.0/tests/exporter/test15_8_out.pdf000066400000000000000000000065671463504064500220620ustar00rootroot00000000000000%PDF-1.6 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 1 /Kids [ 3 0 R ] /Type /Pages >> endobj %% Page 1 %% Original object ID: 7 0 3 0 obj << /Annots [ 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R ] /Contents 9 0 R /MediaBox [ 30.6 237.6 566.1 633.6 ] /Parent 2 0 R /Resources << /Font << /F1 11 0 R >> /ProcSet [ /PDF /Text ] >> /Rotate 0 /Type /Page >> endobj %% Original object ID: 12 0 4 0 obj << /Border [ 0 0 5 ] /C [ 1 0.6666666667 0 ] /CA 0.8 /Contents /F 4 /P 3 0 R /Rect [ 71.32546 726.063953 125.166469 745.507135 ] /Subtype /Square /T /Type /Annot >> endobj %% Original object ID: 13 0 5 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 4 /P 3 0 R /QuadPoints [ 92.0276617597 675.0934997344 138.0414926395 675.0934997344 92.0276617597 659.2766126267 138.0414926395 659.2766126267 ] /Rect [ 91.862752 659.401616 137.932894 675.233921 ] /Subtype /Highlight /T /Type /Annot >> endobj %% Original object ID: 14 0 6 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 20 /IT /FreeText /P 3 0 R /Q 0 /Rect [ 57.17138 549.131001 107.404487 563.852267 ] /Subtype /FreeText /T /Type /Annot >> endobj %% Original object ID: 15 0 7 0 obj << /Border [ 0 0 0 ] /CA 1 /Contents /F 20 /IT /FreeTextTypeWriter /P 3 0 R /Q 0 /Rect [ 56.338788 455.430421 112.122513 478.580027 ] /Subtype /FreeText /T /Type /Annot >> endobj %% Original object ID: 16 0 8 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 4 /P 3 0 R /Rect [ 61.611876 405.70976 79.470994 423.583599 ] /Subtype /Text /T /Type /Annot >> endobj %% Contents for page 1 %% Original object ID: 17 0 9 0 obj << /Length 10 0 R >> stream 0.1 w q 0 0.028 595.275 841.861 re W* n q 0 0 0 rg BT 56.8 732.589 Td /F1 8 Tf( Rectangle) Tj ET Q q 0 0 0 rg BT 92.3 663.589 Td /F1 8 Tf (Highlight) Tj ET Q q 0 0 0 rg BT 56.8 566.989 Td /F1 8 Tf (inline note) Tj ET Q q 0 0 0 rg BT 56.8 539.389 Td /F1 8 Tf (----------) Tj ET Q q 0 0 0 rg BT 56.8 484.189 Td /F1 8 Tf (Typewriter) Tj ET Q q 0 0 0 rg BT 56.8 428.989 Td /F1 8 Tf (Popup) Tj ET Q Q endstream endobj 10 0 obj 400 endobj %% Original object ID: 22 0 11 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> endobj xref 0 12 0000000000 65535 f 0000000052 00000 n 0000000133 00000 n 0000000242 00000 n 0000000577 00000 n 0000000894 00000 n 0000001372 00000 n 0000001746 00000 n 0000002102 00000 n 0000002450 00000 n 0000002906 00000 n 0000002955 00000 n trailer << /Root 1 0 R /Size 12 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 3060 %%EOF pdfarranger-1.11.0/tests/exporter/test15_out.pdf000066400000000000000000000066061463504064500216250ustar00rootroot00000000000000%PDF-1.3 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 1 /Kids [ 3 0 R ] /Type /Pages >> endobj %% Page 1 %% Original object ID: 19 0 3 0 obj << /Annots 4 0 R /Contents 5 0 R /MediaBox [ 30.6 237.6 566.1 633.6 ] /Parent 2 0 R /Resources << /Font << /F1 7 0 R >> /ProcSet [ /PDF /Text ] >> /Type /Page >> endobj %% Original object ID: 13 0 4 0 obj [ 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R ] endobj %% Contents for page 1 %% Original object ID: 9 0 5 0 obj << /Length 6 0 R >> stream 0.1 w q 0 0.028 595.275 841.861 re W* n q 0 0 0 rg BT 56.8 732.589 Td /F1 8 Tf( Rectangle) Tj ET Q q 0 0 0 rg BT 92.3 663.589 Td /F1 8 Tf (Highlight) Tj ET Q q 0 0 0 rg BT 56.8 566.989 Td /F1 8 Tf (inline note) Tj ET Q q 0 0 0 rg BT 56.8 539.389 Td /F1 8 Tf (----------) Tj ET Q q 0 0 0 rg BT 56.8 484.189 Td /F1 8 Tf (Typewriter) Tj ET Q q 0 0 0 rg BT 56.8 428.989 Td /F1 8 Tf (Popup) Tj ET Q Q endstream endobj %QDF: ignore_newline 6 0 obj 400 endobj %% Original object ID: 12 0 7 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> endobj %% Original object ID: 14 0 8 0 obj << /Border [ 0 0 5 ] /C [ 1 0.6666666667 0 ] /CA 0.8 /Contents /F 4 /Rect [ 71.32546 726.063953 125.166469 745.507135 ] /Subtype /Square /T /Type /Annot >> endobj %% Original object ID: 15 0 9 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 4 /QuadPoints [ 92.0276617597 675.0934997344 138.0414926395 675.0934997344 92.0276617597 659.2766126267 138.0414926395 659.2766126267 ] /Rect [ 91.862752 659.401616 137.932894 675.233921 ] /Subtype /Highlight /T /Type /Annot >> endobj %% Original object ID: 16 0 10 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 20 /IT /FreeText /Q 0 /Rect [ 57.17138 549.131001 107.404487 563.852267 ] /Subtype /FreeText /T /Type /Annot >> endobj %% Original object ID: 17 0 11 0 obj << /Border [ 0 0 0 ] /CA 1 /Contents /F 20 /IT /FreeTextTypeWriter /Q 0 /Rect [ 56.338788 455.430421 112.122513 478.580027 ] /Subtype /FreeText /T /Type /Annot >> endobj %% Original object ID: 18 0 12 0 obj << /Border [ 0 0 1 ] /C [ 1 1 0 ] /CA 1 /Contents /F 4 /Rect [ 61.611876 405.70976 79.470994 423.583599 ] /Subtype /Text /T /Type /Annot >> endobj xref 0 13 0000000000 65535 f 0000000052 00000 n 0000000133 00000 n 0000000243 00000 n 0000000515 00000 n 0000000628 00000 n 0000001105 00000 n 0000001153 00000 n 0000001285 00000 n 0000001591 00000 n 0000002058 00000 n 0000002422 00000 n 0000002768 00000 n trailer << /Root 1 0 R /Size 13 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 3055 %%EOF pdfarranger-1.11.0/tests/exporter/test16_out.pdf000066400000000000000000000034701463504064500216220ustar00rootroot00000000000000%PDF-1.3 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 1 /Kids [ 3 0 R ] /Type /Pages >> endobj %% Page 1 %% Original object ID: 21 0 3 0 obj << /Contents 4 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /XObject << /d_bpyeLix3gbA9WZ4PWk6w 6 0 R% >> >> /Type /Page >> endobj %% Contents for page 1 %% Original object ID: 27 0 4 0 obj << /Length 5 0 R >> stream q 1 0 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B Q q 1 0 0 1 0 0 cm /d_bpyeLix3gbA9WZ4PWk6w Do Q endstream endobj %QDF: ignore_newline 5 0 obj 102 endobj %% Original object ID: 23 0 6 0 obj << /BBox [ 0 0 612 792 ] /Resources << /Font << /F1 8 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 7 0 R >> stream 0.1 w q 0 0.028 595.275 841.861 re W* n q 0 0 0 rg BT 56.8 732.589 Td /F1 8 Tf( Rectangle) Tj ET Q q 0 0 0 rg BT 92.3 663.589 Td /F1 8 Tf (Highlight) Tj ET Q q 0 0 0 rg BT 56.8 566.989 Td /F1 8 Tf (inline note) Tj ET Q q 0 0 0 rg BT 56.8 539.389 Td /F1 8 Tf (----------) Tj ET Q q 0 0 0 rg BT 56.8 484.189 Td /F1 8 Tf (Typewriter) Tj ET Q q 0 0 0 rg BT 56.8 428.989 Td /F1 8 Tf (Popup) Tj ET Q Q endstream endobj %QDF: ignore_newline 7 0 obj 400 endobj %% Original object ID: 14 0 8 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> endobj xref 0 9 0000000000 65535 f 0000000052 00000 n 0000000133 00000 n 0000000243 00000 n 0000000490 00000 n 0000000669 00000 n 0000000717 00000 n 0000001371 00000 n 0000001419 00000 n trailer << /Root 1 0 R /Size 9 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 1523 %%EOF pdfarranger-1.11.0/tests/exporter/test17_out.pdf000066400000000000000000000023311463504064500216160ustar00rootroot00000000000000%PDF-1.3 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 2 /Kids [ 3 0 R 4 0 R ] /Type /Pages >> endobj %% Page 1 %% Original object ID: 7 0 3 0 obj << /Contents 5 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Type /Page >> endobj %% Page 2 %% Original object ID: 8 0 4 0 obj << /Contents 7 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Type /Page >> endobj %% Contents for page 1 %% Original object ID: 4 0 5 0 obj << /Length 6 0 R >> stream 1 0 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B endstream endobj %QDF: ignore_newline 6 0 obj 52 endobj %% Contents for page 2 %% Original object ID: 6 0 7 0 obj << /Length 8 0 R >> stream 0 1 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B endstream endobj %QDF: ignore_newline 8 0 obj 52 endobj xref 0 9 0000000000 65535 f 0000000052 00000 n 0000000133 00000 n 0000000252 00000 n 0000000405 00000 n 0000000571 00000 n 0000000700 00000 n 0000000769 00000 n 0000000898 00000 n trailer << /Root 1 0 R /Size 9 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 917 %%EOF pdfarranger-1.11.0/tests/exporter/test18_out.pdf000066400000000000000000000023311463504064500216170ustar00rootroot00000000000000%PDF-1.3 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 2 /Kids [ 3 0 R 4 0 R ] /Type /Pages >> endobj %% Page 1 %% Original object ID: 7 0 3 0 obj << /Contents 5 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Type /Page >> endobj %% Page 2 %% Original object ID: 8 0 4 0 obj << /Contents 7 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Type /Page >> endobj %% Contents for page 1 %% Original object ID: 4 0 5 0 obj << /Length 6 0 R >> stream 1 0 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B endstream endobj %QDF: ignore_newline 6 0 obj 52 endobj %% Contents for page 2 %% Original object ID: 6 0 7 0 obj << /Length 8 0 R >> stream 0 1 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B endstream endobj %QDF: ignore_newline 8 0 obj 52 endobj xref 0 9 0000000000 65535 f 0000000052 00000 n 0000000133 00000 n 0000000252 00000 n 0000000405 00000 n 0000000571 00000 n 0000000700 00000 n 0000000769 00000 n 0000000898 00000 n trailer << /Root 1 0 R /Size 9 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 917 %%EOF pdfarranger-1.11.0/tests/exporter/test19_8_out.pdf000066400000000000000000000214551463504064500220570ustar00rootroot00000000000000%PDF-1.6 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Outlines 2 0 R /Pages 3 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 4 /First 4 0 R /Last 5 0 R >> endobj %% Original object ID: 3 0 3 0 obj << /Count 4 /Kids [ 6 0 R 7 0 R 8 0 R 9 0 R ] /Type /Pages >> endobj %% Original object ID: 4 0 4 0 obj << /Count 0 /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Next 10 0 R /Parent 2 0 R /Title (Page 1) >> endobj %% Original object ID: 5 0 5 0 obj << /Count 0 /Dest [ 9 0 R /XYZ 56.7 773.189 0 ] /Parent 2 0 R /Prev 11 0 R /Title (Page 4) >> endobj %% Page 1 %% Original object ID: 6 0 6 0 obj << /Annots [ 12 0 R 13 0 R 14 0 R 15 0 R ] /Contents 16 0 R /Group << /CS /DeviceRGB /I true /S /Transparency >> /MediaBox [ 0 0 612 792 ] /Parent 3 0 R /Resources << /Font << /F2 18 0 R >> /ProcSet [ /PDF /Text ] >> /Rotate 0 /Type /Page >> endobj %% Page 2 %% Original object ID: 7 0 7 0 obj << /Annots [ 19 0 R 20 0 R 21 0 R 22 0 R ] /Contents 23 0 R /Group << /CS /DeviceRGB /I true /S /Transparency >> /MediaBox [ 0 0 612 792 ] /Parent 3 0 R /Resources << /Font << /F2 18 0 R >> /ProcSet [ /PDF /Text ] >> /Rotate 0 /Type /Page >> endobj %% Page 3 %% Original object ID: 8 0 8 0 obj << /Annots [ 25 0 R 26 0 R 27 0 R 28 0 R ] /Contents 29 0 R /Group << /CS /DeviceRGB /I true /S /Transparency >> /MediaBox [ 0 0 612 792 ] /Parent 3 0 R /Resources << /Font << /F2 18 0 R >> /ProcSet [ /PDF /Text ] >> /Rotate 0 /Type /Page >> endobj %% Page 4 %% Original object ID: 9 0 9 0 obj << /Annots [ 31 0 R 32 0 R 33 0 R 34 0 R ] /Contents 35 0 R /Group << /CS /DeviceRGB /I true /S /Transparency >> /MediaBox [ 0 0 612 792 ] /Parent 3 0 R /Resources << /Font << /F2 18 0 R >> /ProcSet [ /PDF /Text ] >> /Rotate 0 /Type /Page >> endobj %% Original object ID: 11 0 10 0 obj << /Count 0 /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Next 11 0 R /Parent 2 0 R /Prev 4 0 R /Title (Page 2) >> endobj %% Original object ID: 12 0 11 0 obj << /Count 0 /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Next 5 0 R /Parent 2 0 R /Prev 10 0 R /Title (Page 3) >> endobj %% Original object ID: 13 0 12 0 obj << /Border [ 0 0 0 ] /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 695 100 708 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 14 0 13 0 obj << /Border [ 0 0 0 ] /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 645 100 658 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 15 0 14 0 obj << /Border [ 0 0 0 ] /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 595 100 608 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 16 0 15 0 obj << /Border [ 0 0 0 ] /Dest [ 9 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 545 100 558 ] /Subtype /Link /Type /Annot >> endobj %% Contents for page 1 %% Original object ID: 17 0 16 0 obj << /Length 17 0 R >> stream 0.1 w q 0 0 0 rg BT 55 750 Td /F2 18 Tf (Page 1) Tj ET Q q 0 0 0.5019607843 rg BT 55 700 Td /F2 12 Tf (Page 1) Tj ET Q q 0 0 0.5019607843 rg BT 55 650 Td /F2 12 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 600 Td /F2 12 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 550 Td /F2 12 Tf (Page 4) Tj ET Q endstream endobj 17 0 obj 314 endobj %% Original object ID: 38 0 18 0 obj << /BaseFont /Courier /Subtype /TrueType /Type /Font >> endobj %% Original object ID: 19 0 19 0 obj << /Border [ 0 0 0 ] /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 695 100 708 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 20 0 20 0 obj << /Border [ 0 0 0 ] /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 645 100 658 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 21 0 21 0 obj << /Border [ 0 0 0 ] /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 595 100 608 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 22 0 22 0 obj << /Border [ 0 0 0 ] /Dest [ 9 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 545 100 558 ] /Subtype /Link /Type /Annot >> endobj %% Contents for page 2 %% Original object ID: 23 0 23 0 obj << /Length 24 0 R >> stream 0.1 w q 0 0 0 rg BT 55 750 Td /F2 18 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 700 Td /F2 12 Tf (Page 1) Tj ET Q q 0 0 0.5019607843 rg BT 55 650 Td /F2 12 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 600 Td /F2 12 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 550 Td /F2 12 Tf (Page 4) Tj ET Q endstream endobj 24 0 obj 314 endobj %% Original object ID: 25 0 25 0 obj << /Border [ 0 0 0 ] /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 695 100 708 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 26 0 26 0 obj << /Border [ 0 0 0 ] /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 645 100 658 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 27 0 27 0 obj << /Border [ 0 0 0 ] /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 595 100 608 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 28 0 28 0 obj << /Border [ 0 0 0 ] /Dest [ 9 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 545 100 558 ] /Subtype /Link /Type /Annot >> endobj %% Contents for page 3 %% Original object ID: 29 0 29 0 obj << /Length 30 0 R >> stream 0.1 w q 0 0 0 rg BT 55 750 Td /F2 18 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 700 Td /F2 12 Tf (Page 1) Tj ET Q q 0 0 0.5019607843 rg BT 55 650 Td /F2 12 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 600 Td /F2 12 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 550 Td /F2 12 Tf (Page 4) Tj ET Q endstream endobj 30 0 obj 314 endobj %% Original object ID: 31 0 31 0 obj << /Border [ 0 0 0 ] /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 695 100 708 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 32 0 32 0 obj << /Border [ 0 0 0 ] /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 645 100 658 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 33 0 33 0 obj << /Border [ 0 0 0 ] /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 595 100 608 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 34 0 34 0 obj << /Border [ 0 0 0 ] /Dest [ 9 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 545 100 558 ] /Subtype /Link /Type /Annot >> endobj %% Contents for page 4 %% Original object ID: 35 0 35 0 obj << /Length 36 0 R >> stream 0.1 w q 0 0 0 rg BT 55 750 Td /F2 18 Tf (Page 4) Tj ET Q q 0 0 0.5019607843 rg BT 55 700 Td /F2 12 Tf (Page 1) Tj ET Q q 0 0 0.5019607843 rg BT 55 650 Td /F2 12 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 600 Td /F2 12 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 550 Td /F2 12 Tf (Page 4) Tj ET Q endstream endobj 36 0 obj 314 endobj xref 0 37 0000000000 65535 f 0000000052 00000 n 0000000151 00000 n 0000000240 00000 n 0000000369 00000 n 0000000538 00000 n 0000000717 00000 n 0000001114 00000 n 0000001511 00000 n 0000001908 00000 n 0000002296 00000 n 0000002481 00000 n 0000002666 00000 n 0000002888 00000 n 0000003110 00000 n 0000003332 00000 n 0000003577 00000 n 0000003948 00000 n 0000003997 00000 n 0000004104 00000 n 0000004326 00000 n 0000004548 00000 n 0000004770 00000 n 0000005015 00000 n 0000005386 00000 n 0000005435 00000 n 0000005657 00000 n 0000005879 00000 n 0000006101 00000 n 0000006346 00000 n 0000006717 00000 n 0000006766 00000 n 0000006988 00000 n 0000007210 00000 n 0000007432 00000 n 0000007677 00000 n 0000008048 00000 n trailer << /DocChecksum /C0B7B02D232A8DFB9E661438F22D70FD /Root 1 0 R /Size 37 /ID [<747ec04935be9a8770701ac5cb22ab64><31415926535897932384626433832795>] >> startxref 8069 %%EOF pdfarranger-1.11.0/tests/exporter/test1_out.pdf000066400000000000000000000023311463504064500215270ustar00rootroot00000000000000%PDF-1.3 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 2 /Kids [ 3 0 R 4 0 R ] /Type /Pages >> endobj %% Page 1 %% Original object ID: 7 0 3 0 obj << /Contents 5 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Type /Page >> endobj %% Page 2 %% Original object ID: 8 0 4 0 obj << /Contents 7 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Type /Page >> endobj %% Contents for page 1 %% Original object ID: 4 0 5 0 obj << /Length 6 0 R >> stream 1 0 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B endstream endobj %QDF: ignore_newline 6 0 obj 52 endobj %% Contents for page 2 %% Original object ID: 6 0 7 0 obj << /Length 8 0 R >> stream 0 1 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B endstream endobj %QDF: ignore_newline 8 0 obj 52 endobj xref 0 9 0000000000 65535 f 0000000052 00000 n 0000000133 00000 n 0000000252 00000 n 0000000405 00000 n 0000000571 00000 n 0000000700 00000 n 0000000769 00000 n 0000000898 00000 n trailer << /Root 1 0 R /Size 9 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 917 %%EOF pdfarranger-1.11.0/tests/exporter/test20_8_out.pdf000066400000000000000000000214551463504064500220470ustar00rootroot00000000000000%PDF-1.6 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Outlines 2 0 R /Pages 3 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 4 /First 4 0 R /Last 5 0 R >> endobj %% Original object ID: 3 0 3 0 obj << /Count 4 /Kids [ 6 0 R 7 0 R 8 0 R 9 0 R ] /Type /Pages >> endobj %% Original object ID: 4 0 4 0 obj << /Count 0 /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Next 10 0 R /Parent 2 0 R /Title (Page 1) >> endobj %% Original object ID: 5 0 5 0 obj << /Count 0 /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Parent 2 0 R /Prev 11 0 R /Title (Page 4) >> endobj %% Page 1 %% Original object ID: 9 0 6 0 obj << /Annots [ 12 0 R 13 0 R 14 0 R 15 0 R ] /Contents 16 0 R /Group << /CS /DeviceRGB /I true /S /Transparency >> /MediaBox [ 0 0 612 792 ] /Parent 3 0 R /Resources << /Font << /F2 18 0 R >> /ProcSet [ /PDF /Text ] >> /Rotate 0 /Type /Page >> endobj %% Page 2 %% Original object ID: 7 0 7 0 obj << /Annots [ 19 0 R 20 0 R 21 0 R 22 0 R ] /Contents 23 0 R /Group << /CS /DeviceRGB /I true /S /Transparency >> /MediaBox [ 0 0 612 792 ] /Parent 3 0 R /Resources << /Font << /F2 18 0 R >> /ProcSet [ /PDF /Text ] >> /Rotate 0 /Type /Page >> endobj %% Page 3 %% Original object ID: 6 0 8 0 obj << /Annots [ 25 0 R 26 0 R 27 0 R 28 0 R ] /Contents 29 0 R /Group << /CS /DeviceRGB /I true /S /Transparency >> /MediaBox [ 0 0 612 792 ] /Parent 3 0 R /Resources << /Font << /F2 18 0 R >> /ProcSet [ /PDF /Text ] >> /Rotate 0 /Type /Page >> endobj %% Page 4 %% Original object ID: 8 0 9 0 obj << /Annots [ 31 0 R 32 0 R 33 0 R 34 0 R ] /Contents 35 0 R /Group << /CS /DeviceRGB /I true /S /Transparency >> /MediaBox [ 0 0 612 792 ] /Parent 3 0 R /Resources << /Font << /F2 18 0 R >> /ProcSet [ /PDF /Text ] >> /Rotate 0 /Type /Page >> endobj %% Original object ID: 11 0 10 0 obj << /Count 0 /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Next 11 0 R /Parent 2 0 R /Prev 4 0 R /Title (Page 2) >> endobj %% Original object ID: 12 0 11 0 obj << /Count 0 /Dest [ 9 0 R /XYZ 56.7 773.189 0 ] /Next 5 0 R /Parent 2 0 R /Prev 10 0 R /Title (Page 3) >> endobj %% Original object ID: 31 0 12 0 obj << /Border [ 0 0 0 ] /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 695 100 708 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 32 0 13 0 obj << /Border [ 0 0 0 ] /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 645 100 658 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 33 0 14 0 obj << /Border [ 0 0 0 ] /Dest [ 9 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 595 100 608 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 34 0 15 0 obj << /Border [ 0 0 0 ] /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 545 100 558 ] /Subtype /Link /Type /Annot >> endobj %% Contents for page 1 %% Original object ID: 35 0 16 0 obj << /Length 17 0 R >> stream 0.1 w q 0 0 0 rg BT 55 750 Td /F2 18 Tf (Page 4) Tj ET Q q 0 0 0.5019607843 rg BT 55 700 Td /F2 12 Tf (Page 1) Tj ET Q q 0 0 0.5019607843 rg BT 55 650 Td /F2 12 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 600 Td /F2 12 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 550 Td /F2 12 Tf (Page 4) Tj ET Q endstream endobj 17 0 obj 314 endobj %% Original object ID: 38 0 18 0 obj << /BaseFont /Courier /Subtype /TrueType /Type /Font >> endobj %% Original object ID: 19 0 19 0 obj << /Border [ 0 0 0 ] /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 695 100 708 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 20 0 20 0 obj << /Border [ 0 0 0 ] /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 645 100 658 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 21 0 21 0 obj << /Border [ 0 0 0 ] /Dest [ 9 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 595 100 608 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 22 0 22 0 obj << /Border [ 0 0 0 ] /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 545 100 558 ] /Subtype /Link /Type /Annot >> endobj %% Contents for page 2 %% Original object ID: 23 0 23 0 obj << /Length 24 0 R >> stream 0.1 w q 0 0 0 rg BT 55 750 Td /F2 18 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 700 Td /F2 12 Tf (Page 1) Tj ET Q q 0 0 0.5019607843 rg BT 55 650 Td /F2 12 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 600 Td /F2 12 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 550 Td /F2 12 Tf (Page 4) Tj ET Q endstream endobj 24 0 obj 314 endobj %% Original object ID: 13 0 25 0 obj << /Border [ 0 0 0 ] /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 695 100 708 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 14 0 26 0 obj << /Border [ 0 0 0 ] /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 645 100 658 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 15 0 27 0 obj << /Border [ 0 0 0 ] /Dest [ 9 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 595 100 608 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 16 0 28 0 obj << /Border [ 0 0 0 ] /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 545 100 558 ] /Subtype /Link /Type /Annot >> endobj %% Contents for page 3 %% Original object ID: 17 0 29 0 obj << /Length 30 0 R >> stream 0.1 w q 0 0 0 rg BT 55 750 Td /F2 18 Tf (Page 1) Tj ET Q q 0 0 0.5019607843 rg BT 55 700 Td /F2 12 Tf (Page 1) Tj ET Q q 0 0 0.5019607843 rg BT 55 650 Td /F2 12 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 600 Td /F2 12 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 550 Td /F2 12 Tf (Page 4) Tj ET Q endstream endobj 30 0 obj 314 endobj %% Original object ID: 25 0 31 0 obj << /Border [ 0 0 0 ] /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 695 100 708 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 26 0 32 0 obj << /Border [ 0 0 0 ] /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 645 100 658 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 27 0 33 0 obj << /Border [ 0 0 0 ] /Dest [ 9 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 595 100 608 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 28 0 34 0 obj << /Border [ 0 0 0 ] /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 545 100 558 ] /Subtype /Link /Type /Annot >> endobj %% Contents for page 4 %% Original object ID: 29 0 35 0 obj << /Length 36 0 R >> stream 0.1 w q 0 0 0 rg BT 55 750 Td /F2 18 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 700 Td /F2 12 Tf (Page 1) Tj ET Q q 0 0 0.5019607843 rg BT 55 650 Td /F2 12 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 600 Td /F2 12 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 550 Td /F2 12 Tf (Page 4) Tj ET Q endstream endobj 36 0 obj 314 endobj xref 0 37 0000000000 65535 f 0000000052 00000 n 0000000151 00000 n 0000000240 00000 n 0000000369 00000 n 0000000538 00000 n 0000000717 00000 n 0000001114 00000 n 0000001511 00000 n 0000001908 00000 n 0000002296 00000 n 0000002481 00000 n 0000002666 00000 n 0000002888 00000 n 0000003110 00000 n 0000003332 00000 n 0000003577 00000 n 0000003948 00000 n 0000003997 00000 n 0000004104 00000 n 0000004326 00000 n 0000004548 00000 n 0000004770 00000 n 0000005015 00000 n 0000005386 00000 n 0000005435 00000 n 0000005657 00000 n 0000005879 00000 n 0000006101 00000 n 0000006346 00000 n 0000006717 00000 n 0000006766 00000 n 0000006988 00000 n 0000007210 00000 n 0000007432 00000 n 0000007677 00000 n 0000008048 00000 n trailer << /DocChecksum /C0B7B02D232A8DFB9E661438F22D70FD /Root 1 0 R /Size 37 /ID [<747ec04935be9a8770701ac5cb22ab64><31415926535897932384626433832795>] >> startxref 8069 %%EOF pdfarranger-1.11.0/tests/exporter/test21_8_out.pdf000066400000000000000000000206251463504064500220460ustar00rootroot00000000000000%PDF-1.6 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Outlines 2 0 R /Pages 3 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 4 /First 4 0 R /Last 5 0 R >> endobj %% Original object ID: 3 0 3 0 obj << /Count 4 /Kids [ 6 0 R 7 0 R 8 0 R 9 0 R ] /Type /Pages >> endobj %% Original object ID: 4 0 4 0 obj << /Count 0 /Dest [ 10 0 R /XYZ 56.7 773.189 0 ] /Next 11 0 R /Parent 2 0 R /Title (Page 1) >> endobj %% Original object ID: 5 0 5 0 obj << /Count 0 /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Parent 2 0 R /Prev 12 0 R /Title (Page 4) >> endobj %% Page 1 %% Original object ID: 9 0 6 0 obj << /Annots [ 13 0 R 14 0 R 15 0 R 16 0 R ] /Contents 17 0 R /Group << /CS /DeviceRGB /I true /S /Transparency >> /MediaBox [ 0 0 612 792 ] /Parent 3 0 R /Resources << /Font << /F2 19 0 R >> /ProcSet [ /PDF /Text ] >> /Rotate 0 /Type /Page >> endobj %% Page 2 %% Original object ID: 7 0 7 0 obj << /Annots [ 20 0 R 21 0 R 22 0 R 23 0 R ] /Contents 24 0 R /Group << /CS /DeviceRGB /I true /S /Transparency >> /MediaBox [ 0 0 612 792 ] /Parent 3 0 R /Resources << /Font << /F2 19 0 R >> /ProcSet [ /PDF /Text ] >> /Rotate 0 /Type /Page >> endobj %% Page 3 %% Original object ID: 8 0 8 0 obj << /Annots [ 26 0 R 27 0 R 28 0 R 29 0 R ] /Contents 30 0 R /Group << /CS /DeviceRGB /I true /S /Transparency >> /MediaBox [ 0 0 612 792 ] /Parent 3 0 R /Resources << /Font << /F2 19 0 R >> /ProcSet [ /PDF /Text ] >> /Rotate 0 /Type /Page >> endobj %% Page 4 %% Original object ID: 40 0 9 0 obj << /Annots [ 32 0 R 33 0 R 34 0 R 35 0 R ] /Contents 17 0 R /Group << /CS /DeviceRGB /I true /S /Transparency >> /MediaBox [ 0 0 612 792 ] /Parent 3 0 R /Resources << /Font << /F2 19 0 R >> /ProcSet [ /PDF /Text ] >> /Rotate 0 /Type /Page >> endobj %% Original object ID: 6 0 10 0 obj null endobj %% Original object ID: 11 0 11 0 obj << /Count 0 /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Next 12 0 R /Parent 2 0 R /Prev 4 0 R /Title (Page 2) >> endobj %% Original object ID: 12 0 12 0 obj << /Count 0 /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Next 5 0 R /Parent 2 0 R /Prev 11 0 R /Title (Page 3) >> endobj %% Original object ID: 31 0 13 0 obj << /Border [ 0 0 0 ] /Dest [ 10 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 695 100 708 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 32 0 14 0 obj << /Border [ 0 0 0 ] /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 645 100 658 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 33 0 15 0 obj << /Border [ 0 0 0 ] /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 595 100 608 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 34 0 16 0 obj << /Border [ 0 0 0 ] /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 545 100 558 ] /Subtype /Link /Type /Annot >> endobj %% Contents for page 4 %% Original object ID: 35 0 17 0 obj << /Length 18 0 R >> stream 0.1 w q 0 0 0 rg BT 55 750 Td /F2 18 Tf (Page 4) Tj ET Q q 0 0 0.5019607843 rg BT 55 700 Td /F2 12 Tf (Page 1) Tj ET Q q 0 0 0.5019607843 rg BT 55 650 Td /F2 12 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 600 Td /F2 12 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 550 Td /F2 12 Tf (Page 4) Tj ET Q endstream endobj 18 0 obj 314 endobj %% Original object ID: 38 0 19 0 obj << /BaseFont /Courier /Subtype /TrueType /Type /Font >> endobj %% Original object ID: 19 0 20 0 obj << /Border [ 0 0 0 ] /Dest [ 10 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 695 100 708 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 20 0 21 0 obj << /Border [ 0 0 0 ] /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 645 100 658 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 21 0 22 0 obj << /Border [ 0 0 0 ] /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 595 100 608 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 22 0 23 0 obj << /Border [ 0 0 0 ] /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 545 100 558 ] /Subtype /Link /Type /Annot >> endobj %% Contents for page 2 %% Original object ID: 23 0 24 0 obj << /Length 25 0 R >> stream 0.1 w q 0 0 0 rg BT 55 750 Td /F2 18 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 700 Td /F2 12 Tf (Page 1) Tj ET Q q 0 0 0.5019607843 rg BT 55 650 Td /F2 12 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 600 Td /F2 12 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 550 Td /F2 12 Tf (Page 4) Tj ET Q endstream endobj 25 0 obj 314 endobj %% Original object ID: 25 0 26 0 obj << /Border [ 0 0 0 ] /Dest [ 10 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 695 100 708 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 26 0 27 0 obj << /Border [ 0 0 0 ] /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 645 100 658 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 27 0 28 0 obj << /Border [ 0 0 0 ] /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 595 100 608 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 28 0 29 0 obj << /Border [ 0 0 0 ] /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 545 100 558 ] /Subtype /Link /Type /Annot >> endobj %% Contents for page 3 %% Original object ID: 29 0 30 0 obj << /Length 31 0 R >> stream 0.1 w q 0 0 0 rg BT 55 750 Td /F2 18 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 700 Td /F2 12 Tf (Page 1) Tj ET Q q 0 0 0.5019607843 rg BT 55 650 Td /F2 12 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 600 Td /F2 12 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 550 Td /F2 12 Tf (Page 4) Tj ET Q endstream endobj 31 0 obj 314 endobj %% Original object ID: 41 0 32 0 obj << /Border [ 0 0 0 ] /Dest [ 10 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 695 100 708 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 42 0 33 0 obj << /Border [ 0 0 0 ] /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 645 100 658 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 43 0 34 0 obj << /Border [ 0 0 0 ] /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 595 100 608 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 44 0 35 0 obj << /Border [ 0 0 0 ] /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 545 100 558 ] /Subtype /Link /Type /Annot >> endobj xref 0 36 0000000000 65535 f 0000000052 00000 n 0000000151 00000 n 0000000240 00000 n 0000000369 00000 n 0000000539 00000 n 0000000718 00000 n 0000001115 00000 n 0000001512 00000 n 0000001910 00000 n 0000002297 00000 n 0000002347 00000 n 0000002532 00000 n 0000002717 00000 n 0000002940 00000 n 0000003162 00000 n 0000003384 00000 n 0000003629 00000 n 0000004000 00000 n 0000004049 00000 n 0000004156 00000 n 0000004379 00000 n 0000004601 00000 n 0000004823 00000 n 0000005068 00000 n 0000005439 00000 n 0000005488 00000 n 0000005711 00000 n 0000005933 00000 n 0000006155 00000 n 0000006400 00000 n 0000006771 00000 n 0000006820 00000 n 0000007043 00000 n 0000007265 00000 n 0000007487 00000 n trailer << /DocChecksum /C0B7B02D232A8DFB9E661438F22D70FD /Root 1 0 R /Size 36 /ID [<747ec04935be9a8770701ac5cb22ab64><31415926535897932384626433832795>] >> startxref 7681 %%EOF pdfarranger-1.11.0/tests/exporter/test22_8_out.pdf000066400000000000000000000214621463504064500220470ustar00rootroot00000000000000%PDF-1.6 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Outlines 2 0 R /Pages 3 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 4 /First 4 0 R /Last 5 0 R >> endobj %% Original object ID: 3 0 3 0 obj << /Count 4 /Kids [ 6 0 R 7 0 R 8 0 R 9 0 R ] /Type /Pages >> endobj %% Original object ID: 4 0 4 0 obj << /Count 0 /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Next 10 0 R /Parent 2 0 R /Title (Page 1) >> endobj %% Original object ID: 5 0 5 0 obj << /Count 0 /Dest [ 9 0 R /XYZ 56.7 773.189 0 ] /Parent 2 0 R /Prev 11 0 R /Title (Page 4) >> endobj %% Page 1 %% Original object ID: 6 0 6 0 obj << /Annots [ 12 0 R 13 0 R 14 0 R 15 0 R ] /Contents 16 0 R /Group << /CS /DeviceRGB /I true /S /Transparency >> /MediaBox [ 0 0 612 792 ] /Parent 3 0 R /Resources << /Font << /F2 18 0 R >> /ProcSet [ /PDF /Text ] >> /Rotate 0 /Type /Page >> endobj %% Page 2 %% Original object ID: 7 0 7 0 obj << /Annots [ 19 0 R 20 0 R 21 0 R 22 0 R ] /Contents 23 0 R /Group << /CS /DeviceRGB /I true /S /Transparency >> /MediaBox [ 0 0 612 792 ] /Parent 3 0 R /Resources << /Font << /F2 18 0 R >> /ProcSet [ /PDF /Text ] >> /Rotate 90 /Type /Page >> endobj %% Page 3 %% Original object ID: 8 0 8 0 obj << /Annots [ 25 0 R 26 0 R 27 0 R 28 0 R ] /Contents 29 0 R /Group << /CS /DeviceRGB /I true /S /Transparency >> /MediaBox [ 0 0 612 792 ] /Parent 3 0 R /Resources << /Font << /F2 18 0 R >> /ProcSet [ /PDF /Text ] >> /Rotate 180 /Type /Page >> endobj %% Page 4 %% Original object ID: 9 0 9 0 obj << /Annots [ 31 0 R 32 0 R 33 0 R 34 0 R ] /Contents 35 0 R /Group << /CS /DeviceRGB /I true /S /Transparency >> /MediaBox [ 0 0 612 792 ] /Parent 3 0 R /Resources << /Font << /F2 18 0 R >> /ProcSet [ /PDF /Text ] >> /Rotate 270 /Type /Page >> endobj %% Original object ID: 11 0 10 0 obj << /Count 0 /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Next 11 0 R /Parent 2 0 R /Prev 4 0 R /Title (Page 2) >> endobj %% Original object ID: 12 0 11 0 obj << /Count 0 /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Next 5 0 R /Parent 2 0 R /Prev 10 0 R /Title (Page 3) >> endobj %% Original object ID: 13 0 12 0 obj << /Border [ 0 0 0 ] /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 695 100 708 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 14 0 13 0 obj << /Border [ 0 0 0 ] /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 645 100 658 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 15 0 14 0 obj << /Border [ 0 0 0 ] /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 595 100 608 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 16 0 15 0 obj << /Border [ 0 0 0 ] /Dest [ 9 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 545 100 558 ] /Subtype /Link /Type /Annot >> endobj %% Contents for page 1 %% Original object ID: 17 0 16 0 obj << /Length 17 0 R >> stream 0.1 w q 0 0 0 rg BT 55 750 Td /F2 18 Tf (Page 1) Tj ET Q q 0 0 0.5019607843 rg BT 55 700 Td /F2 12 Tf (Page 1) Tj ET Q q 0 0 0.5019607843 rg BT 55 650 Td /F2 12 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 600 Td /F2 12 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 550 Td /F2 12 Tf (Page 4) Tj ET Q endstream endobj 17 0 obj 314 endobj %% Original object ID: 38 0 18 0 obj << /BaseFont /Courier /Subtype /TrueType /Type /Font >> endobj %% Original object ID: 19 0 19 0 obj << /Border [ 0 0 0 ] /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 695 100 708 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 20 0 20 0 obj << /Border [ 0 0 0 ] /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 645 100 658 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 21 0 21 0 obj << /Border [ 0 0 0 ] /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 595 100 608 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 22 0 22 0 obj << /Border [ 0 0 0 ] /Dest [ 9 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 545 100 558 ] /Subtype /Link /Type /Annot >> endobj %% Contents for page 2 %% Original object ID: 23 0 23 0 obj << /Length 24 0 R >> stream 0.1 w q 0 0 0 rg BT 55 750 Td /F2 18 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 700 Td /F2 12 Tf (Page 1) Tj ET Q q 0 0 0.5019607843 rg BT 55 650 Td /F2 12 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 600 Td /F2 12 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 550 Td /F2 12 Tf (Page 4) Tj ET Q endstream endobj 24 0 obj 314 endobj %% Original object ID: 25 0 25 0 obj << /Border [ 0 0 0 ] /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 695 100 708 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 26 0 26 0 obj << /Border [ 0 0 0 ] /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 645 100 658 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 27 0 27 0 obj << /Border [ 0 0 0 ] /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 595 100 608 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 28 0 28 0 obj << /Border [ 0 0 0 ] /Dest [ 9 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 545 100 558 ] /Subtype /Link /Type /Annot >> endobj %% Contents for page 3 %% Original object ID: 29 0 29 0 obj << /Length 30 0 R >> stream 0.1 w q 0 0 0 rg BT 55 750 Td /F2 18 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 700 Td /F2 12 Tf (Page 1) Tj ET Q q 0 0 0.5019607843 rg BT 55 650 Td /F2 12 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 600 Td /F2 12 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 550 Td /F2 12 Tf (Page 4) Tj ET Q endstream endobj 30 0 obj 314 endobj %% Original object ID: 31 0 31 0 obj << /Border [ 0 0 0 ] /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 695 100 708 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 32 0 32 0 obj << /Border [ 0 0 0 ] /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 645 100 658 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 33 0 33 0 obj << /Border [ 0 0 0 ] /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 595 100 608 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 34 0 34 0 obj << /Border [ 0 0 0 ] /Dest [ 9 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 545 100 558 ] /Subtype /Link /Type /Annot >> endobj %% Contents for page 4 %% Original object ID: 35 0 35 0 obj << /Length 36 0 R >> stream 0.1 w q 0 0 0 rg BT 55 750 Td /F2 18 Tf (Page 4) Tj ET Q q 0 0 0.5019607843 rg BT 55 700 Td /F2 12 Tf (Page 1) Tj ET Q q 0 0 0.5019607843 rg BT 55 650 Td /F2 12 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 600 Td /F2 12 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 550 Td /F2 12 Tf (Page 4) Tj ET Q endstream endobj 36 0 obj 314 endobj xref 0 37 0000000000 65535 f 0000000052 00000 n 0000000151 00000 n 0000000240 00000 n 0000000369 00000 n 0000000538 00000 n 0000000717 00000 n 0000001114 00000 n 0000001512 00000 n 0000001911 00000 n 0000002301 00000 n 0000002486 00000 n 0000002671 00000 n 0000002893 00000 n 0000003115 00000 n 0000003337 00000 n 0000003582 00000 n 0000003953 00000 n 0000004002 00000 n 0000004109 00000 n 0000004331 00000 n 0000004553 00000 n 0000004775 00000 n 0000005020 00000 n 0000005391 00000 n 0000005440 00000 n 0000005662 00000 n 0000005884 00000 n 0000006106 00000 n 0000006351 00000 n 0000006722 00000 n 0000006771 00000 n 0000006993 00000 n 0000007215 00000 n 0000007437 00000 n 0000007682 00000 n 0000008053 00000 n trailer << /DocChecksum /C0B7B02D232A8DFB9E661438F22D70FD /Root 1 0 R /Size 37 /ID [<747ec04935be9a8770701ac5cb22ab64><31415926535897932384626433832795>] >> startxref 8074 %%EOF pdfarranger-1.11.0/tests/exporter/test23_8_out.pdf000066400000000000000000000202521463504064500220440ustar00rootroot00000000000000%PDF-1.6 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Outlines 2 0 R /Pages 3 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 4 /First 4 0 R /Last 5 0 R >> endobj %% Original object ID: 3 0 3 0 obj << /Count 4 /Kids [ 6 0 R 7 0 R 8 0 R 9 0 R ] /Type /Pages >> endobj %% Original object ID: 4 0 4 0 obj << /Count 0 /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Next 10 0 R /Parent 2 0 R /Title (Page 1) >> endobj %% Original object ID: 5 0 5 0 obj << /Count 0 /Dest [ 9 0 R /XYZ 56.7 773.189 0 ] /Parent 2 0 R /Prev 11 0 R /Title (Page 4) >> endobj %% Page 1 %% Original object ID: 6 0 6 0 obj << /Annots [ 12 0 R 13 0 R 14 0 R 15 0 R ] /Contents 16 0 R /Group << /CS /DeviceRGB /I true /S /Transparency >> /MediaBox [ 0 0 612 792 ] /Parent 3 0 R /Resources << /Font << /F2 18 0 R >> /ProcSet [ /PDF /Text ] >> /Rotate 0 /Type /Page >> endobj %% Page 2 %% Original object ID: 7 0 7 0 obj << /Contents 19 0 R /MediaBox [ 0 0 306 396 ] /Parent 3 0 R /Resources << /XObject << /p5 21 0 R >> >> /Rotate 0 /Type /Page >> endobj %% Page 3 %% Original object ID: 8 0 8 0 obj << /Annots [ 23 0 R 24 0 R 25 0 R 26 0 R ] /Contents 27 0 R /Group << /CS /DeviceRGB /I true /S /Transparency >> /MediaBox [ 0 0 612 792 ] /Parent 3 0 R /Resources << /Font << /F2 18 0 R >> /ProcSet [ /PDF /Text ] >> /Rotate 0 /Type /Page >> endobj %% Page 4 %% Original object ID: 9 0 9 0 obj << /Annots [ 29 0 R 30 0 R 31 0 R 32 0 R ] /Contents 33 0 R /Group << /CS /DeviceRGB /I true /S /Transparency >> /MediaBox [ 0 0 612 792 ] /Parent 3 0 R /Resources << /Font << /F2 18 0 R >> /ProcSet [ /PDF /Text ] >> /Rotate 0 /Type /Page >> endobj %% Original object ID: 11 0 10 0 obj << /Count 0 /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Next 11 0 R /Parent 2 0 R /Prev 4 0 R /Title (Page 2) >> endobj %% Original object ID: 12 0 11 0 obj << /Count 0 /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Next 5 0 R /Parent 2 0 R /Prev 10 0 R /Title (Page 3) >> endobj %% Original object ID: 13 0 12 0 obj << /Border [ 0 0 0 ] /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 695 100 708 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 14 0 13 0 obj << /Border [ 0 0 0 ] /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 645 100 658 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 15 0 14 0 obj << /Border [ 0 0 0 ] /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 595 100 608 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 16 0 15 0 obj << /Border [ 0 0 0 ] /Dest [ 9 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 545 100 558 ] /Subtype /Link /Type /Annot >> endobj %% Contents for page 1 %% Original object ID: 17 0 16 0 obj << /Length 17 0 R >> stream 0.1 w q 0 0 0 rg BT 55 750 Td /F2 18 Tf (Page 1) Tj ET Q q 0 0 0.5019607843 rg BT 55 700 Td /F2 12 Tf (Page 1) Tj ET Q q 0 0 0.5019607843 rg BT 55 650 Td /F2 12 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 600 Td /F2 12 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 550 Td /F2 12 Tf (Page 4) Tj ET Q endstream endobj 17 0 obj 314 endobj %% Original object ID: 38 0 18 0 obj << /BaseFont /Courier /Subtype /TrueType /Type /Font >> endobj %% Contents for page 2 %% Original object ID: 42 0 19 0 obj << /Length 20 0 R >> stream q 0.5 0 0 0.5 0 0 cm /p5 Do Q endstream endobj %QDF: ignore_newline 20 0 obj 29 endobj %% Original object ID: 41 0 21 0 obj << /BBox [ 0 0 612 792 ] /Group << /CS /DeviceRGB /I true /S /Transparency >> /Matrix [ 1 0 0 1 0 0 ] /Resources << /Font << /F2 18 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 22 0 R >> stream 0.1 w q 0 0 0 rg BT 55 750 Td /F2 18 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 700 Td /F2 12 Tf (Page 1) Tj ET Q q 0 0 0.5019607843 rg BT 55 650 Td /F2 12 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 600 Td /F2 12 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 550 Td /F2 12 Tf (Page 4) Tj ET Q endstream endobj 22 0 obj 314 endobj %% Original object ID: 25 0 23 0 obj << /Border [ 0 0 0 ] /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 695 100 708 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 26 0 24 0 obj << /Border [ 0 0 0 ] /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 645 100 658 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 27 0 25 0 obj << /Border [ 0 0 0 ] /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 595 100 608 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 28 0 26 0 obj << /Border [ 0 0 0 ] /Dest [ 9 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 545 100 558 ] /Subtype /Link /Type /Annot >> endobj %% Contents for page 3 %% Original object ID: 29 0 27 0 obj << /Length 28 0 R >> stream 0.1 w q 0 0 0 rg BT 55 750 Td /F2 18 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 700 Td /F2 12 Tf (Page 1) Tj ET Q q 0 0 0.5019607843 rg BT 55 650 Td /F2 12 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 600 Td /F2 12 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 550 Td /F2 12 Tf (Page 4) Tj ET Q endstream endobj 28 0 obj 314 endobj %% Original object ID: 31 0 29 0 obj << /Border [ 0 0 0 ] /Dest [ 6 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 695 100 708 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 32 0 30 0 obj << /Border [ 0 0 0 ] /Dest [ 7 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 645 100 658 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 33 0 31 0 obj << /Border [ 0 0 0 ] /Dest [ 8 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 595 100 608 ] /Subtype /Link /Type /Annot >> endobj %% Original object ID: 34 0 32 0 obj << /Border [ 0 0 0 ] /Dest [ 9 0 R /XYZ 56.7 773.189 0 ] /Rect [ 54 545 100 558 ] /Subtype /Link /Type /Annot >> endobj %% Contents for page 4 %% Original object ID: 35 0 33 0 obj << /Length 34 0 R >> stream 0.1 w q 0 0 0 rg BT 55 750 Td /F2 18 Tf (Page 4) Tj ET Q q 0 0 0.5019607843 rg BT 55 700 Td /F2 12 Tf (Page 1) Tj ET Q q 0 0 0.5019607843 rg BT 55 650 Td /F2 12 Tf (Page 2) Tj ET Q q 0 0 0.5019607843 rg BT 55 600 Td /F2 12 Tf (Page 3) Tj ET Q q 0 0 0.5019607843 rg BT 55 550 Td /F2 12 Tf (Page 4) Tj ET Q endstream endobj 34 0 obj 314 endobj xref 0 35 0000000000 65535 f 0000000052 00000 n 0000000151 00000 n 0000000240 00000 n 0000000369 00000 n 0000000538 00000 n 0000000717 00000 n 0000001114 00000 n 0000001341 00000 n 0000001738 00000 n 0000002126 00000 n 0000002311 00000 n 0000002496 00000 n 0000002718 00000 n 0000002940 00000 n 0000003162 00000 n 0000003407 00000 n 0000003778 00000 n 0000003827 00000 n 0000003957 00000 n 0000004065 00000 n 0000004113 00000 n 0000004783 00000 n 0000004832 00000 n 0000005054 00000 n 0000005276 00000 n 0000005498 00000 n 0000005743 00000 n 0000006114 00000 n 0000006163 00000 n 0000006385 00000 n 0000006607 00000 n 0000006829 00000 n 0000007074 00000 n 0000007445 00000 n trailer << /DocChecksum /C0B7B02D232A8DFB9E661438F22D70FD /Root 1 0 R /Size 35 /ID [<747ec04935be9a8770701ac5cb22ab64><31415926535897932384626433832795>] >> startxref 7466 %%EOF pdfarranger-1.11.0/tests/exporter/test24_8_out.pdf000066400000000000000000000124531463504064500220510ustar00rootroot00000000000000%PDF-1.6 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /AcroForm 2 0 R /Pages 3 0 R /Type /Catalog >> endobj %% Original object ID: 41 0 2 0 obj << /DR 4 0 R /Fields [ 5 0 R 6 0 R ] >> endobj %% Original object ID: 2 0 3 0 obj << /Count 2 /Kids [ 7 0 R 8 0 R ] /Type /Pages >> endobj %% Original object ID: 42 0 4 0 obj << /Font << /F1 9 0 R /ZaDb 10 0 R >> >> endobj %% Original object ID: 40 0 5 0 obj << /AP << /N 11 0 R >> /DA (0 0 0 rg /F1 12 Tf) /DV (******) /FT /Tx /Ff 0 /Rect [ 150 550 298 570 ] /Subtype /Widget /T (t1) /Type /Annot /V (******) >> endobj %% Original object ID: 44 0 6 0 obj << /DV /1 /FT /Btn /Ff 49152 /Kids [ 13 0 R 14 0 R 15 0 R ] /T (r1) /V /1 >> endobj %% Page 1 %% Original object ID: 3 0 7 0 obj << /Contents 16 0 R /MediaBox [ 0 0 612 792 ] /Parent 3 0 R /Rotate 0 /Type /Page >> endobj %% Page 2 %% Original object ID: 23 0 8 0 obj << /Annots [ 5 0 R 13 0 R 14 0 R 15 0 R ] /Contents 18 0 R /MediaBox [ 0 0 612 792 ] /Parent 3 0 R /Resources << /Font << /F1 9 0 R >> >> /Rotate 0 /Type /Page >> endobj %% Original object ID: 28 0 9 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> endobj %% Original object ID: 29 0 10 0 obj << /BaseFont /ZapfDingbats /Subtype /Type1 /Type /Font >> endobj %% Original object ID: 43 0 11 0 obj << /BBox [ -2 -2 148 10 ] /Resources 20 0 R /Subtype /Form /Type /XObject /Length 12 0 R >> stream /Tx BMC q BT /F1 10 Tf (******) Tj ET Q EMC endstream endobj 12 0 obj 48 endobj %% Original object ID: 45 0 13 0 obj << /AP << /N << /1 21 0 R /Off 23 0 R >> >> /AS /1 /DA (/F1 0 Tf) /F 4 /FT /Btn /MK << /CA (l) >> /Parent 6 0 R /Rect [ 150 650 165 665 ] /Subtype /Widget /Type /Annot >> endobj %% Original object ID: 46 0 14 0 obj << /AP << /N << /2 25 0 R /Off 27 0 R >> >> /AS /Off /DA (/F1 0 Tf) /F 4 /FT /Btn /MK << /CA (l) >> /Parent 6 0 R /Rect [ 150 630 165 645 ] /Subtype /Widget /Type /Annot >> endobj %% Original object ID: 47 0 15 0 obj << /AP << /N << /3 29 0 R /Off 31 0 R >> >> /AS /Off /DA (/F1 0 Tf) /F 4 /FT /Btn /MK << /CA (l) >> /Parent 6 0 R /Rect [ 150 610 165 625 ] /Subtype /Widget /Type /Annot >> endobj %% Contents for page 1 %% Original object ID: 10 0 16 0 obj << /Length 17 0 R >> stream 1 0 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B endstream endobj 17 0 obj 52 endobj %% Contents for page 2 %% Original object ID: 38 0 18 0 obj << /Length 19 0 R >> stream q 1 1 1 rg 150 550 150 20 re B Q q /F1 16 Tf 20 TL 170 650 Td (Radio Button 1) Tj (Radio Button 2) ' (Radio Button 3) ' Q endstream endobj 19 0 obj 122 endobj %% Original object ID: 27 0 20 0 obj << /Font << /F1 9 0 R /ZaDb 10 0 R >> >> endobj %% Original object ID: 48 0 21 0 obj << /BBox [ 0 0 15 15 ] /Resources 20 0 R /Subtype /Form /Type /XObject /Length 22 0 R >> stream q 0 1 0 rg BT /ZaDb 12 Tf 0 0 Td ( 4 ) Tj ET Q endstream endobj 22 0 obj 47 endobj %% Original object ID: 49 0 23 0 obj << /BBox [ 0 0 15 15 ] /Resources 20 0 R /Subtype /Form /Type /XObject /Length 24 0 R >> stream q 1 0 0 rg BT /ZaDb 12 Tf 0 0 Td ( 8 ) Tj ET Q endstream endobj 24 0 obj 47 endobj %% Original object ID: 50 0 25 0 obj << /BBox [ 0 0 15 15 ] /Resources 20 0 R /Subtype /Form /Type /XObject /Length 26 0 R >> stream q 0 1 0 rg BT /ZaDb 12 Tf 0 0 Td ( 4 ) Tj ET Q endstream endobj 26 0 obj 47 endobj %% Original object ID: 51 0 27 0 obj << /BBox [ 0 0 15 15 ] /Resources 20 0 R /Subtype /Form /Type /XObject /Length 28 0 R >> stream q 1 0 0 rg BT /ZaDb 12 Tf 0 0 Td ( 8 ) Tj ET Q endstream endobj 28 0 obj 47 endobj %% Original object ID: 52 0 29 0 obj << /BBox [ 0 0 15 15 ] /Resources 20 0 R /Subtype /Form /Type /XObject /Length 30 0 R >> stream q 0 1 0 rg BT /ZaDb 12 Tf 0 0 Td ( 4 ) Tj ET Q endstream endobj 30 0 obj 47 endobj %% Original object ID: 53 0 31 0 obj << /BBox [ 0 0 15 15 ] /Resources 20 0 R /Subtype /Form /Type /XObject /Length 32 0 R >> stream q 1 0 0 rg BT /ZaDb 12 Tf 0 0 Td ( 8 ) Tj ET Q endstream endobj 32 0 obj 47 endobj xref 0 33 0000000000 65535 f 0000000052 00000 n 0000000152 00000 n 0000000249 00000 n 0000000359 00000 n 0000000456 00000 n 0000000698 00000 n 0000000854 00000 n 0000001021 00000 n 0000001294 00000 n 0000001426 00000 n 0000001535 00000 n 0000001737 00000 n 0000001785 00000 n 0000002067 00000 n 0000002351 00000 n 0000002658 00000 n 0000002767 00000 n 0000002838 00000 n 0000003017 00000 n 0000003066 00000 n 0000003164 00000 n 0000003362 00000 n 0000003410 00000 n 0000003608 00000 n 0000003656 00000 n 0000003854 00000 n 0000003902 00000 n 0000004100 00000 n 0000004148 00000 n 0000004346 00000 n 0000004394 00000 n 0000004592 00000 n trailer << /Root 1 0 R /Size 33 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 4612 %%EOF pdfarranger-1.11.0/tests/exporter/test24_out.pdf000066400000000000000000000103421463504064500216150ustar00rootroot00000000000000%PDF-1.3 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 2 /Kids [ 3 0 R 4 0 R ] /Type /Pages >> endobj %% Page 1 %% Original object ID: 34 0 3 0 obj << /Contents 5 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Type /Page >> endobj %% Page 2 %% Original object ID: 35 0 4 0 obj << /Annots 7 0 R /Contents 8 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 10 0 R >> >> /Type /Page >> endobj %% Contents for page 1 %% Original object ID: 4 0 5 0 obj << /Length 6 0 R >> stream 1 0 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B endstream endobj %QDF: ignore_newline 6 0 obj 52 endobj %% Original object ID: 22 0 7 0 obj [ 11 0 R 12 0 R 13 0 R 14 0 R ] endobj %% Contents for page 2 %% Original object ID: 20 0 8 0 obj << /Length 9 0 R >> stream q 1 1 1 rg 150 550 150 20 re B Q q /F1 16 Tf 20 TL 170 650 Td (Radio Button 1) Tj (Radio Button 2) ' (Radio Button 3) ' Q endstream endobj %QDF: ignore_newline 9 0 obj 122 endobj %% Original object ID: 10 0 10 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> endobj %% Original object ID: 23 0 11 0 obj << /AP << /N 15 0 R >> /DA (0 0 0 rg /F1 12 Tf) /DV (******) /FT /Tx /Ff 0 /Rect [ 150 550 298 570 ] /Subtype /Widget /T (t1) /Type /Annot /V (******) >> endobj %% Original object ID: 28 0 12 0 obj << /AP << /N << /1 17 0 R /Off 19 0 R >> >> /AS /1 /DA (/F1 0 Tf) /F 4 /FT /Btn /MK << /CA (l) >> /Parent 21 0 R /Rect [ 150 650 165 665 ] /Subtype /Widget /Type /Annot >> endobj %% Original object ID: 32 0 13 0 obj << /AP << /N << /2 17 0 R /Off 19 0 R >> >> /AS /Off /DA (/F1 0 Tf) /F 4 /FT /Btn /MK << /CA (l) >> /Parent 21 0 R /Rect [ 150 630 165 645 ] /Subtype /Widget /Type /Annot >> endobj %% Original object ID: 33 0 14 0 obj << /AP << /N << /3 17 0 R /Off 19 0 R >> >> /AS /Off /DA (/F1 0 Tf) /F 4 /FT /Btn /MK << /CA (l) >> /Parent 21 0 R /Rect [ 150 610 165 625 ] /Subtype /Widget /Type /Annot >> endobj %% Original object ID: 24 0 15 0 obj << /BBox [ -2 -2 148 10 ] /Resources 22 0 R /Subtype /Form /Type /XObject /Length 16 0 R >> stream /Tx BMC q BT /F1 10 Tf (******) Tj ET Q EMC endstream endobj %QDF: ignore_newline 16 0 obj 48 endobj %% Original object ID: 29 0 17 0 obj << /BBox [ 0 0 15 15 ] /Resources 22 0 R /Subtype /Form /Type /XObject /Length 18 0 R >> stream q 0 1 0 rg BT /ZaDb 12 Tf 0 0 Td ( 4 ) Tj ET Q endstream endobj %QDF: ignore_newline 18 0 obj 47 endobj %% Original object ID: 30 0 19 0 obj << /BBox [ 0 0 15 15 ] /Resources 22 0 R /Subtype /Form /Type /XObject /Length 20 0 R >> stream q 1 0 0 rg BT /ZaDb 12 Tf 0 0 Td ( 8 ) Tj ET Q endstream endobj %QDF: ignore_newline 20 0 obj 47 endobj %% Original object ID: 31 0 21 0 obj << /DV /1 /FT /Btn /Ff 49152 /Kids [ 12 0 R 13 0 R 14 0 R ] /T (r1) /V /1 >> endobj %% Original object ID: 25 0 22 0 obj << /Font << /F1 23 0 R /ZaDb 24 0 R >> >> endobj %% Original object ID: 26 0 23 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> endobj %% Original object ID: 27 0 24 0 obj << /BaseFont /ZapfDingbats /Subtype /Type1 /Type /Font >> endobj xref 0 25 0000000000 65535 f 0000000052 00000 n 0000000133 00000 n 0000000253 00000 n 0000000407 00000 n 0000000647 00000 n 0000000776 00000 n 0000000823 00000 n 0000000930 00000 n 0000001129 00000 n 0000001177 00000 n 0000001310 00000 n 0000001553 00000 n 0000001836 00000 n 0000002121 00000 n 0000002406 00000 n 0000002630 00000 n 0000002678 00000 n 0000002898 00000 n 0000002946 00000 n 0000003166 00000 n 0000003214 00000 n 0000003362 00000 n 0000003461 00000 n 0000003594 00000 n trailer << /Root 1 0 R /Size 25 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 3675 %%EOF pdfarranger-1.11.0/tests/exporter/test25_8_out.pdf000066400000000000000000000162731463504064500220560ustar00rootroot00000000000000%PDF-1.6 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /AcroForm << /DR 2 0 R /Fields [ 3 0 R 4 0 R 5 0 R 6 0 R ] >> /Pages 7 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Font << /F1 8 0 R /ZaDb 9 0 R >> >> endobj %% Original object ID: 3 0 3 0 obj << /AP << /N 10 0 R >> /DA (0 0 0 rg /F1 12 Tf) /DV (******) /FT /Tx /Ff 0 /Rect [ 150 550 298 570 ] /Subtype /Widget /T (t1) /Type /Annot /V (******) >> endobj %% Original object ID: 4 0 4 0 obj << /DV /1 /FT /Btn /Ff 49152 /Kids [ 12 0 R 13 0 R 14 0 R ] /T (r1) /V /1 >> endobj %% Original object ID: 21 0 5 0 obj << /AP << /N 15 0 R >> /DA (0 0 0 rg /F1 12 Tf) /DV (******) /FT /Tx /Ff 0 /Rect [ 150 550 298 570 ] /Subtype /Widget /T (t1+1) /Type /Annot /V (******) >> endobj %% Original object ID: 23 0 6 0 obj << /DV /1 /FT /Btn /Ff 49152 /Kids [ 17 0 R 18 0 R 19 0 R ] /T (r1+1) /V /1 >> endobj %% Original object ID: 5 0 7 0 obj << /Count 2 /Kids [ 20 0 R 21 0 R ] /Type /Pages >> endobj %% Original object ID: 6 0 8 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> endobj %% Original object ID: 7 0 9 0 obj << /BaseFont /ZapfDingbats /Subtype /Type1 /Type /Font >> endobj %% Original object ID: 8 0 10 0 obj << /BBox [ -2 -2 148 10 ] /Resources 2 0 R /Subtype /Form /Type /XObject /Length 11 0 R >> stream /Tx BMC q BT /F1 10 Tf (******) Tj ET Q EMC endstream endobj 11 0 obj 48 endobj %% Original object ID: 10 0 12 0 obj << /AP << /N << /1 22 0 R /Off 24 0 R >> >> /AS /1 /DA (/F1 0 Tf) /F 4 /FT /Btn /MK << /CA (l) >> /Parent 4 0 R /Rect [ 150 650 165 665 ] /Subtype /Widget /Type /Annot >> endobj %% Original object ID: 11 0 13 0 obj << /AP << /N << /2 22 0 R /Off 24 0 R >> >> /AS /Off /DA (/F1 0 Tf) /F 4 /FT /Btn /MK << /CA (l) >> /Parent 4 0 R /Rect [ 150 630 165 645 ] /Subtype /Widget /Type /Annot >> endobj %% Original object ID: 12 0 14 0 obj << /AP << /N << /3 22 0 R /Off 24 0 R >> >> /AS /Off /DA (/F1 0 Tf) /F 4 /FT /Btn /MK << /CA (l) >> /Parent 4 0 R /Rect [ 150 610 165 625 ] /Subtype /Widget /Type /Annot >> endobj %% Original object ID: 22 0 15 0 obj << /BBox [ -2 -2 148 10 ] /Resources 2 0 R /Subtype /Form /Type /XObject /Length 16 0 R >> stream /Tx BMC q BT /F1 10 Tf (******) Tj ET Q EMC endstream endobj 16 0 obj 48 endobj %% Original object ID: 24 0 17 0 obj << /AP << /N << /1 26 0 R /Off 28 0 R >> >> /AS /1 /DA (/F1 0 Tf) /F 4 /FT /Btn /MK << /CA (l) >> /Parent 6 0 R /Rect [ 150 650 165 665 ] /Subtype /Widget /Type /Annot >> endobj %% Original object ID: 25 0 18 0 obj << /AP << /N << /2 30 0 R /Off 32 0 R >> >> /AS /Off /DA (/F1 0 Tf) /F 4 /FT /Btn /MK << /CA (l) >> /Parent 6 0 R /Rect [ 150 630 165 645 ] /Subtype /Widget /Type /Annot >> endobj %% Original object ID: 26 0 19 0 obj << /AP << /N << /3 34 0 R /Off 36 0 R >> >> /AS /Off /DA (/F1 0 Tf) /F 4 /FT /Btn /MK << /CA (l) >> /Parent 6 0 R /Rect [ 150 610 165 625 ] /Subtype /Widget /Type /Annot >> endobj %% Page 1 %% Original object ID: 13 0 20 0 obj << /Annots [ 3 0 R 12 0 R 13 0 R 14 0 R ] /Contents 38 0 R /MediaBox [ 0 0 612 792 ] /Parent 7 0 R /Resources << /Font << /F1 8 0 R >> >> /Rotate 0 /Type /Page >> endobj %% Page 2 %% Original object ID: 20 0 21 0 obj << /Annots [ 5 0 R 17 0 R 18 0 R 19 0 R ] /Contents 38 0 R /MediaBox [ 0 0 612 792 ] /Parent 7 0 R /Resources << /Font << /F1 8 0 R >> >> /Rotate 0 /Type /Page >> endobj %% Original object ID: 14 0 22 0 obj << /BBox [ 0 0 15 15 ] /Resources 2 0 R /Subtype /Form /Type /XObject /Length 23 0 R >> stream q 0 1 0 rg BT /ZaDb 12 Tf 0 0 Td ( 4 ) Tj ET Q endstream endobj 23 0 obj 47 endobj %% Original object ID: 16 0 24 0 obj << /BBox [ 0 0 15 15 ] /Resources 2 0 R /Subtype /Form /Type /XObject /Length 25 0 R >> stream q 1 0 0 rg BT /ZaDb 12 Tf 0 0 Td ( 8 ) Tj ET Q endstream endobj 25 0 obj 47 endobj %% Original object ID: 27 0 26 0 obj << /BBox [ 0 0 15 15 ] /Resources 2 0 R /Subtype /Form /Type /XObject /Length 27 0 R >> stream q 0 1 0 rg BT /ZaDb 12 Tf 0 0 Td ( 4 ) Tj ET Q endstream endobj 27 0 obj 47 endobj %% Original object ID: 28 0 28 0 obj << /BBox [ 0 0 15 15 ] /Resources 2 0 R /Subtype /Form /Type /XObject /Length 29 0 R >> stream q 1 0 0 rg BT /ZaDb 12 Tf 0 0 Td ( 8 ) Tj ET Q endstream endobj 29 0 obj 47 endobj %% Original object ID: 29 0 30 0 obj << /BBox [ 0 0 15 15 ] /Resources 2 0 R /Subtype /Form /Type /XObject /Length 31 0 R >> stream q 0 1 0 rg BT /ZaDb 12 Tf 0 0 Td ( 4 ) Tj ET Q endstream endobj 31 0 obj 47 endobj %% Original object ID: 30 0 32 0 obj << /BBox [ 0 0 15 15 ] /Resources 2 0 R /Subtype /Form /Type /XObject /Length 33 0 R >> stream q 1 0 0 rg BT /ZaDb 12 Tf 0 0 Td ( 8 ) Tj ET Q endstream endobj 33 0 obj 47 endobj %% Original object ID: 31 0 34 0 obj << /BBox [ 0 0 15 15 ] /Resources 2 0 R /Subtype /Form /Type /XObject /Length 35 0 R >> stream q 0 1 0 rg BT /ZaDb 12 Tf 0 0 Td ( 4 ) Tj ET Q endstream endobj 35 0 obj 47 endobj %% Original object ID: 32 0 36 0 obj << /BBox [ 0 0 15 15 ] /Resources 2 0 R /Subtype /Form /Type /XObject /Length 37 0 R >> stream q 1 0 0 rg BT /ZaDb 12 Tf 0 0 Td ( 8 ) Tj ET Q endstream endobj 37 0 obj 47 endobj %% Contents for page 2 %% Original object ID: 18 0 38 0 obj << /Length 39 0 R >> stream q 1 1 1 rg 150 550 150 20 re B Q q /F1 16 Tf 20 TL 170 650 Td (Radio Button 1) Tj (Radio Button 2) ' (Radio Button 3) ' Q endstream endobj 39 0 obj 122 endobj xref 0 40 0000000000 65535 f 0000000052 00000 n 0000000235 00000 n 0000000330 00000 n 0000000571 00000 n 0000000718 00000 n 0000000962 00000 n 0000001110 00000 n 0000001221 00000 n 0000001352 00000 n 0000001459 00000 n 0000001660 00000 n 0000001708 00000 n 0000001990 00000 n 0000002274 00000 n 0000002558 00000 n 0000002759 00000 n 0000002807 00000 n 0000003089 00000 n 0000003373 00000 n 0000003667 00000 n 0000003951 00000 n 0000004225 00000 n 0000004422 00000 n 0000004470 00000 n 0000004667 00000 n 0000004715 00000 n 0000004912 00000 n 0000004960 00000 n 0000005157 00000 n 0000005205 00000 n 0000005402 00000 n 0000005450 00000 n 0000005647 00000 n 0000005695 00000 n 0000005892 00000 n 0000005940 00000 n 0000006137 00000 n 0000006208 00000 n 0000006387 00000 n trailer << /Root 1 0 R /Size 40 /ID [<31415926535897932384626433832795>] >> startxref 6408 %%EOF pdfarranger-1.11.0/tests/exporter/test25_out.pdf000066400000000000000000000154231463504064500216230ustar00rootroot00000000000000%PDF-1.3 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 2 /Kids [ 3 0 R 4 0 R ] /Type /Pages >> endobj %% Page 1 %% Original object ID: 45 0 3 0 obj << /Annots 5 0 R /Contents 6 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 8 0 R >> >> /Type /Page >> endobj %% Page 2 %% Original object ID: 46 0 4 0 obj << /Annots 9 0 R /Contents 6 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 8 0 R >> >> /Type /Page >> endobj %% Original object ID: 20 0 5 0 obj [ 10 0 R 11 0 R 12 0 R 13 0 R ] endobj %% Contents for page 2 %% Original object ID: 18 0 6 0 obj << /Length 7 0 R >> stream q 1 1 1 rg 150 550 150 20 re B Q q /F1 16 Tf 20 TL 170 650 Td (Radio Button 1) Tj (Radio Button 2) ' (Radio Button 3) ' Q endstream endobj %QDF: ignore_newline 7 0 obj 122 endobj %% Original object ID: 8 0 8 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> endobj %% Original object ID: 33 0 9 0 obj [ 14 0 R 15 0 R 16 0 R 17 0 R ] endobj %% Original object ID: 21 0 10 0 obj << /AP << /N 18 0 R >> /DA (0 0 0 rg /F1 12 Tf) /DV (******) /FT /Tx /Ff 0 /Rect [ 150 550 298 570 ] /Subtype /Widget /T (t1) /Type /Annot /V (******) >> endobj %% Original object ID: 26 0 11 0 obj << /AP << /N << /1 20 0 R /Off 22 0 R >> >> /AS /1 /DA (/F1 0 Tf) /F 4 /FT /Btn /MK << /CA (l) >> /Parent 24 0 R /Rect [ 150 650 165 665 ] /Subtype /Widget /Type /Annot >> endobj %% Original object ID: 30 0 12 0 obj << /AP << /N << /2 20 0 R /Off 22 0 R >> >> /AS /Off /DA (/F1 0 Tf) /F 4 /FT /Btn /MK << /CA (l) >> /Parent 24 0 R /Rect [ 150 630 165 645 ] /Subtype /Widget /Type /Annot >> endobj %% Original object ID: 31 0 13 0 obj << /AP << /N << /3 20 0 R /Off 22 0 R >> >> /AS /Off /DA (/F1 0 Tf) /F 4 /FT /Btn /MK << /CA (l) >> /Parent 24 0 R /Rect [ 150 610 165 625 ] /Subtype /Widget /Type /Annot >> endobj %% Original object ID: 34 0 14 0 obj << /AP << /N 25 0 R >> /DA (0 0 0 rg /F1 12 Tf) /DV (******) /FT /Tx /Ff 0 /Rect [ 150 550 298 570 ] /Subtype /Widget /T (t1) /Type /Annot /V (******) >> endobj %% Original object ID: 39 0 15 0 obj << /AP << /N << /1 27 0 R /Off 29 0 R >> >> /AS /1 /DA (/F1 0 Tf) /F 4 /FT /Btn /MK << /CA (l) >> /Parent 31 0 R /Rect [ 150 650 165 665 ] /Subtype /Widget /Type /Annot >> endobj %% Original object ID: 43 0 16 0 obj << /AP << /N << /2 27 0 R /Off 29 0 R >> >> /AS /Off /DA (/F1 0 Tf) /F 4 /FT /Btn /MK << /CA (l) >> /Parent 31 0 R /Rect [ 150 630 165 645 ] /Subtype /Widget /Type /Annot >> endobj %% Original object ID: 44 0 17 0 obj << /AP << /N << /3 27 0 R /Off 29 0 R >> >> /AS /Off /DA (/F1 0 Tf) /F 4 /FT /Btn /MK << /CA (l) >> /Parent 31 0 R /Rect [ 150 610 165 625 ] /Subtype /Widget /Type /Annot >> endobj %% Original object ID: 22 0 18 0 obj << /BBox [ -2 -2 148 10 ] /Resources 32 0 R /Subtype /Form /Type /XObject /Length 19 0 R >> stream /Tx BMC q BT /F1 10 Tf (******) Tj ET Q EMC endstream endobj %QDF: ignore_newline 19 0 obj 48 endobj %% Original object ID: 27 0 20 0 obj << /BBox [ 0 0 15 15 ] /Resources 32 0 R /Subtype /Form /Type /XObject /Length 21 0 R >> stream q 0 1 0 rg BT /ZaDb 12 Tf 0 0 Td ( 4 ) Tj ET Q endstream endobj %QDF: ignore_newline 21 0 obj 47 endobj %% Original object ID: 28 0 22 0 obj << /BBox [ 0 0 15 15 ] /Resources 32 0 R /Subtype /Form /Type /XObject /Length 23 0 R >> stream q 1 0 0 rg BT /ZaDb 12 Tf 0 0 Td ( 8 ) Tj ET Q endstream endobj %QDF: ignore_newline 23 0 obj 47 endobj %% Original object ID: 29 0 24 0 obj << /DV /1 /FT /Btn /Ff 49152 /Kids [ 11 0 R 12 0 R 13 0 R ] /T (r1) /V /1 >> endobj %% Original object ID: 35 0 25 0 obj << /BBox [ -2 -2 148 10 ] /Resources 33 0 R /Subtype /Form /Type /XObject /Length 26 0 R >> stream /Tx BMC q BT /F1 10 Tf (******) Tj ET Q EMC endstream endobj %QDF: ignore_newline 26 0 obj 48 endobj %% Original object ID: 40 0 27 0 obj << /BBox [ 0 0 15 15 ] /Resources 33 0 R /Subtype /Form /Type /XObject /Length 28 0 R >> stream q 0 1 0 rg BT /ZaDb 12 Tf 0 0 Td ( 4 ) Tj ET Q endstream endobj %QDF: ignore_newline 28 0 obj 47 endobj %% Original object ID: 41 0 29 0 obj << /BBox [ 0 0 15 15 ] /Resources 33 0 R /Subtype /Form /Type /XObject /Length 30 0 R >> stream q 1 0 0 rg BT /ZaDb 12 Tf 0 0 Td ( 8 ) Tj ET Q endstream endobj %QDF: ignore_newline 30 0 obj 47 endobj %% Original object ID: 42 0 31 0 obj << /DV /1 /FT /Btn /Ff 49152 /Kids [ 15 0 R 16 0 R 17 0 R ] /T (r1) /V /1 >> endobj %% Original object ID: 23 0 32 0 obj << /Font << /F1 34 0 R /ZaDb 35 0 R >> >> endobj %% Original object ID: 36 0 33 0 obj << /Font << /F1 36 0 R /ZaDb 37 0 R >> >> endobj %% Original object ID: 24 0 34 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> endobj %% Original object ID: 25 0 35 0 obj << /BaseFont /ZapfDingbats /Subtype /Type1 /Type /Font >> endobj %% Original object ID: 37 0 36 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> endobj %% Original object ID: 38 0 37 0 obj << /BaseFont /ZapfDingbats /Subtype /Type1 /Type /Font >> endobj xref 0 38 0000000000 65535 f 0000000052 00000 n 0000000133 00000 n 0000000253 00000 n 0000000480 00000 n 0000000697 00000 n 0000000804 00000 n 0000001003 00000 n 0000001050 00000 n 0000001182 00000 n 0000001266 00000 n 0000001509 00000 n 0000001792 00000 n 0000002077 00000 n 0000002362 00000 n 0000002605 00000 n 0000002888 00000 n 0000003173 00000 n 0000003458 00000 n 0000003682 00000 n 0000003730 00000 n 0000003950 00000 n 0000003998 00000 n 0000004218 00000 n 0000004266 00000 n 0000004414 00000 n 0000004638 00000 n 0000004686 00000 n 0000004906 00000 n 0000004954 00000 n 0000005174 00000 n 0000005222 00000 n 0000005370 00000 n 0000005469 00000 n 0000005568 00000 n 0000005701 00000 n 0000005810 00000 n 0000005943 00000 n trailer << /Root 1 0 R /Size 38 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 6024 %%EOF pdfarranger-1.11.0/tests/exporter/test2_out.pdf000066400000000000000000000023641463504064500215360ustar00rootroot00000000000000%PDF-1.3 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 2 /Kids [ 3 0 R 4 0 R ] /Type /Pages >> endobj %% Page 1 %% Original object ID: 7 0 3 0 obj << /Contents 5 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Rotate 90 /Type /Page >> endobj %% Page 2 %% Original object ID: 8 0 4 0 obj << /Contents 7 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Rotate 180 /Type /Page >> endobj %% Contents for page 1 %% Original object ID: 4 0 5 0 obj << /Length 6 0 R >> stream 1 0 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B endstream endobj %QDF: ignore_newline 6 0 obj 52 endobj %% Contents for page 2 %% Original object ID: 6 0 7 0 obj << /Length 8 0 R >> stream 0 1 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B endstream endobj %QDF: ignore_newline 8 0 obj 52 endobj xref 0 9 0000000000 65535 f 0000000052 00000 n 0000000133 00000 n 0000000252 00000 n 0000000418 00000 n 0000000598 00000 n 0000000727 00000 n 0000000796 00000 n 0000000925 00000 n trailer << /Root 1 0 R /Size 9 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 944 %%EOF pdfarranger-1.11.0/tests/exporter/test3_out.pdf000066400000000000000000000020071463504064500215310ustar00rootroot00000000000000%PDF-1.3 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 2 /Kids [ 3 0 R 4 0 R ] /Type /Pages >> endobj %% Page 1 %% Original object ID: 6 0 3 0 obj << /Contents 5 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Rotate 180 /Type /Page >> endobj %% Page 2 %% Original object ID: 7 0 4 0 obj << /Contents 5 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Rotate 270 /Type /Page >> endobj %% Contents for page 2 %% Original object ID: 4 0 5 0 obj << /Length 6 0 R >> stream 1 0 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B endstream endobj %QDF: ignore_newline 6 0 obj 52 endobj xref 0 7 0000000000 65535 f 0000000052 00000 n 0000000133 00000 n 0000000252 00000 n 0000000419 00000 n 0000000599 00000 n 0000000728 00000 n trailer << /Root 1 0 R /Size 7 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 747 %%EOF pdfarranger-1.11.0/tests/exporter/test4_out.pdf000066400000000000000000000022121463504064500215300ustar00rootroot00000000000000%PDF-1.3 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 1 /Kids [ 3 0 R ] /Type /Pages >> endobj %% Page 1 %% Original object ID: 7 0 3 0 obj << /Contents 4 0 R /MediaBox [ 0 0 153 198 ] /Parent 2 0 R /Resources << /XObject << /p1 6 0 R% >> >> /Rotate 0 /Type /Page >> endobj %% Contents for page 1 %% Original object ID: 6 0 4 0 obj << /Length 5 0 R >> stream q 0.25 0 0 0.25 0 0 cm /p1 Do Q endstream endobj %QDF: ignore_newline 5 0 obj 31 endobj %% Original object ID: 5 0 6 0 obj << /BBox [ 0 0 612 792 ] /Subtype /Form /Type /XObject /Length 7 0 R >> stream 1 0 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B endstream endobj %QDF: ignore_newline 7 0 obj 52 endobj xref 0 8 0000000000 65535 f 0000000052 00000 n 0000000133 00000 n 0000000242 00000 n 0000000480 00000 n 0000000588 00000 n 0000000634 00000 n 0000000839 00000 n trailer << /Root 1 0 R /Size 8 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 858 %%EOF pdfarranger-1.11.0/tests/exporter/test5_out.pdf000066400000000000000000000014771463504064500215450ustar00rootroot00000000000000%PDF-1.3 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 1 /Kids [ 3 0 R ] /Type /Pages >> endobj %% Page 1 %% Original object ID: 5 0 3 0 obj << /Contents 4 0 R /MediaBox [ 61.2 316.8 489.6 554.4 ] /Parent 2 0 R /Type /Page >> endobj %% Contents for page 1 %% Original object ID: 4 0 4 0 obj << /Length 5 0 R >> stream 1 0 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B endstream endobj %QDF: ignore_newline 5 0 obj 52 endobj xref 0 6 0000000000 65535 f 0000000052 00000 n 0000000133 00000 n 0000000242 00000 n 0000000419 00000 n 0000000548 00000 n trailer << /Root 1 0 R /Size 6 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 567 %%EOF pdfarranger-1.11.0/tests/exporter/test6_out.pdf000066400000000000000000000023561463504064500215430ustar00rootroot00000000000000%PDF-1.3 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 3 /Kids [ 3 0 R 4 0 R 5 0 R ] /Type /Pages >> endobj %% Page 1 %% Original object ID: 7 0 3 0 obj << /Contents 6 0 R /MediaBox [ 183.6 79.2 367.2 633.6 ] /Parent 2 0 R /Rotate 90 /Type /Page >> endobj %% Page 2 %% Original object ID: 8 0 4 0 obj << /Contents 6 0 R /MediaBox [ 122.4 237.6 550.8 475.2 ] /Parent 2 0 R /Rotate 180 /Type /Page >> endobj %% Page 3 %% Original object ID: 9 0 5 0 obj << /Contents 6 0 R /MediaBox [ 244.8 158.4 428.4 712.8 ] /Parent 2 0 R /Rotate 270 /Type /Page >> endobj %% Contents for page 3 %% Original object ID: 4 0 6 0 obj << /Length 7 0 R >> stream 1 0 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B endstream endobj %QDF: ignore_newline 7 0 obj 52 endobj xref 0 8 0000000000 65535 f 0000000052 00000 n 0000000133 00000 n 0000000262 00000 n 0000000439 00000 n 0000000618 00000 n 0000000810 00000 n 0000000939 00000 n trailer << /Root 1 0 R /Size 8 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 958 %%EOF pdfarranger-1.11.0/tests/exporter/test7_8_out.pdf000066400000000000000000000030401463504064500217620ustar00rootroot00000000000000%PDF-1.6 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 1 /Kids [ 3 0 R ] /Type /Pages >> endobj %% Page 1 %% Original object ID: 3 0 3 0 obj << /Contents 4 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /XObject << /J9u3ozUuw-IrRDh7dVLPcg 6 0 R% >> >> /Rotate 0 /Type /Page >> endobj %% Contents for page 1 %% Original object ID: 27 0 4 0 obj << /Length 5 0 R% >> stream q 1 0 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B Q q 1 0 0 1 0 0 cm /J9u3ozUuw-IrRDh7dVLPcg Do% Q endstream endobj 5 0 obj 103% endobj %% Original object ID: 23 0 6 0 obj << /BBox [ 0 0 612 792 ] /Matrix [ 1 0 0 1 0 0 ] /Resources << /Font << /F1 8 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 7 0 R >> stream 0.1 w q 0 0.028 595.275 841.861 re W* n q 0 0 0 rg BT 234.1 558.289 Td /F1 36 Tf (Overlay)Tj ET Q Q endstream endobj 7 0 obj 101 endobj %% Original object ID: 22 0 8 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> endobj xref 0 9 0000000000 65535 f 0000000052 00000 n 0000000133 00000 n 0000000242 00000 n 0000000501 00000 n 0000000658 00000 n 0000000706 00000 n 0000001091 00000 n 0000001139 00000 n trailer << /Root 1 0 R /Size 9 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 1243 %%EOF pdfarranger-1.11.0/tests/exporter/test7_out.pdf000066400000000000000000000030141463504064500215340ustar00rootroot00000000000000%PDF-1.3 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 1 /Kids [ 3 0 R ] /Type /Pages >> endobj %% Page 1 %% Original object ID: 10 0 3 0 obj << /Contents 4 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /XObject << /70hWrlZA0eKk1AbAW0hZKA 6 0 R% >> >> /Type /Page >> endobj %% Contents for page 1 %% Original object ID: 16 0 4 0 obj << /Length 5 0 R >> stream q 1 0 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B Q q 1 0 0 1 0 0 cm /70hWrlZA0eKk1AbAW0hZKA Do Q endstream endobj %QDF: ignore_newline 5 0 obj 102 endobj %% Original object ID: 12 0 6 0 obj << /BBox [ 0 0 612 792 ] /Resources << /Font << /F1 8 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 7 0 R >> stream 0.1 w q 0 0.028 595.275 841.861 re W* n q 0 0 0 rg BT 234.1 558.289 Td /F1 36 Tf (Overlay)Tj ET Q Q endstream endobj %QDF: ignore_newline 7 0 obj 101 endobj %% Original object ID: 9 0 8 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> endobj xref 0 9 0000000000 65535 f 0000000052 00000 n 0000000133 00000 n 0000000243 00000 n 0000000490 00000 n 0000000669 00000 n 0000000717 00000 n 0000001072 00000 n 0000001119 00000 n trailer << /Root 1 0 R /Size 9 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 1223 %%EOF pdfarranger-1.11.0/tests/exporter/test8_out.pdf000066400000000000000000000030111463504064500215320ustar00rootroot00000000000000%PDF-1.3 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 1 /Kids [ 3 0 R ] /Type /Pages >> endobj %% Page 1 %% Original object ID: 10 0 3 0 obj << /Contents 4 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /XObject << /QyLhdhfWPMYJBqblP4oe4Q 6 0 R% >> >> /Type /Page >> endobj %% Contents for page 1 %% Original object ID: 14 0 4 0 obj << /Length 5 0 R >> stream q 1 0 0 1 0 0 cm /QyLhdhfWPMYJBqblP4oe4Q Do Q 1 0 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B endstream endobj %QDF: ignore_newline 5 0 obj 98 endobj %% Original object ID: 12 0 6 0 obj << /BBox [ 0 0 612 792 ] /Resources << /Font << /F1 8 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 7 0 R >> stream 0.1 w q 0 0.028 595.275 841.861 re W* n q 0 0 0 rg BT 198.6 544.489 Td /F1 36 Tf (Underlay) Tj ET Q Q endstream endobj %QDF: ignore_newline 7 0 obj 103 endobj %% Original object ID: 9 0 8 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> endobj xref 0 9 0000000000 65535 f 0000000052 00000 n 0000000133 00000 n 0000000243 00000 n 0000000490 00000 n 0000000665 00000 n 0000000712 00000 n 0000001069 00000 n 0000001116 00000 n trailer << /Root 1 0 R /Size 9 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 1220 %%EOF pdfarranger-1.11.0/tests/exporter/test95_out.pdf000066400000000000000000000032241463504064500216260ustar00rootroot00000000000000%PDF-1.3 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 1 /Kids [ 3 0 R ] /Type /Pages >> endobj %% Page 1 %% Original object ID: 8 0 3 0 obj << /Contents 4 0 R /MediaBox [ 0 0 611.5 791.5 ] /Parent 2 0 R /Resources << /Font << /F1 6 0 R >> /ProcSet [ /PDF /Text ] /XObject << /KTeNqJ-MQikuZqV7AIK9wA 7 0 R% >> >> /Type /Page >> endobj %% Contents for page 1 %% Original object ID: 14 0 4 0 obj << /Length 5 0 R >> stream q 0.1 w q 0 0.028 595.275 841.861 re W* n q 0 0 0 rg BT 234.1 558.289 Td /F1 36 Tf (Overlay)Tj ET Q Q Q q 1 0 0 1 0 0 cm /KTeNqJ-MQikuZqV7AIK9wA Do Q endstream endobj %QDF: ignore_newline 5 0 obj 151 endobj %% Original object ID: 6 0 6 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> endobj %% Original object ID: 10 0 7 0 obj << /BBox [ 0 0 611.5 791.5 ] /Resources << /Font << /F1 6 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 8 0 R >> stream 0.1 w q 0 0.028 595.275 841.861 re W* n q 0 0 0 rg BT 234.1 558.289 Td /F1 36 Tf (Overlay)Tj ET Q Q endstream endobj %QDF: ignore_newline 8 0 obj 101 endobj xref 0 9 0000000000 65535 f 0000000052 00000 n 0000000133 00000 n 0000000242 00000 n 0000000573 00000 n 0000000801 00000 n 0000000848 00000 n 0000000980 00000 n 0000001339 00000 n trailer << /Root 1 0 R /Size 9 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 1359 %%EOF pdfarranger-1.11.0/tests/exporter/test96_out.pdf000066400000000000000000000032201463504064500216230ustar00rootroot00000000000000%PDF-1.3 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 1 /Kids [ 3 0 R ] /Type /Pages >> endobj %% Page 1 %% Original object ID: 8 0 3 0 obj << /Contents 4 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 6 0 R >> /ProcSet [ /PDF /Text ] /XObject << /ZPxQn6rkKXKIpdvyqfkGlw 7 0 R% >> >> /Type /Page >> endobj %% Contents for page 1 %% Original object ID: 14 0 4 0 obj << /Length 5 0 R >> stream q 0.1 w q 0 0.028 595.275 841.861 re W* n q 0 0 0 rg BT 198.6 544.489 Td /F1 36 Tf (Underlay) Tj ET Q Q Q q 1 0 0 1 0 0 cm /ZPxQn6rkKXKIpdvyqfkGlw Do Q endstream endobj %QDF: ignore_newline 5 0 obj 153 endobj %% Original object ID: 6 0 6 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> endobj %% Original object ID: 10 0 7 0 obj << /BBox [ 0 0 612 792 ] /Resources << /Font << /F1 6 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 8 0 R >> stream 0.1 w q 0 0.028 595.275 841.861 re W* n q 0 0 0 rg BT 198.6 544.489 Td /F1 36 Tf (Underlay) Tj ET Q Q endstream endobj %QDF: ignore_newline 8 0 obj 103 endobj xref 0 9 0000000000 65535 f 0000000052 00000 n 0000000133 00000 n 0000000242 00000 n 0000000569 00000 n 0000000799 00000 n 0000000846 00000 n 0000000978 00000 n 0000001335 00000 n trailer << /Root 1 0 R /Size 9 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 1355 %%EOF pdfarranger-1.11.0/tests/exporter/test9_out.pdf000066400000000000000000000052011463504064500215360ustar00rootroot00000000000000%PDF-1.3 % %QDF-1.0 %% Original object ID: 1 0 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj %% Original object ID: 2 0 2 0 obj << /Count 2 /Kids [ 3 0 R 4 0 R ] /Type /Pages >> endobj %% Page 1 %% Original object ID: 12 0 3 0 obj << /Contents 5 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /XObject << /RfN9XC5s8q3xH1M6GYXolA 7 0 R% >> >> /Type /Page >> endobj %% Page 2 %% Original object ID: 14 0 4 0 obj << /Contents 9 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /XObject << /L_A2ZKWi8FYtCk-9VaENRw 11 0 R% >> >> /Type /Page >> endobj %% Contents for page 1 %% Original object ID: 20 0 5 0 obj << /Length 6 0 R >> stream q 1 0 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B Q q 0.77273 0 0 0.77273 0 159.54545 cm /RfN9XC5s8q3xH1M6GYXolA Do Q endstream endobj %QDF: ignore_newline 6 0 obj 122 endobj %% Original object ID: 16 0 7 0 obj << /BBox [ 0 0 612 792 ] /Matrix [ 0 -1 1 0 0 612 ] /Resources << /Font << /F1 13 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 8 0 R >> stream 0.1 w q 0 0.028 595.275 841.861 re W* n q 0 0 0 rg BT 234.1 558.289 Td /F1 36 Tf (Overlay)Tj ET Q Q endstream endobj %QDF: ignore_newline 8 0 obj 101 endobj %% Contents for page 2 %% Original object ID: 25 0 9 0 obj << /Length 10 0 R >> stream q 1 0 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B Q q 1 0 0 1 0 0 cm /L_A2ZKWi8FYtCk-9VaENRw Do Q endstream endobj %QDF: ignore_newline 10 0 obj 102 endobj %% Original object ID: 21 0 11 0 obj << /BBox [ 0 0 612 792 ] /Matrix [ -1 0 0 -1 612 792 ] /Resources << /Font << /F1 13 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 12 0 R >> stream 0.1 w q 0 0.028 595.275 841.861 re W* n q 0 0 0 rg BT 234.1 558.289 Td /F1 36 Tf (Overlay)Tj ET Q Q endstream endobj %QDF: ignore_newline 12 0 obj 101 endobj %% Original object ID: 9 0 13 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> endobj xref 0 14 0000000000 65535 f 0000000052 00000 n 0000000133 00000 n 0000000253 00000 n 0000000487 00000 n 0000000735 00000 n 0000000934 00000 n 0000000982 00000 n 0000001393 00000 n 0000001464 00000 n 0000001644 00000 n 0000001693 00000 n 0000002109 00000 n 0000002157 00000 n trailer << /Root 1 0 R /Size 14 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref 2262 %%EOF pdfarranger-1.11.0/tests/test.pdf000066400000000000000000000007361463504064500167160ustar00rootroot00000000000000%PDF-1.4 % 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj 2 0 obj << /Count 2 /Kids [ 3 0 R 4 0 R ] /Type /Pages >> endobj 3 0 obj << /Contents 5 0 R /Type /Page >> endobj 4 0 obj << /Contents 6 0 R /Type /Page >> endobj 5 0 obj << /Length 52 >> stream 1 0 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B endstream endobj 6 0 obj << /Length 52 >> stream 0 1 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B endstream endobj xref trailer << /Root 1 0 R >> startxref 0 %%EOF pdfarranger-1.11.0/tests/test.py000066400000000000000000000767671463504064500166160ustar00rootroot00000000000000import os import subprocess import sys import unittest import time import tempfile from typing import Tuple import shutil import packaging.version from importlib import metadata import pikepdf """ Those tests are using Dogtail https://gitlab.com/dogtail/dogtail Other tools using dogtail where you can get example on how to use it: * https://gitlab.gnome.org/GNOME/gnome-boxes * https://gitlab.gnome.org/GNOME/gnome-software * https://gitlab.gnome.org/GNOME/gnome-characters * https://gitlab.gnome.org/GNOME/eog * https://github.com/kirienko/gourmet * https://github.com/virt-manager/virt-manager * https://gitlab.gnome.org/GNOME/gnome-weather/ * http://threedepict.sourceforge.net/ * https://salsa.debian.org/pkg-privacy-team/onioncircuits/-/tree/master/debian/tests Example of Dogtail using a filechooser: filechooser = app.child(roleName='file chooser') treeview = filechooser.child(roleName='table', name='Files') treeview.keyCombo('L') treeview.typeText('qpdf-manual.pdf') filechooser.button('Open').click() You may need to run the following commands to run those tests in your current session instead of Xvfb: * /usr/libexec/at-spi-bus-launcher --launch-immediately * setxkbmap -v fr * gsettings set org.gnome.desktop.interface toolkit-accessibility true Tests need to be run with a window size of 545x600. It must be set in ~/.config/pdfarranger/config.ini. Some tips: * Use to print widget tree (names and roles) self._app().dump() Example of how to run the test locally: python3 -X tracemalloc -u -m unittest -v -f tests.test # run whole test python3 -X tracemalloc -u -m unittest -v -f tests.test.TestBatch5 # run only TestBatch5 """ def group(title): if "GITHUB_ACTIONS" in os.environ: print("::group::" + title) def endgroup(): if "GITHUB_ACTIONS" in os.environ: print("::endgroup::") def check_img2pdf(version): try: import img2pdf v = [int(x) for x in img2pdf.__version__.split(".")] r = v >= version except Exception: r = False return r def have_pikepdf3(): return packaging.version.parse( metadata.version("pikepdf") ) >= packaging.version.Version("3") def have_pikepdf8(): return packaging.version.parse( metadata.version("pikepdf") ) >= packaging.version.Version("8.0") class XvfbManager: """Base class for running offscreen tests""" def __init__(self, display=":99"): self.display = display env = os.environ.copy() env["DISPLAY"] = display self.xvfb_proc = None self.dbus_proc = None self.xvfb_proc = subprocess.Popen(["Xvfb", self.display]) cmd = ["dbus-daemon", "--print-address=1", "--session"] self.dbus_proc = subprocess.Popen( cmd, stdout=subprocess.PIPE, text=True, env=env ) self.dbus_addr = self.dbus_proc.stdout.readline().strip() self.dbus_proc.stdout.close() os.environ["DISPLAY"] = display os.environ["DBUS_SESSION_BUS_ADDRESS"] = self.dbus_addr def kill(self): if "GITHUB_ACTIONS" not in os.environ: # Workaround. On GHA killing dbus also kill this python process. # And we don't care about zombie processes on GHA self.dbus_proc.kill() self.dbus_proc.wait() self.xvfb_proc.kill() self.xvfb_proc.wait() class DogtailManager: def __init__(self): self.xvfb = None if "DISPLAY" not in os.environ: self.xvfb = XvfbManager() os.environ["LC_MESSAGES"] = "C" os.environ["GTK_MODULES"] = "gail:atk-bridge" cmd = "gsettings set org.gnome.desktop.interface toolkit-accessibility true" subprocess.check_call(cmd.split()) # dogtail must be imported after setting DBUS_SESSION_BUS_ADDRESS from dogtail.config import config config.debugSleep = False # long duration at startup config.searchBackoffDuration = 1 config.actionDelay = 0.01 config.runInterval = 0.01 config.defaultDelay = 0.1 config.debugSearching = False config.searchCutoffCount = 30 config.runTimeout = 1 config.searchShowingOnly = True config.typingDelay = 0.05 def kill(self): if self.xvfb is not None: self.xvfb.kill() # dogtail does not support change of X11 server so it must be a singleton dogtail_manager = DogtailManager() class PdfArrangerManager: def __init__(self, args=None): self.process = None args = [] if args is None else args cmd = [sys.executable, "-u", "-X", "tracemalloc"] if "PDFARRANGER_COVERAGE" in os.environ: cmd = cmd + ["-m", "coverage", "run", "--concurrency=thread,multiprocessing", "-a"] self.process = subprocess.Popen(cmd + ["-m", "pdfarranger"] + args) def kill(self): self.process.kill() self.process.wait() class PdfArrangerTest(unittest.TestCase): LAST=False def _start(self, args=None): from dogtail.config import config config.searchBackoffDuration = 1 self.__class__.pdfarranger = PdfArrangerManager(args) # check that process is actually running self.assertIsNone(self._process().poll()) self._app() # Now let's go faster config.searchBackoffDuration = 0.1 def _app(self): """Return the first instance of pdfarranger""" self._wait_cond(lambda: len(self._apps()) > 0) a = self._apps()[0] self.assertFalse(a.dead) return a def _apps(self): """Return all instances of pdfarranger""" # Cannot import at top level because of DBUS_SESSION_BUS_ADDRESS from dogtail.tree import root return [ a for a in root.applications() if a.name in ["__main__.py", "pdfarranger", "com.github.jeromerobert.pdfarranger"] ] def _mainmenu(self, action): mainmenu = self._app().child(roleName="toggle button", name="Menu") self._wait_cond(lambda: mainmenu.sensitive) mainmenu.click() if not isinstance(action, str): for submenu in action[:-1]: mainmenu.menu(submenu).point() action = action[-1] mainmenu.menuItem(action).click() def _wait_cond(self, cond): c = 0 while not cond(): time.sleep(0.1) self.assertLess(c, 30) c += 1 def _find_by_role(self, role, node=None, show_only=False): if node is None: node = self._app() from dogtail import predicate return node.findChildren( predicate.GenericPredicate(roleName=role), showingOnly=show_only ) def _is_saving(self): allstatusbar = self._find_by_role("status bar") statusbar = allstatusbar[0] return statusbar.name.startswith("Saving") def _wait_saving(self): # When saving the main window is made unresponsive. When saving end # it's made responsive again. We must be sure that it's responsive # before continuing test else clicks may fail. self._wait_cond(lambda: not self._is_saving()) def _status_text(self): self._app() allstatusbar = self._find_by_role("status bar") # If we have multiple status bar, consider the last one as the one who display the selection statusbar = allstatusbar[-1] return statusbar.name def _assert_selected(self, selection): self.assertTrue(self._status_text().startswith("Selected pages: " + selection)) def _assert_page_size(self, width, height, pageid=None): if pageid is not None: self._icons()[pageid].click() self._wait_cond(lambda: self._status_text().startswith(f"Selected pages: {pageid+1}")) label = " {:.1f}mm \u00D7 {:.1f}mm".format(width, height) self.assertTrue(self._status_text().endswith("Page Size:" + label)) def _check_file_content(self, filename, expected: Tuple[str]) -> Tuple[bool, str]: """ Check expected is contained in file. """ with open(filename, 'rb') as f: actual = f.readlines() n = 0 for line in expected: try: while not actual[n].startswith(line): n += 1 n += 1 except IndexError: # pragma: no cover # Only get executed for failing test return False, line return True, '' def _assert_page_content(self, filename: str, expected: Tuple[str]): """ Check if a file in the current tmp folder contains expected content. """ temp = os.path.join(self.__class__.tmp, 'temp.pdf') with pikepdf.Pdf.open(os.path.join(self.__class__.tmp, filename)) as pdf: pdf.save(temp, qdf=True, static_id=True, compress_streams=False, stream_decode_level=pikepdf.StreamDecodeLevel.all) ok, content = self._check_file_content(temp, expected) self.assertTrue(ok, f'expectent content {content} missing in {filename}') def _assert_file_size(self, filename, size, tolerance=0.03): """ Check if a file in the current tmp folder have the expected size at a given tolerance. """ s = os.stat(os.path.join(self.__class__.tmp, filename)) msg = "{} is {}b but is expected to be {} \u00B1 {}".format( filename, s.st_size, size, size * tolerance ) self.assertLess(abs(s.st_size - size) / size, tolerance, msg=msg) def _icons(self): """Return the list of page icons""" viewport = self._app().child(roleName="layered pane") return self._find_by_role("icon", viewport) def _popupmenu(self, page, action): """Run an action on a give page using the popup menu""" if page is None: self._app().keyCombo("F10") else: self._icons()[page].click(button=3) popupmenu = self._app().child(roleName="window") if not isinstance(action, str): for submenu in action[:-1]: popupmenu.menu(submenu).point() action = action[-1] button = popupmenu.menuItem(action) self._wait_cond(lambda: button.sensitive) button.click() def _process(self): return self.__class__.pdfarranger.process def _import_file(self, filename, open_action=False): """Try to import a file with a file chooser and return that file chooser object""" self._mainmenu("Open" if open_action else "Import") filechooser = self._app().child(roleName='file chooser') treeview = filechooser.child(roleName="table", name="Files") treeview.keyCombo("L") treeview.typeText(os.path.abspath(filename)) ob = filechooser.button("Open") self._wait_cond(lambda: ob.sensitive) ob.click() return filechooser def _save_as_chooser(self, filebasename, expected=None): """ Fill and validate a Save As file chooser. The file chooser is supposed to be already open. """ if expected is None: expected = [filebasename] filechooser = self._app().child(roleName="file chooser") tmp = self.__class__.tmp filename = os.path.join(tmp, filebasename) filechooser.child(roleName="text").text = filename saveb = filechooser.button("Save") self._wait_cond(lambda: saveb.sensitive) filechooser.button("Save").click() # Check files have been created for e in expected: self._wait_cond(lambda: os.path.isfile(os.path.join(tmp, e))) self._wait_cond(lambda: filechooser.dead) self._wait_saving() def _scale_selected(self, scale): app = self._app() app.keyCombo("S") dialog = app.child(roleName="dialog") from dogtail import rawinput rawinput.keyCombo("Tab") rawinput.typeText(str(scale)) dialog.child(name="OK").click() self._wait_cond(lambda: dialog.dead) @staticmethod def _zoom(widget, n_events, zoom_in): """Zoom in/out with ctrl + mouse scroll wheel""" from dogtail import rawinput from pyatspi import Registry as registry from pyatspi import KEY_PRESS, KEY_RELEASE code = rawinput.keyNameToKeyCode("Control_L") registry.generateKeyboardEvent(code, None, KEY_PRESS) button = 4 if zoom_in == True else 5 for __ in range(n_events): widget.click(button=button) time.sleep(0.1) registry.generateKeyboardEvent(code, None, KEY_RELEASE) def _quit(self): self._app().child(roleName="layered pane").keyCombo("q") def _quit_without_saving(self): self._quit() dialog = self._app().child(roleName="alert") dialog.child(name="Don’t Save").click() # check that process actually exit self._process().wait(timeout=22) @classmethod def setUpClass(cls): cls.pdfarranger = None cls.tmp = tempfile.mkdtemp() def setUp(self): group("Running " + self.id()) def tearDown(self): endgroup() @classmethod def tearDownClass(cls): if cls.pdfarranger: cls.pdfarranger.kill() if cls.tmp: shutil.rmtree(cls.tmp) if cls.LAST: dogtail_manager.kill() class TestBatch1(PdfArrangerTest): def test_01_import_img(self): self._start(["data/screenshot.png"]) # Handle the "content loss warning" dialog self._wait_cond(lambda: len(self._find_by_role("dialog")) > 0) dialog = self._find_by_role("dialog")[-1] self._wait_cond(lambda: len(self._find_by_role("check box", dialog)) > 0) check_box = self._find_by_role("check box", dialog)[-1] check_box.click() # Don't show this dialog again button = self._find_by_role("push button", dialog)[-1] button.click() self._wait_cond(lambda: dialog.dead) def test_02_properties(self): self._mainmenu("Edit Properties") dialog = self._app().child(roleName="dialog") creatorlab = dialog.child(roleName="table cell", name="Creator") creatorid = creatorlab.parent.children.index(creatorlab) + 1 creatorval = creatorlab.parent.children[creatorid] creatorval.keyCombo("enter") from dogtail import rawinput rawinput.typeText('["Frodo", "Sam"]') dialog.child(name="OK").click() self._mainmenu("Edit Properties") dialog = self._app().child(roleName="dialog") rawinput.keyCombo("enter") rawinput.typeText('Memories') rawinput.keyCombo("enter") # FIXME: depending on where the test is ran the previous enter close # the dialog or do not close it. try: dialog.child(name="OK").click() except Exception: print("'Edit Properties dialog' closed by 'enter'.") self._wait_cond(lambda: dialog.dead) def test_03_zoom(self): app = self._app() zoomoutb = app.child(roleName="push button", description="Zoom Out") zoominb = app.child(roleName="push button", description="Zoom In") # maximum dezoom whatever the initial zoom level for _ in range(10): zoomoutb.click() for _ in range(3): zoominb.click() def test_04_rotate_undo(self): app = self._app() self._assert_selected("") app.keyCombo("a") # select all self._assert_selected("1") app.keyCombo("Left") # rotate left app.keyCombo("z") # undo app.keyCombo("y") # redo app.keyCombo("a") app.keyCombo("Right") # rotate right app.keyCombo("Right") # rotate right def test_05_duplicate(self): self._popupmenu(0, "Duplicate") app = self._app() self.assertEqual(len(self._icons()), 2) self._app().child(roleName="layered pane").grabFocus() app.keyCombo("a") app.keyCombo("c") for __ in range(3): app.keyCombo("v") self.assertEqual(len(self._icons()), 8) app.keyCombo("Right") app.keyCombo("Left") app.keyCombo("Down") self._assert_selected("4") app.keyCombo("Up") self._assert_selected("2") def test_06_crop_margins(self): self._popupmenu(None, ["Select", "Select Odd Pages"]) self._assert_selected("1, 3, 5, 7") self._popupmenu(0, "Crop Margins…") dialog = self._app().child(roleName="dialog") dialog.child(name="Show values").click() time.sleep(0.2) # Avoid 'GTK_IS_RANGE (range)' failed croppanel = dialog.child(name="Crop Margins") cropbuttons = self._find_by_role("spin button", croppanel) for i in range(4): cropbuttons[i].click() cropbuttons[i].text = str((i+1)*4) dialog.child(name="OK").click() # TODO: find the condition which could replace this ugly sleep time.sleep(0.5) self._wait_cond(lambda: dialog.dead) def test_07_split_page(self): lp = self._app().child(roleName="layered pane") lp.grabFocus() lbefore = len(self._icons()) self._popupmenu(0, ["Select", "Select Even Pages"]) self._assert_selected("2, 4, 6, 8") self._mainmenu(["Edit", "Split Pages…"]) dialog = self._app().child(roleName="dialog") dialog.child(name="OK").click() self._wait_cond(lambda: dialog.dead) self.assertEqual(len(self._icons()), lbefore + 4) def test_08_zoom_pages(self): self._app().child(roleName="layered pane").keyCombo("Home") self._assert_selected("1") self._app().keyCombo("f") for __ in range(2): self._app().keyCombo("minus") # Zoom level is now 0 and that's what will be saved to config.ini and # used by next batches def test_09_save_as(self): self._mainmenu("Save") self._save_as_chooser("foobar.pdf") def test_10_reverse(self): self._popupmenu(0, ["Select", "Same Page Format"]) self._assert_selected("1, 4, 7, 10") self._popupmenu(0, ["Select", "All From Same File"]) self._assert_selected("1-12") self._popupmenu(0, "Reverse Order") def test_11_quit(self): self._mainmenu("Quit") dialog = self._app().child(roleName="alert") dialog.child(name="Cancel").click() self._app().keyCombo("s") self._wait_saving() self._quit() # check that process actually exit self._process().wait(timeout=22) class TestBatch2(PdfArrangerTest): def test_01_open_empty(self): self._start() def test_02_import(self): filechooser = self._import_file("tests/test.pdf") self._wait_cond(lambda: filechooser.dead) self.assertEqual(len(self._icons()), 2) def test_03_cropborder(self): self._popupmenu(0, "Crop White Borders") def test_04_past_overlay(self): if not have_pikepdf3(): return app = self._app() app.keyCombo("c") app.keyCombo("Right") app.keyCombo("o") dialog = self._app().child(roleName="dialog") dialog.child(name="Show values").click() time.sleep(0.2) # Avoid 'GTK_IS_RANGE (range)' failed spinbtns = self._find_by_role("spin button", dialog) spinbtns[0].click() spinbtns[0].text = "10" spinbtns[1].click() spinbtns[1].text = "15" dialog.child(name="OK").click() self._wait_cond(lambda: dialog.dead) def test_05_past_underlay(self): """Past a page with overlay under an other page""" if not have_pikepdf3(): return app = self._app() app.keyCombo("c") app.keyCombo("Left") app.keyCombo("u") dialog = self._app().child(roleName="dialog") dialog.child(name="OK").click() self._wait_cond(lambda: dialog.dead) def test_06_export(self): self._mainmenu(["Export", "Export All Pages to Individual Files…"]) self._save_as_chooser( "alltosingle.pdf", ["alltosingle.pdf", "alltosingle-002.pdf"] ) self._assert_file_size("alltosingle.pdf", 1800 if have_pikepdf3() else 1219) self._assert_file_size("alltosingle-002.pdf", 1544 if have_pikepdf3() else 1219) if have_pikepdf3(): self._assert_page_content("alltosingle.pdf", ( b'1 0 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B', b' /BBox [', b' 68\n', b' 179\n', b' 532\n', b' 582\n', b'1 0 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B')) self._assert_page_content("alltosingle.pdf", ( b' /BBox [', b' 0\n', b" 0\n", b' 612\n', b' 792\n', b'0 1 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B')) def test_07_clear(self): self._popupmenu(1, "Delete") self.assertEqual(len(self._icons()), 1) def test_08_about(self): self._mainmenu("About") dialog = self._app().child(roleName="dialog") dialog.child(name="Close").click() self._wait_cond(lambda: dialog.dead) def test_09_quit(self): self._quit_without_saving() class TestBatch3(PdfArrangerTest): """Test encryption""" def test_01_open_encrypted(self): filename = os.path.join(self.__class__.tmp, "other_encrypted.pdf") shutil.copyfile("tests/test_encrypted.pdf", filename) self._start([filename]) dialog = self._app().child(roleName="dialog") passfield = dialog.child(roleName="password text") passfield.text = "foobar" dialog.child(name="OK").click() self._wait_cond(lambda: dialog.dead) def test_02_import_wrong_pass(self): filechooser = self._import_file("tests/test_encrypted.pdf") dialog = self._app().child(roleName="dialog") passfield = dialog.child(roleName="password text") passfield.text = "wrong" dialog.child(name="OK").click() dialog = self._app().child(roleName="dialog") dialog.child(name="Cancel").click() self._wait_cond(lambda: dialog.dead) self._wait_cond(lambda: filechooser.dead) self.assertEqual(len(self._icons()), 2) def test_03_quit(self): app = self._app() app.keyCombo("z") # undo app.keyCombo("y") # redo self._quit() dialog = self._app().child(roleName="alert") dialog.child(name="Save").click() filechooser = self._app().child(roleName="file chooser") filechooser.button("Save").click() dialog = self._app().child(roleName="alert") dialog.child(name="Replace").click() # check that process actually exit self._process().wait(timeout=22) class TestBatch4(PdfArrangerTest): """Check the size of duplicated and scaled pages""" def test_01_import_pdf(self): self._start(["tests/test.pdf"]) def test_02_duplicate(self): app = self._app() app.keyCombo("Down") self._popupmenu(0, ["Duplicate"]) app.keyCombo("Right") def test_03_scale(self): self._scale_selected(200) self._app().keyCombo("Left") # rotate left self._assert_selected("2") self._assert_page_size(558.8, 431.8) def test_04_export(self): app = self._app() app.keyCombo("a") # select all self._mainmenu(["Export", "Export Selection to a Single File…"]) self._save_as_chooser("scaled.pdf") self._popupmenu(0, "Delete") def test_05_import(self): filename = os.path.join(self.__class__.tmp, "scaled.pdf") filechooser = self._import_file(filename) self._wait_cond(lambda: filechooser.dead) self.assertEqual(len(self._icons()), 3) app = self._app() self._app().child(roleName="layered pane").grabFocus() app.keyCombo("Right") app.keyCombo("Right") self._assert_selected("2") self._assert_page_size(558.8, 431.8) self._quit_without_saving() class TestBatch5(PdfArrangerTest): """Test booklet and blank pages""" def test_01_import_pdf(self): self._start(["tests/test.pdf"]) def test_02_blank_page(self): self._popupmenu(None, ["Select", "Select All"]) self._popupmenu(0, ["Crop White Borders"]) self._scale_selected(150) self._popupmenu(0, ["Insert Blank Page…"]) dialog = self._app().child(roleName="dialog") dialog.child(name="OK").click() self._wait_cond(lambda: len(self._icons()) == 3) def test_03_booklet(self): self._popupmenu(0, ["Select", "Select All"]) self._popupmenu(0, ["Generate Booklet"]) self._wait_cond(lambda: len(self._icons()) == 2) self._app().child(roleName="layered pane").keyCombo("Home") self._assert_page_size(491.1, 213.3) self._app().child(roleName="layered pane").keyCombo("End") self._assert_page_size(491.1, 213.3) def test_04_crop_white_border(self): # Test selection with shift+arrow self._app().child(roleName="layered pane").grabFocus() self._app().child(roleName="layered pane").keyCombo("Left") self._assert_selected("1-2") self._popupmenu(0, ["Crop White Borders"]) self._assert_page_size(245.2, 213.3, 0) self._assert_page_size(245.2, 213.3, 1) def test_05_buggy_exif(self): """Test img2pdf import with buggy EXIF rotation""" if not check_img2pdf([0,4,2]): print("Ignoring test_05_buggy_exif, img2pdf too old") return filechooser = self._import_file("tests/1x1.jpg") self._wait_cond(lambda: filechooser.dead) self.assertEqual(len(self._icons()), 3) def test_06_quit(self): self._quit_without_saving() class TestBatch6(PdfArrangerTest): """Test hide margins and merge pages""" def test_01_import_pdf(self): self._start(["tests/test.pdf"]) def test_02_merge_pages(self): if not have_pikepdf3(): return self._app().keyCombo("a") self._popupmenu(0, "Merge Pages…") dialog = self._app().child(roleName="dialog") dialog.child(name="OK").click() self._wait_cond(lambda: dialog.dead) def test_03_crop_margins(self): self._app().keyCombo("a") self._popupmenu(0, "Crop Margins…") dialog = self._app().child(roleName="dialog") croppanel = dialog.child(name="Crop Margins") cropbuttons = self._find_by_role("spin button", croppanel) dialog.child(name="Show values").click() for i in range(4): cropbuttons[i].typeText("2") dialog.child(name="OK").click() self._wait_cond(lambda: dialog.dead) if have_pikepdf3(): self._assert_page_size(414.5, 268.2) def test_04_hide_margins(self): if not have_pikepdf3(): return self._app().keyCombo("a") self._assert_selected("1") self._app().keyCombo("H") dialog = self._app().child(roleName="dialog") da = dialog.child(roleName="drawing area") page_x = da.position[0] + 25 # 25 = padding in DrawingAreaWidget page_width = da.size[0] - 50 x_center = da.position[0] + da.size[0] / 2 y_center = da.position[1] + da.size[1] / 2 from dogtail import rawinput for button in ["Apply", "Revert", "Apply"]: rawinput.drag((page_x, y_center), (page_x + page_width * 0.8, y_center)) rawinput.drag((page_x + page_width * 0.9, y_center), (page_x + page_width * 0.3, y_center)) dialog.child(name=button).click() hidepanel = dialog.child(name="Hide Margins") hidebuttons = self._find_by_role("spin button", hidepanel) hidebuttons[2].text = str(round(float(hidebuttons[2].text) / 10) * 10) hidebuttons[3].text = str(round(float(hidebuttons[3].text) / 10) * 10) self.assertEqual(hidebuttons[2].text, "60") self.assertEqual(hidebuttons[3].text, "20") self._zoom(da, 15, zoom_in=True) rawinput.drag((x_center, y_center), (x_center + 10, y_center + 20), button=2) # pan view self._zoom(da, 15, zoom_in=False) dialog.child(name="OK").click() self._wait_cond(lambda: dialog.dead) def test_05_export(self): self._popupmenu(0, ["Select", "Select All"]) self._mainmenu(["Export", "Export Selection to a Single File…"]) self._save_as_chooser("hide.pdf") self._assert_file_size("hide.pdf", 1726 if have_pikepdf3() else 1512) def test_06_merge_pages(self): if not have_pikepdf3(): return self._popupmenu(0, ["Select", "Select All"]) self._popupmenu(0, "Merge Pages…") dialog = self._app().child(roleName="dialog") orderpanel = dialog.child(name="Page Order") radiobuttons = self._find_by_role("radio button", orderpanel) radiobuttons[0].click() radiobuttons[2].click() radiobuttons[4].click() dialog.child(name="OK").click() self._wait_cond(lambda: dialog.dead) self._assert_page_size(829.1, 268.2) def test_07_quit(self): if have_pikepdf3(): self._quit_without_saving() else: self._quit() class TestBatch7(PdfArrangerTest): """Test extracting of images and text""" def test_01_import_pdf(self): self._start(["tests/test_raster_image_text.pdf"]) def test_02_explode_images(self): self._popupmenu(1, ["Select", "Select All"]) all_selected = all([icon.selected for icon in self._icons()]) self._wait_cond(lambda: all_selected) self._popupmenu(1, ["Extract", "Explode into Images"]) self._wait_cond(lambda: len(self._icons()) == 5) def test_03_copy_and_paste_image(self): """Copy image from page which has one image""" self._icons()[0].click(button=1) self._popupmenu(0, ["Extract", "Copy Image"]) self._app().keyCombo("v") self._wait_cond(lambda: len(self._icons()) == 6) def test_04_copy_and_paste_image(self): """Try to copy image from page which has two images""" self._popupmenu(2, ["Extract", "Copy Image"]) filler = self._find_by_role("filler")[-1] filler.child(name="OK").click() self._wait_cond(lambda: filler.dead) self._popupmenu(1, ["Paste After"]) self._wait_cond(lambda: len(self._icons()) == 7) def test_05_copy_text(self): """Copy text "tests/test_raster_image_text.pdf" from pdf""" self._popupmenu(0, ["Extract", "Copy Text"]) self._app().keyCombo("v") self._wait_cond(lambda: len(self._icons()) == 9) def test_06_quit(self): self._quit_without_saving() class TestBatch8(PdfArrangerTest): """Test Open action""" # Kill X11 after that batch LAST = True def test_01_open_empty(self): self._start() def test_02_open(self): filechooser = self._import_file("tests/test.pdf", open_action=True) self._wait_cond(lambda: filechooser.dead) def test_03_open_again(self): """Create a new pdfarranger instance""" self.assertEqual(len(self._apps()), 1) filechooser = self._import_file("tests/test.pdf", open_action=True) self._wait_cond(lambda: filechooser.dead) self._wait_cond(lambda: len(self._apps()) == 2) def test_04_quit(self): """Quit the second instance""" self._quit() self._wait_cond(lambda: len(self._apps()) == 1) def test_05_quit(self): """Quit the first instance""" self._quit() self._process().wait(timeout=22) pdfarranger-1.11.0/tests/test_core.py000066400000000000000000000167351463504064500176130ustar00rootroot00000000000000import doctest import unittest import pdfarranger.core as core class PTest(unittest.TestCase): """Base class for Page and LayerPage tests""" @staticmethod def _lpage1() -> core.LayerPage: """Sample layer page 1""" return core.LayerPage(2, 4, 'lcopy', 90, 2, core.Sides(0.11, 0.21, 0.31, 0.41), core.Sides(0.12, 0.22, 0.32, 0.42), 'OVERLAY', core.Dims(10.33, 20.33)) @staticmethod def _lpage1_90() -> core.LayerPage: """Sample layer page 1 rotated 90 degrees""" return core.LayerPage(2, 4, 'lcopy', 180, 2, core.Sides(0.41, 0.31, 0.11, 0.21), core.Sides(0.42, 0.32, 0.12, 0.22), 'OVERLAY', core.Dims(10.33, 20.33)) @staticmethod def _lpage1_180() -> core.LayerPage: """Sample layer page 1 rotated 180 degrees""" return core.LayerPage(2, 4, 'lcopy', 270, 2, core.Sides(0.21, 0.11, 0.41, 0.31), core.Sides(0.22, 0.12, 0.42, 0.32), 'OVERLAY', core.Dims(10.33, 20.33)) @staticmethod def _lpage1_270() -> core.LayerPage: """Sample layer page 1 rotated 180 degrees""" return core.LayerPage(2, 4, 'lcopy', 0, 2, core.Sides(0.31, 0.41, 0.21, 0.11), core.Sides(0.32, 0.42, 0.22, 0.12), 'OVERLAY', core.Dims(10.33, 20.33)) def _page1(self) -> core.Page: """Sample page 1""" return core.Page(1, 2, 0.55, 'copy', 0, 2, core.Sides(0.1, 0.2, 0.3, 0.4), core.Sides(0.11, 0.21, 0.31, 0.41), core.Dims(100.33, 200.66), 'base', [self._lpage1()]) def _page1_90(self) -> core.Page: """Sample page 1 rotated 90 degrees""" return core.Page(1, 2, 0.55, 'copy', 90, 2, core.Sides(0.4, 0.3, 0.1, 0.2), core.Sides(0.41, 0.31, 0.11, 0.21), core.Dims(100.33, 200.66), 'base', [self._lpage1_90()]) def _page1_180(self) -> core.Page: """Sample page 1 rotated 90 degrees""" return core.Page(1, 2, 0.55, 'copy', 180, 2, core.Sides(0.2, 0.1, 0.4, 0.3), core.Sides(0.21, 0.11, 0.41, 0.31), core.Dims(100.33, 200.66), 'base', [self._lpage1_180()]) def _page1_270(self) -> core.Page: """Sample page 1 rotated 90 degrees""" return core.Page(1, 2, 0.55, 'copy', 270, 2, core.Sides(0.3, 0.4, 0.2, 0.1), core.Sides(0.31, 0.41, 0.21, 0.11), core.Dims(100.33, 200.66), 'base', [self._lpage1_270()]) class BasePageTest(PTest): def test01(self): """Test width | height | size_in_points""" self.assertAlmostEquals(self._page1().size_in_points()[0], 140.462) self.assertAlmostEquals(self._page1().width_in_points(), 140.462) self.assertAlmostEquals(self._page1().size_in_points()[1], 120.396) self.assertAlmostEquals(self._page1().height_in_points(), 120.396) self.assertAlmostEquals(self._page1_90().size_in_points()[0], 120.396) self.assertAlmostEquals(self._page1_90().width_in_points(), 120.396) self.assertAlmostEquals(self._page1_90().size_in_points()[1], 140.462) self.assertAlmostEquals(self._page1_90().height_in_points(), 140.462) def test02(self): """Test rotate_times""" # Remember - counter-clockwise ! self.assertEqual(core.Page.rotate_times(0), 0) self.assertEqual(core.Page.rotate_times(90), 3) self.assertEqual(core.Page.rotate_times(134), 3) self.assertEqual(core.Page.rotate_times(-270), 3) self.assertEqual(core.Page.rotate_times(3690), 3) class PageTest(PTest): def _rotate(self, angle: int) -> core.Page: """Return sample page 1 rotated by angle""" p = self._page1() p.rotate(angle) return p def test01(self): """Test rotate""" self.assertEqual(repr(self._rotate(0)), repr(self._page1())) self.assertEqual(repr(self._rotate(3600)), repr(self._page1())) self.assertEqual(repr(self._rotate(-7200)), repr(self._page1())) self.assertEqual(repr(self._rotate(90)), repr(self._page1_90())) self.assertEqual(repr(self._rotate(-270)), repr(self._page1_90())) self.assertEqual(repr(self._rotate(180)), repr(self._page1_180())) self.assertEqual(repr(self._rotate(270)), repr(self._page1_270())) self.assertEqual(self._rotate(0).size, core.Dims(100.33, 200.66)) self.assertEqual(self._rotate(90).size, core.Dims(200.66, 100.33)) self.assertEqual(self._rotate(180).size, core.Dims(100.33, 200.66)) self.assertEqual(self._rotate(270).size, core.Dims(200.66, 100.33)) def test02(self): """Test duplicate""" p = self._page1() d = p.duplicate() self.assertEqual(repr(p), repr(d)) p.rotate(90) self.assertEqual(repr(d), repr(self._page1())) self.assertNotEquals(repr(p), repr(self._page1())) def test03(self): """Test serialize""" self.assertEqual(self._page1().serialize(), 'copy\n2\nbase\n0\n2\n0.1\n0.2\n0.3\n0.4\n0.11\n0.21\n0.31\n0.41\n' 'lcopy\n4\n90\n2\nOVERLAY\n0.11\n0.21\n0.31\n0.41\n0.12\n0.22\n0.32\n0.42') def test04(self): """Test width | height | size_in_pixel""" self.assertEqual(self._page1().size_in_pixel()[0], 77) self.assertEqual(self._page1().width_in_pixel(), 77) self.assertEqual(self._page1().size_in_pixel()[1], 66) self.assertEqual(self._page1().height_in_pixel(), 66) self.assertEqual(self._page1_90().size_in_pixel()[0], 66) self.assertEqual(self._page1_90().width_in_pixel(), 66) self.assertEqual(self._page1_90().size_in_pixel()[1], 77) self.assertEqual(self._page1_90().height_in_pixel(), 77) self.assertTrue(isinstance(self._page1().height_in_pixel(), int), 'height_in_pixel not an int') self.assertTrue(isinstance(self._page1().width_in_pixel(), int), 'width_in_pixel not an int') class LayerPageTest(PTest): def _rotate(self, angle: int) -> core.LayerPage: """Return sample layer page 1 rotated by angle""" p = self._lpage1() p.rotate(angle) return p def test01(self): """Test rotate""" self.assertEqual(repr(self._rotate(0)), repr(self._lpage1())) self.assertEqual(repr(self._rotate(-40)), repr(self._lpage1())) self.assertEqual(repr(self._rotate(80)), repr(self._lpage1())) self.assertEqual(repr(self._rotate(-1)), repr(self._lpage1_90())) self.assertEqual(repr(self._rotate(3)), repr(self._lpage1_90())) self.assertEqual(repr(self._rotate(-2)), repr(self._lpage1_180())) self.assertEqual(repr(self._rotate(-3)), repr(self._lpage1_270())) self.assertEqual(self._rotate(0).size, core.Dims(20.33, 10.33)) self.assertEqual(self._rotate(-1).size, core.Dims(10.33, 20.33)) self.assertEqual(self._rotate(-2).size, core.Dims(20.33, 10.33)) self.assertEqual(self._rotate(-3).size, core.Dims(10.33, 20.33)) def test02(self): """Test duplicate""" p = self._lpage1() d = p.duplicate() self.assertEqual(repr(p), repr(d)) p.rotate(90) self.assertEqual(repr(d), repr(self._lpage1())) self.assertNotEquals(repr(p), repr(self._lpage1())) def test03(self): """Test serialize""" self.assertEqual(self._lpage1().serialize(), 'lcopy\n4\n90\n2\nOVERLAY\n0.11\n0.21\n0.31\n0.41\n0.12\n0.22\n0.32\n0.42') def load_tests(loader, tests, ignore): tests.addTests(doctest.DocTestSuite(core)) return tests pdfarranger-1.11.0/tests/test_encrypted.pdf000066400000000000000000000026061463504064500207710ustar00rootroot00000000000000%PDF-1.7 % 1 0 obj << /Extensions << /ADBE << /BaseVersion /1.7 /ExtensionLevel 8 >> >> /Pages 2 0 R /Type /Catalog >> endobj 2 0 obj << /Count 2 /Kids [ 3 0 R 4 0 R ] /Type /Pages >> endobj 3 0 obj << /Contents 5 0 R /Type /Page >> endobj 4 0 obj << /Contents 6 0 R /Type /Page >> endobj 5 0 obj << /Length 64 /Filter /FlateDecode >> stream 豛6XhGUo"q@W9Mƺ_ 6g:W/Vކ!5>%R܌endstream endobj 6 0 obj << /Length 64 /Filter /FlateDecode >> stream w֫CmxcX Z#>BE(Wcjs0mڲKendstream endobj 7 0 obj << /CF << /StdCF << /AuthEvent /DocOpen /CFM /AESV3 /Length 32 >> >> /Filter /Standard /Length 256 /O /OE <95b96b443d5904d8f8535c7acadf0f563888bd8adcb29f5643ceb78b55869b96> /P -4 /Perms <606cd50283a513d2eb3361835f9654c3> /R 6 /StmF /StdCF /StrF /StdCF /U <9cbd901891869871f3886351b409eedb35a116e3ac1f5cb4753be9eee48046d6e13c499f08e5e3cfc6912c870a573467> /UE <17c74e54ab1cf4eb4f4d41f1e6aa4bb4ccdabcfa32a585e3fe1d20fdaf5cb13b> /V 5 >> endobj xref 0 8 0000000000 65535 f 0000000015 00000 n 0000000130 00000 n 0000000195 00000 n 0000000244 00000 n 0000000293 00000 n 0000000427 00000 n 0000000561 00000 n trailer << /Root 1 0 R /ID [<5c10f271db390a18d2d37ba4379bb02f><5c10f271db390a18d2d37ba4379bb02f>] /Encrypt 7 0 R >> startxref 1108 %%EOF pdfarranger-1.11.0/tests/test_exporter.py000066400000000000000000000170671463504064500205320ustar00rootroot00000000000000from dataclasses import dataclass, field import os import packaging.version as version from typing import Any, List, Tuple import unittest import pikepdf from pdfarranger.exporter import export from pdfarranger.core import Dims, Sides # The test files used for the tests in this file are in QDF format (see # https://qpdf.readthedocs.io/en/stable/qdf.html). They can be inspected with a simple text editor or compared with # standard tools such as 'Meld' def file(name): """Expand name to full filename""" return f'./tests/exporter/{name}.pdf' @dataclass class Page: """Mock Page class""" npage: int nfile: int = 1 copyname: str = file('basic') angle: int = 0 scale: float = 1.0 crop: Sides = Sides() size_orig: Dims = Dims(612, 792) layerpages: List[Any] = field(default_factory=list) @dataclass class LayerPage: """Mock LayerPage class""" npage: int nfile: int = 1 copyname: str = file('basic') angle: int = 0 scale: float = 1.0 crop: Sides = Sides() offset: Sides = Sides() laypos: str = 'OVERLAY' size_orig: Dims = Dims(612, 792) layerpages: List[Any] = field(default_factory=list) class ExporterTest(unittest.TestCase): def compare_files(self, actual_file: str, expected_file: str) -> Tuple[bool, str]: """ Compare two PDF files The following are ignored in the comparison: - blank lines - lines starting or ending with '%' - lines containing the name /Length - anything following the first '/' in line containing a Do operator - anything following the xref entry """ with open(actual_file, 'rb') as f: actual = f.readlines() with open(expected_file, 'rb') as f: expected = f.readlines() actual_no = 0 last_match = -1 for line_no, line in enumerate(expected): if len(line) == 0 or line.isspace() or line.startswith(b'%') or line.endswith(b'%\n') or b'/Length' in line: pass elif line.startswith(b'xref'): return True, '' else: if b' Do ' in line or b' Do\n' in line: line = line[:line.find(b'/')] try: while not actual[actual_no].startswith(line): actual_no += 1 last_match = actual_no actual_no += 1 except IndexError: # pragma: no cover # Only get executed for failing test print(line_no, line, last_match) return (False, f'Failed to match line {line_no + 1} in expected file {expected_file} : {line} \n' f'Last match in line {last_match + 1} of {actual_file}') return True, '' def case(self, test, files, *pages): """Run a single test case.""" if version.parse(pikepdf.__version__) < version.Version('8.0.0'): expected_file = file(f'test{test}_out') else: expected_file = file(f'test{test}_8_out') if not os.path.exists(expected_file): expected_file = file(f'test{test}_out') export(files, pages, [], [file('out')], None, None, True) self.assertTrue(*self.compare_files(file('out'), expected_file)) def basic(self, test, *pages): """Test with basic.pdf as single input file.""" self.case(test, [(file('basic'), '')], *pages) def outlines(self, test, *pages, ignore_8=None): """Test with outlines.pdf as single input file.""" if version.parse(pikepdf.__version__) >= version.Version('8.0.0'): self.case(test, [(file('outlines'), '')], *pages) def test01(self): """No transformations""" self.basic(1, Page(1), Page(2)) def test02(self): """Rotate pages""" self.basic(2, Page(1, angle=90), Page(2, angle=180)) def test03(self): """Rotate pages with existing /Rotate""" self.basic(3, Page(3, angle=90), Page(3, angle=180)) def test04(self): """Scale page""" self.basic(4, Page(1, scale=0.25)) def test05(self): """Crop page""" self.basic(5, Page(1, crop=Sides(0.1, 0.2, 0.3, 0.4))) def test06(self): """Rotate and crop page""" self.basic(6, Page(1, angle=90, crop=Sides(0.1, 0.2, 0.3, 0.4)), Page(1, angle=180, crop=Sides(0.1, 0.2, 0.3, 0.4)), Page(1, angle=270, crop=Sides(0.1, 0.2, 0.3, 0.4))) def test07(self): """Overlay page""" self.basic(7, Page(1, layerpages=[LayerPage(6)])) def test08(self): """Underlay page""" self.basic(8, Page(1, layerpages=[LayerPage(7, laypos='UNDERLAY')])) def test09(self): """Rotate overlay""" self.basic(9, Page(1, layerpages=[LayerPage(6, angle=90)]), Page(1, layerpages=[LayerPage(6, angle=180)])) def test095(self): """Overlay page with itself - MediaBox with non-integer values""" self.case(95, [(file('overlay'), '')], Page(1, layerpages=[LayerPage(1)])) def test096(self): """Overlay page with itself - MediaBox with non-standard corners""" self.case(96, [(file('overlay'), '')], Page(2, layerpages=[LayerPage(2)])) def test10(self): """Offset overlay horizontal""" self.basic(10, Page(1, layerpages=[LayerPage(6, offset=Sides(.5, 0, 0, 0)), LayerPage(6, offset=Sides(0, 0.5, 0, 0))])) def test11(self): """Offset overlay vertical""" self.basic(11, Page(1, layerpages=[LayerPage(6, offset=Sides(0, 0, 0.5, 0)), LayerPage(6, offset=Sides(0, 0, 0, 0.5))])) def test12(self): """Duplicate page with annotations""" self.basic(12, Page(5), Page(5)) def test13(self): """Rotate page with annotations""" self.basic(13, Page(5, angle=90), Page(5, angle=180)) def test14(self): """Scale page with annotations""" self.basic(14, Page(5, scale=0.25)) def test15(self): """Crop page with annotations""" self.basic(15, Page(5, crop=Sides(0.05, 0.075, 0.2, 0.3))) def test16(self): """Overlay page with annotations""" self.basic(16, Page(1, layerpages=[LayerPage(5)])) def test17(self): """File with missing MediaBox""" self.case(17, [('./tests/test.pdf', '')], Page(1), Page(2)) def test18(self): """Encrypted file""" self.case(18, [('./tests/test_encrypted.pdf', 'foobar')], Page(1), Page(2)) def test19(self): """Copy file with outlines""" self.outlines(19, Page(1), Page(2), Page(3), Page(4)) def test20(self): """Reorder pages in file with outlines""" self.outlines(20, Page(4), Page(2), Page(1), Page(3)) def test21(self): """Duplicate pages in file with outlines""" self.outlines(21, Page(4), Page(2), Page(3), Page(4)) def test22(self): """Rotate pages in file with outlines""" self.outlines(22, Page(1), Page(2, angle=90), Page(3, angle=180), Page(4, angle=270)) def test23(self): """Scale pages in file with outlines""" self.outlines(23, Page(1), Page(2, scale=0.5), Page(3), Page(4)) def test24(self): """Import page with interactive form elements""" self.case(24, [(file('basic'), ''), (file('forms'), '')], Page(1), Page(1, nfile=2)) def test25(self): """Duplicate page with interactive form elements""" self.case(25, [(file('forms'), '')], Page(1), Page(1)) pdfarranger-1.11.0/tests/test_raster_image_text.pdf000066400000000000000000000510711463504064500225020ustar00rootroot00000000000000%PDF-1.3 % 1 0 obj << /Metadata 3 0 R /Pages 4 0 R /Type /Catalog >> endobj 2 0 obj << /Author () /Creator () /Keywords () /Producer () /Subject () /Title () >> endobj 3 0 obj << /Subtype /XML /Type /Metadata /Length 1218 >> stream endstream endobj 4 0 obj << /Count 2 /Kids [ 5 0 R 6 0 R ] /Type /Pages >> endobj 5 0 obj << /Contents 7 0 R /Group << /CS /DeviceRGB /I true /S /Transparency /Type /Group >> /MediaBox [ 0 0 613 793 ] /Parent 4 0 R /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Font << /f-0-0 8 0 R >> /XObject << /x6 9 0 R >> >> /Type /Page >> endobj 6 0 obj << /Contents 10 0 R /Group << /CS /DeviceRGB /I true /S /Transparency /Type /Group >> /MediaBox [ 0 0 613 793 ] /Parent 4 0 R /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /XObject << /p8TTjCdSK2bK6pPpNFN5NA 11 0 R /x18 12 0 R >> >> /Type /Page >> endobj 7 0 obj << /Filter /FlateDecode /Length 169 >> stream x-0 Dwō04HV)BUiPm>wÝ}[H Tc$m2dvqJ6S .[F?|[Tt3iH+^F v*0+o4P .yra3sSs>6)ůIntL1 endstream endobj 8 0 obj << /BaseFont /VMDWQT+#c3#90#df#8d#e3#99#96 /Encoding /WinAnsiEncoding /FirstChar 32 /FontDescriptor 13 0 R /LastChar 120 /Subtype /TrueType /ToUnicode 14 0 R /Type /Font /Widths [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 317.871094 336.914062 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 612.792969 0 0 634.765625 615.234375 352.050781 634.765625 0 277.832031 0 0 0 974.121094 0 0 634.765625 0 411.132812 520.996094 392.089844 0 0 0 591.796875 ] >> endobj 9 0 obj << /BBox [ 0 0 613 793 ] /Filter /FlateDecode /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> /gs0 << /BM /Normal /CA 1.0 /SMask /None /ca 1.0 >> >> /XObject << /x11 15 0 R >> >> /Subtype /Form /Type /XObject /Length 70 >> stream x+O/6PH/ T(22630W06P04322W044W(JUW*OUЯ04Tp B endstream endobj 10 0 obj << /Filter /FlateDecode /Length 133 >> stream xE 1D|{y,}!jo203EL*jDQ,^K$A3{yM6u:n ot X?8bqXG0EM& Vt[w9mR $ endstream endobj 11 0 obj << /BBox [ 0 0 138 117 ] /Filter /FlateDecode /Matrix [ -1 0 0 -1 138 117 ] /Resources << /XObject << /Im0 16 0 R >> >> /Subtype /Form /Type /XObject /Length 37 >> stream x+243444rP\.}\|@  endstream endobj 12 0 obj << /BBox [ 0 0 613 793 ] /Filter /FlateDecode /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> /gs0 << /BM /Normal /CA 1.0 /SMask /None /ca 1.0 >> >> /XObject << /x22 17 0 R >> >> /Subtype /Form /Type /XObject /Length 101 >> stream x-;0 C!eL!&@SzB~֋b1' %;fCs }dVʪH.6aO=͌h endstream endobj 13 0 obj << /Ascent 928 /CapHeight 1232 /Descent -235 /Flags 32 /FontBBox [ -1020 -462 1793 1232 ] /FontFamily /FontFile2 18 0 R /FontName /VMDWQT+#c3#90#df#8d#e3#99#96 /ItalicAngle 0 /StemH 80 /StemV 80 /Type /FontDescriptor >> endobj 14 0 obj << /Filter /FlateDecode /Length 295 >> stream x]n <ݡ IP-$`: By:iŹ PE@bp ~ݓZ&|`Py s?8 YׁB˽u,*MQ9*KjI. W7J w Z/V$=cL<&:s4 !r3GDM\'n+ʩ$mD|JU▸M#i>R}L~N~&7SsWҔ>*_# endstream endobj 15 0 obj << /BBox [ 0 0 613 793 ] /Filter /FlateDecode /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> /gs0 << /BM /Normal /CA 1.0 /SMask /None /ca 1.0 >> >> /XObject << /x14 19 0 R >> >> /Subtype /Form /Type /XObject /Length 101 >> stream x- 0 {O qMT!*@ ]B~֋NL!b`1Yq.So̩cJS* F~z7' G endstream endobj 16 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceRGB /DecodeParms << /BitsPerComponent 8 /Colors 3 /Columns 184 /Predictor 15 >> /Filter /FlateDecode /Height 156 /SMask 20 0 R /Subtype /Image /Type /XObject /Width 184 /Length 3906 >> stream xyXGƿ! @<1d55]n *5^C"gă@ ^3 p@Qg{H1Ya=_ UowU e@xҀ$( A!8 !HP~ ˲۶mv!:HP~KVf?zۈP܉h ymvD(bCh:atg;v ێ  Ó}QT0y˽}RQ~!9!!f 7~wֺ5k=RQ~"//oazYk4JLgTaޝ0!wc?¹sl ukv~}mmY6t:WL='+<=s<7B))i))v{ԓpRQQTT% H.СpDWYI Դ*#C Oĭ+JNNđ#u&σR0H] 3f%|@J ` MΚŻ-AYgG8ڶҥKdٳ|1nZQ͜9jmWJ`ԗUeΝNPu*ŲݻsݶP,ˣaajklo#Gn ~ zҖ-6~ MΝQ RSS~d 糗 ھ}.^VYeԩ6)Xn0lar(#l忯c:wWUT*{C@eĘ%) LzBB@RYYY} ϩ- ^^ÇoٷOn@S R)Y6[_SOkkkDh辦?`;WFA>eajVHRm'[l# rʕQQfs; (<ӓL L*JҤI3l6QFhkj6[mPQrsscF,1EEhUUZۋKH4y󰍸ի׿.⺸~}YYv1l'gg /6<Ү())o"O $=zۈH>]b6KsBB.VTH.(I&XH ظfjl#΂:8tPFC IGץ444`> # Z{*K5tS*DރR]]VoǐGOc0qc&1LNw!~5gΜVb?s=, CcEaYvz|"E_ܜce0333Z*͛7yMb2Bv=}JӼc|+(syXX5)| (/AzjJU}PA|)/S˲!|4M/1,t={o:u*X6a?[n\wFQqEa&1.n9E)m0xhL_vڵk#\~Ñ2(---c&"_orӦC~K,N<{,WYPT7ZP<0 'b6)!a&qefYcvn$n999pĦ<Ν99bVp3PTڒ%z222?=Dw5.jPch׸_GʔɓɖX2T'OD JIIIWF=PY {rXK٤-_Ʊl76ge9߄;x`VKÑ >ɠ4HXarR,hP҆-{] J]]]_R&rB F@A?>R?~MLv<n5'Oj9" ߚ׷]vj P}Cߎqle;&OKP>\BB"NT Щ˗9JMMMFS}yDj_8(o7[F6"K>z(gA),, R/sx4$đ<8( 7Uaje˖-Op*@WdK,k;qKAyF~K,w^^dP^Tc Rs0(X6IoR'HC$(/[B endstream endobj 17 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /FlateDecode /Height 156 /Interpolate false /Subtype /Image /Type /XObject /Width 184 /Length 3225 >> stream x흋[uüo."WP J [5[55MM-M3,-oɦɣIyK\Rts%/(7pvq۞%˼wf9 AAA΀l>!w6lv>!_JJJ5mle朙8Z}a#.]xi xn\YY}(Bv |~bw!$VY_ӵ؇"Err2A)/'Z_mAA`2ZV|-$VՓԓM>!bŰ P-'p4ޚ4BbURkP/3D͈^ [w>&IVV/ &@ࣁ؇%ЈBrF>C88p^-!Lf[na[:0e Yf5BTQXXBjCbUKD1qD=*`al׮]' ==]㣁[ }{/A؝PQ5$$Vb_/| kà!ޛž a/FcfdžX1ط!k1$E5RRR/DO~~>aasH*):t`6E؉c534D,}kkbrIΟE } -|˱/GF瞝) U~{b_m۶i;hJ^f䜜+b7BX1ط$leĘkܱcǰ/J4\ȴ[H*Pu q>vzڮ!]ؖ-%BJJ ACrߣ8ݻw/M_=:*7? $"7g{cͬE,'p 8oʕ+W'JYYw70$V 5D]=o6?8$e.Q;\cJ/BM&vZ!k [a=vq>u7қCQQv1cڷNUu79sƜ LcuOFz933$Du5iNȯ-vՙt6>_ޖ߂OJJ. /^|v6 Z>޲ <72`N֓|]B 11=FzO_":zHXb,\ 7DE0222Ktp; Z]-ed߅X(ۻw/v\sY \w#;!m="=r_n'>^1v\oV֦u7{VXB{m A; פz:rj$v\ԣ7!˝9sOAA ioUn}aW?i +_ds]Osi:yyy ؝[Ze?vƮ0QY~ևZv؁]`gĉ|/ѺMG1Oh3(/YҎM\\Nu7{QXB{ b;*eeepc #{gE{~C-Ǐ.q5aJ"Vؓ58,\&`O~]xGѣ,]Ild ̳pMr/pc~z}7,Ho6pWb7Ax5cmacaA5-Kp}>Ԓ r%ahO3rM 6=O6kjfȑj[hG2_̋jenFFqpY& Kh/_PTT$~Mt_>x`ȅiQH]Zj[Off5#5ZulEcWGϱ t|<>RYY>D@pj^L5 c8hah5.\np=UbMj"_NY>dnt={~ݍnv3==in|O(;wԵ9Wx >Z˿h_Fc`hb/ 3s)؝/_nBmʹo&d`UP b܄qLG^*{nkZZ ~HŮYnܞ,nN^zM?fay[|a3_@֦b"S(ڈ3(XwaCou7c  /h޺bq$1̷gJ+Wz Yє7o|tpdu[6p@ir2>rnk? 긖ߜOJJwHN:}_nkN:FYl]:dvzĿ)i'@ﯿs=Bb4lO39s̩% k~ARZ222 I^^[ oGj>dKl~5RLZ}~0(¾); m(.OuXOϠ8$lٲ@nֳ޾}ۖ+,̪$[r2^#wagP˹slp8KLLBAAACW endstream endobj 18 0 obj << /Filter /FlateDecode /Length1 5756 /Length 4075 >> stream xX}\UyafyaxAuPcRЄrQĖ^\P2$ɮf[i)z tѲH݋'Zo7rݖ ؽw?~9y?997@u*_RV}i+iAG\`\ DeK[ @a|`Ss(&)]1FuSqwR9nG6MOj*{*/T]Rx\ZJ>*-e-4_ Tf j䛠4|$CZޱ`>{7=mqG[+eX_fƷTI`-o` 3qM 4-M1[Mm]xBZo Ǔ~u;c%mB&1{lL|%6+c5bmc.loh-❦Y[}$6H ¿t y\6joؙ^ ao`GG>k@Ezz,Va1_w*ҽI9jGuρ#s"x:MMUAUڒd'M,3dfz Q gq% |>i3[&O?9Md:̦wm:hUC_))z' I?7ITFE9(QG-OtQj15D@m^IHk]3wI/;_m6}c ☃@{]GƐ)$$$$.'%i4{rH31*ɕPV&I*J4 Ќa); iI9IHZT!5zҨ UJBm*"ABV@Y5n|fF>;kƅsvɂwҽ6^ =6|NNt_dO](OU-ƗF^CnqȘFZ+j2LCt\doeYKK `>q/IكKrXU }ϥs uv y#`gZώab4ݡKFrC 0ZW[s:?uʬ,cs9CCgjH_{ה{pJVQ&: eW)}c vn[oM@609!wxb7& !,i؛v/!^u`ڽa{wW\[&췠1H#p7W0{#4{T6T:)X j-w5La.S?LUS P5p=~O@Zb^hocr7S9rSUnh nćTͅ˛æYGN=TN\0,͢4`028{=/.]l׾蘡! l+ڑ`j5.-l+k:ORdR-E.A+C4٘Ngɇ9O* r\*/gt y|%'Y>vC~)&g U.uCbcUZP)~Ps= %;] {xto̔* ),e4=0t`*jv|*:VQ4zU/@+ßRʱnhBͽEdtrb2\+T~O<$!*c*34FB::_N4}VQ]fpRh {UdnbIY̅$SU\FA.gV{gw.NMˬvCaq74T8_<ݚv_k,5p}0/wdּ\;J>/7Ц,Y*_Zg^μ(;5}ow"hw5l=pwa [?=K٦⟼­`&Vb,ʣONlC 5Nۨ&I%҇ʹަ7>⛗Ô'<|>9HJ=o1 )V2cC%)dBo'yn n?4&N`?[nxi~CWS?d=sC{/4LdxY%+k-^<\j ;בngц',U4T`=iލk-O^cO \c \-;dm-R`m-";qW |܄pH?.eV !ZTH`r eci?g \ x|y秊Ev|(c|B=L଻|xj)?qg#81W4)OǩG x+͆S&)V<'{pzN`qx3`Yz>ތYzL#f cFLT-cT-dd7]IV$+&&yx[qca4mEWFDpVÈH>è&pTBР0 hVAJ2͵T&FC7 4PoC̨nj*PF`GEA^̥Tdf*>F#{ endstream endobj 19 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /FlateDecode /Height 156 /Interpolate false /Subtype /Image /Type /XObject /Width 184 /Length 3187 >> stream x흋_eǟ.ü3HTȔ5)Ym,Vjdآ*%i-4hR*&Fn$"@83n*{ޙ9xs~|<]AAA*jIIIЧ@-[$vvEEEAK]]]wGp#ςؘ,"ėT BI*-!.!Ʉljj>"8^;v]]N8GRƍЇBEFF/$8dGCF kr9[">"6%$ T!IH477<ݔʓDo͸`3"̏zaN5!XvD )**)$[6Bw4}!a>Ͳw<֭[GFk_;B7J"3s&ٰ~pJ*B\&''TUUd9ޏAώǜYppPH8 t߾}G //Tz!{oW;w@_19mDHgVbZޔ;"Blii)USRz8`@Hγm 5k$B1LVVS^^ޕCwH4_?V }-̚6mTjpj t_C_ 1&ٮ BB/a~&1$z'{ }98ڵLlpׯ_"b(/L _ %b(+-{o֬#;dffB_<߅BD"ѐ|#/b%<Ҥ;t,71qH Gn߾ }icpjpk0Kcct۷TWH8rod|2Ցѥ1CwP#e…SXp6ɲG.pJJJa+D"??F]!y„e Jl ]-?βCfT@y0~`߾_7;8Ο]#1)q7[{#Bq7Nȯ}q y3:Mm#!^,]7.^}o@gwOss3ty:jj{{`0J?KH.BZZڣg fPTWWC{n͙R[QQuv6LJahrB2LAAtq7r$<566BBe̍]Fy^BxxwkP(J7~1t٬o1̐q7{N7xւZ_o֌HFD@Z0.nBNX}Rٳ%|*++w.t;:xĐ!U|fϘWsx f!}Yテ.%}+{mMRAbi;֠1,nZrZ&}d&|BRZ=FM$WjiZya.Q[HgΜ.PVV}/@wn8p tu-W&O^`ѯQeϞ=N:Ʋ4BuqE-j €5(7e׬\ ]i&))\B{ b+ Gȃ13'M/rp-j9y$t͏Wr_D!e /co $; ĉ') ; .yhpk0˗,yy! o !-C\nЩ /@ng7mD>oe.QZ222[!\[cAw ܭ"Ǎ{MjuZܾ!Bȑ#^2Y#t䄋Z{  0,HHHַpk^ ttsBMMM7G,ХvvCG(DGEEXUn<׵#5eq*?n$L&ѯ!n .jijjNp;|E*] 1>Z~R eQTzMeeBqf{66Ϗ 7y="b.;J::8w3˚MH_OOBa#X6O{-Wx2;6J~0oN׬oaü}RC7Ts:[kmlCT̜>=ƜG ǖE-,{lWŸjFffE>˲֭n1ٹs E3ta-<B5Y;l]4<נߖ! dCvZJ/Aӂ <φ25<|Mi!@O=({o773Bjn5(wì]a۶m e~!mǠgUFGL (6v*.̯51LVVtKII ]7+S(80%,4t9À m&x8CWj=BKcc#tB<*G YvYhħJw~Qס`jkk997{Wá`ފ ZLPKQQQR*H4$ @hCh'5ABRϤ$hFZZڣr9uZ29wX ^~f٢Ei!>>> B Éچmm<lN^}m!,{19Sz C. B;:$#\bj J-[IJJJoݘY)<Uսzs7&ϋZn޼U.?}k. ;D̘1ϺWdtSӮ}_$ fd3$H$E J7m2]HvWh&jqU(MJӣ!| [3b5ENVX1Q,-j)((0nHʺdo66#F7'/ORFTE/ ?Fi P>FYԢj4h3APGQI|9ٱcXq*** ICCQ| [Hޜ=ېd$]/j\HJJJ!2LZZ!AAA3?L endstream endobj 20 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceGray /DecodeParms << /BitsPerComponent 8 /Colors 1 /Columns 184 /Predictor 15 >> /Filter /FlateDecode /Height 156 /Subtype /Image /Type /XObject /Width 184 /Length 177 >> stream x 13;xT$ :zU\+׊kŵZqV\+׊kŵZqV\+׊kŵZqV\+׊kŵZqV\+׊kŵZqV\+׊kŵZqV\+׊kŵZqV\+׊kŵZqV\+׊kŵZqV\+׊kŵx,7 endstream endobj xref 0 21 0000000000 65535 f 0000000015 00000 n 0000000080 00000 n 0000000172 00000 n 0000001472 00000 n 0000001537 00000 n 0000001798 00000 n 0000002068 00000 n 0000002309 00000 n 0000002815 00000 n 0000003143 00000 n 0000003349 00000 n 0000003584 00000 n 0000003945 00000 n 0000004200 00000 n 0000004568 00000 n 0000004929 00000 n 0000009096 00000 n 0000012511 00000 n 0000016674 00000 n 0000020051 00000 n trailer << /Info 2 0 R /Root 1 0 R /Size 21 /ID [] >> startxref 20475 %%EOF