From 8ed8e4e931c1cb3d3c814a53a07f73b566c3b719 Mon Sep 17 00:00:00 2001 From: Alexander Marsalek Date: Fri, 2 Jul 2021 14:06:44 +0200 Subject: v4.2.0 --- .gitignore | 4 +- README.md | 8 + build.gradle | 51 +- doc/AnbindungExterneWebanwendung.docx | Bin 467163 -> 470686 bytes doc/AnbindungExterneWebanwendung.pdf | Bin 404599 -> 614939 bytes doc/PDFAS4_Dokumentation.docx | Bin 124774 -> 133651 bytes doc/PDFAS4_Dokumentation.pdf | Bin 550516 -> 423016 bytes doc/PDFAS4_Profile_Dokumentation.docx | Bin 162943 -> 169770 bytes doc/PDFAS4_Profile_Dokumentation.pdf | Bin 145680 -> 359603 bytes doc/PDFAS4_WebDokumentation.docx | Bin 173590 -> 183745 bytes doc/PDFAS4_WebDokumentation.pdf | Bin 340950 -> 296122 bytes gradle/wrapper/gradle-wrapper.jar | Bin 55627 -> 56177 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- pdf-as-cli/build.gradle | 74 +- .../src/main/java/at/gv/egiz/pdfas/cli/Main.java | 26 + .../cli/test/SignatureBlockParameterTest.java | 292 + .../pdfas-config/cfg/advancedconfig.properties | 107 + .../resources/pdfas-config/cfg/config.properties | 108 + .../resources/pdfas-config/cfg/log4j.properties | 23 + .../test/resources/pdfas-config/cfg/logback.xml | 16 + .../test/resources/pdfas-config/cfg/profiles.zip | Bin 0 -> 21146 bytes .../pdfas-config/cfg/profiles/BASE_LOGO.properties | 28 + .../cfg/profiles/BASE_NORMAL.properties | 145 + .../cfg/profiles/BASE_NORMAL_NOTE.properties | 10 + .../cfg/profiles/SIGNATURBLOCK_DE.properties | 8 + .../cfg/profiles/SIGNATURBLOCK_DE_NOTE.properties | 9 + .../SIGNATURBLOCK_DE_NOTE_DYNAMIC.properties | 16 + ...OTE_DYNAMIC_WITH_TEXT_AFTER_VARIABLE.properties | 16 + .../fonts/DejaVuSansCondensed-Bold.ttf | Bin 0 -> 522704 bytes .../pdfas-config/fonts/DejaVuSansCondensed.ttf | Bin 0 -> 533412 bytes .../pdfas-config/fonts/DejaVuSansMono.ttf | Bin 0 -> 317336 bytes .../test/resources/pdfas-config/fonts/arial.ttf | Bin 0 -> 296712 bytes .../resources/pdfas-config/images/Baik_Archiv.gif | Bin 0 -> 19334 bytes .../resources/pdfas-config/images/Baik_Urkunde.gif | Bin 0 -> 13914 bytes .../pdfas-config/images/amtsignatur-logo_demo.png | Bin 0 -> 60943 bytes .../pdfas-config/images/justizsignatur_neu.gif | Bin 0 -> 14049 bytes .../resources/pdfas-config/images/seal-logo_de.png | Bin 0 -> 24951 bytes .../resources/pdfas-config/images/seal-logo_en.png | Bin 0 -> 23216 bytes .../pdfas-config/images/signatur-logo_de.png | Bin 0 -> 22372 bytes .../images/signatur-logo_de_highest_resolution.png | Bin 0 -> 37120 bytes .../pdfas-config/images/signatur-logo_en.png | Bin 0 -> 22233 bytes .../images/signatur-logo_en_highest_resolution.png | Bin 0 -> 36360 bytes .../pdfas-config/licenses/adobe/AFM_License.html | 1 + .../resources/pdfas-config/licenses/ant/LICENSE | 203 + .../pdfas-config/licenses/ant/LICENSE.dom | 71 + .../pdfas-config/licenses/ant/LICENSE.sax | 20 + .../pdfas-config/licenses/ant/LICENSE.xerces | 56 + .../resources/pdfas-config/licenses/apache/LICENSE | 202 + .../pdfas-config/licenses/checkstyle/LICENSE | 504 ++ .../licenses/checkstyle/LICENSE.apache | 60 + .../pdfas-config/licenses/dejavu-font/LICENSE | 99 + .../pdfas-config/licenses/fonts/BitStream.txt | 17 + .../resources/pdfas-config/licenses/ikvm/LICENSE | 34 + .../pdfas-config/licenses/junit/cpl-v10.html | 125 + .../pdfas-config/licenses/log4j/LICENSE.txt | 48 + .../pdfas-config/licenses/lucene/LICENSE.txt | 15 + .../resources/pdfas-config/licenses/pdfbox/LICENSE | 25 + .../pdfas-config/licenses/sun-jaicmm/JAI-LICENSE | 283 + .../pdfas-config/licenses/sun-jaicmm/LICENSE | 186 + pdf-as-common/build.gradle | 19 +- .../at/gv/egiz/pdfas/api/ws/PDFASSignRequest.java | 16 + .../settings/DefaultSignatureProfileSettings.java | 4 + .../pdfas/common/settings/IProfileConstants.java | 1 + .../utils/CheckSignatureBlockParameters.java | 42 + .../resources/resources/messages/common.properties | 1 + pdf-as-legacy/build.gradle | 16 +- pdf-as-lib/build.gradle | 56 +- .../pdfas/lib/api/IConfigurationConstants.java | 3 + .../at/gv/egiz/pdfas/lib/api/PdfAsFactory.java | 52 +- .../at/gv/egiz/pdfas/lib/api/PdfAsParameter.java | 16 + .../java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java | 6 +- .../gv/egiz/pdfas/lib/impl/PdfAsParameterImpl.java | 27 +- .../lib/impl/placeholder/PlaceholderExtractor.java | 4 + .../lib/impl/placeholder/PlaceholderFilter.java | 63 + .../CertificateAndRequestParameterResolver.java | 99 + .../lib/impl/stamping/CertificateResolver.java | 17 +- .../impl/stamping/RequestParameterResolver.java | 38 + .../egiz/pdfas/lib/impl/stamping/TableFactory.java | 14 +- .../pdfas/lib/impl/stamping/ValueResolver.java | 25 +- .../pdfas/lib/impl/status/OperationStatus.java | 6 + .../gv/egiz/pdfas/lib/impl/status/PDFObject.java | 6 + .../test/mains/SignatureBlockParameterTest.java | 87 + pdf-as-moa/build.gradle | 15 +- pdf-as-pdfbox-2/build.gradle | 29 +- .../placeholder/PDFBoxPlaceholderExtractor.java | 32 +- .../placeholder/SignaturePlaceholderExtractor.java | 95 +- .../pdfas/lib/impl/pdfbox2/utils/PdfBoxUtils.java | 22 +- .../impl/signing/pdfbox2/PADESPDFBOXSigner.java | 94 +- pdf-as-pdfbox/.gitignore | 1 - pdf-as-pdfbox/build.gradle | 37 - .../egiz/pdfas/lib/impl/pdfbox/PDFBOXBackend.java | 53 - .../egiz/pdfas/lib/impl/pdfbox/PDFBOXObject.java | 70 - .../placeholder/PDFBoxPlaceholderExtractor.java | 21 - .../placeholder/SignaturePlaceholderExtractor.java | 477 -- .../lib/impl/pdfbox/positioning/Positioning.java | 308 - .../pdfas/lib/impl/pdfbox/utils/PdfBoxUtils.java | 73 - .../lib/impl/signing/pdfbox/PADESPDFBOXSigner.java | 855 --- .../pdfbox/PDFASPDFBOXExtractorInterface.java | 7 - .../pdfbox/PDFASPDFBOXSignatureInterface.java | 10 - .../impl/signing/pdfbox/PdfboxSignerWrapper.java | 99 - .../signing/pdfbox/SignatureDataExtractor.java | 94 - .../lib/impl/stamping/pdfbox/FontInfoCache.java | 8 - .../lib/impl/stamping/pdfbox/IDGenerator.java | 5 - .../lib/impl/stamping/pdfbox/ImageObject.java | 63 - .../impl/stamping/pdfbox/PDFAsTemplateCreator.java | 170 - .../pdfbox/PDFAsVisualSignatureBuilder.java | 653 --- .../pdfbox/PDFAsVisualSignatureDesigner.java | 471 -- .../pdfbox/PDFAsVisualSignatureProperties.java | 148 - .../pdfas/lib/impl/stamping/pdfbox/PDFBoxFont.java | 298 - .../lib/impl/stamping/pdfbox/PDFBoxTable.java | 726 --- .../lib/impl/stamping/pdfbox/PdfBoxStamper.java | 67 - .../impl/stamping/pdfbox/PdfBoxVisualObject.java | 108 - .../lib/impl/stamping/pdfbox/StamperFactory.java | 25 - .../lib/impl/stamping/pdfbox/TableDrawUtils.java | 605 -- .../lib/impl/verify/pdfbox/PDFBOXVerifier.java | 158 - .../at/knowcenter/wag/egov/egiz/pdf/PDFPage.java | 661 --- .../knowcenter/wag/egov/egiz/pdf/PDFUtilities.java | 110 - .../path/PathConstructionOperatorProcessor.java | 84 - .../path/PathPaintingOperatorProcessor.java | 65 - .../pdf/operator/path/construction/ClosePath.java | 91 - .../pdf/operator/path/construction/CurveTo.java | 108 - .../construction/CurveToReplicateFinalPoint.java | 105 - .../construction/CurveToReplicateInitialPoint.java | 107 - .../pdf/operator/path/construction/LineTo.java | 94 - .../pdf/operator/path/construction/MoveTo.java | 96 - .../operator/path/painting/CloseAndStrokePath.java | 82 - .../painting/CloseFillEvenOddAndStrokePath.java | 83 - .../painting/CloseFillNonZeroAndStrokePath.java | 83 - .../egiz/pdf/operator/path/painting/EndPath.java | 91 - .../path/painting/FillEvenOddAndStrokePath.java | 95 - .../path/painting/FillNonZeroAndStrokePath.java | 95 - .../path/painting/FillPathEvenOddRule.java | 94 - .../painting/FillPathNonZeroWindingNumberRule.java | 95 - .../pdf/operator/path/painting/StrokePath.java | 93 - .../at.gv.egiz.pdfas.lib.backend.PDFASBackend | 1 - .../gv/egiz/pdfas/lib/testpdfbox/TTFFontTest.java | 45 - pdf-as-tests/build.gradle | 43 +- .../gv/egiz/param_tests/SignaturePositionTest.java | 9 +- .../PDFA_SIGNATURBLOCK_DE/TestGhostscriptPdfA.pdf | Bin 6635 -> 0 bytes .../PDFA_SIGNATURBLOCK_DE/config.properties | 5 - .../TestGhostscriptPdfA.pdf | Bin 6635 -> 0 bytes .../PDFA_SIGNATURBLOCK_DE_NOTE/config.properties | 5 - .../PDFA_SIGNATURBLOCK_EN/TestGhostscriptPdfA.pdf | Bin 6635 -> 0 bytes .../PDFA_SIGNATURBLOCK_EN/config.properties | 5 - .../TestGhostscriptPdfA.pdf | Bin 6635 -> 0 bytes .../PDFA_SIGNATURBLOCK_EN_NOTE/config.properties | 5 - .../POS_AMTSSIGNATURBLOCK_DE/config.properties | 5 - .../POS_AMTSSIGNATURBLOCK_DE/example.pdf | Bin 6257 -> 0 bytes .../POS_AMTSSIGNATURBLOCK_DE/example_ref.png | Bin 184734 -> 0 bytes .../config.properties | 5 - .../POS_AMTSSIGNATURBLOCK_DE_SMALL/example.pdf | Bin 6257 -> 0 bytes .../POS_AMTSSIGNATURBLOCK_DE_SMALL/example_ref.png | Bin 108823 -> 0 bytes .../POS_AMTSSIGNATURBLOCK_EN/config.properties | 5 - .../POS_AMTSSIGNATURBLOCK_EN/example.pdf | Bin 6257 -> 0 bytes .../POS_AMTSSIGNATURBLOCK_EN/example_ref.png | Bin 185947 -> 0 bytes .../config.properties | 5 - .../POS_AMTSSIGNATURBLOCK_EN_SMALL/example.pdf | Bin 6257 -> 0 bytes .../POS_AMTSSIGNATURBLOCK_EN_SMALL/example_ref.png | Bin 108669 -> 0 bytes .../public_pdfbox1/POS_AUTO/config.properties | 5 - .../public_pdfbox1/POS_AUTO/example.pdf | Bin 45256 -> 0 bytes .../public_pdfbox1/POS_AUTO/example_ref.png | Bin 687905 -> 0 bytes .../POS_SIGNATURBLOCK_DE/config.properties | 5 - .../POS_SIGNATURBLOCK_DE/example.pdf | Bin 6257 -> 0 bytes .../POS_SIGNATURBLOCK_DE/example_ref.png | Bin 118831 -> 0 bytes .../POS_SIGNATURBLOCK_DE_MINIMAL/config.properties | 5 - .../POS_SIGNATURBLOCK_DE_MINIMAL/example.pdf | Bin 6257 -> 0 bytes .../POS_SIGNATURBLOCK_DE_MINIMAL/example_ref.png | Bin 117456 -> 0 bytes .../POS_SIGNATURBLOCK_DE_NOTE/config.properties | 5 - .../POS_SIGNATURBLOCK_DE_NOTE/example.pdf | Bin 6257 -> 0 bytes .../POS_SIGNATURBLOCK_DE_NOTE/example_ref.png | Bin 147289 -> 0 bytes .../POS_SIGNATURBLOCK_DE_PDFA/config.properties | 5 - .../POS_SIGNATURBLOCK_DE_PDFA/example.pdf | Bin 6257 -> 0 bytes .../POS_SIGNATURBLOCK_DE_PDFA/example_ref.png | Bin 126678 -> 0 bytes .../config.properties | 5 - .../POS_SIGNATURBLOCK_DE_PDFA_NOTE/example.pdf | Bin 6257 -> 0 bytes .../POS_SIGNATURBLOCK_DE_PDFA_NOTE/example_ref.png | Bin 159917 -> 0 bytes .../POS_SIGNATURBLOCK_DE_SMALL/config.properties | 5 - .../POS_SIGNATURBLOCK_DE_SMALL/example.pdf | Bin 6257 -> 0 bytes .../POS_SIGNATURBLOCK_DE_SMALL/example_ref.png | Bin 72866 -> 0 bytes .../config.properties | 5 - .../POS_SIGNATURBLOCK_DE_SMALL_NOTE/example.pdf | Bin 6257 -> 0 bytes .../example_ref.png | Bin 90647 -> 0 bytes .../POS_SIGNATURBLOCK_EN/config.properties | 5 - .../POS_SIGNATURBLOCK_EN/example.pdf | Bin 6257 -> 0 bytes .../POS_SIGNATURBLOCK_EN/example_ref.png | Bin 118203 -> 0 bytes .../POS_SIGNATURBLOCK_EN_MINIMAL/config.properties | 5 - .../POS_SIGNATURBLOCK_EN_MINIMAL/example.pdf | Bin 6257 -> 0 bytes .../POS_SIGNATURBLOCK_EN_MINIMAL/example_ref.png | Bin 119508 -> 0 bytes .../POS_SIGNATURBLOCK_EN_NOTE/config.properties | 5 - .../POS_SIGNATURBLOCK_EN_NOTE/example.pdf | Bin 6257 -> 0 bytes .../POS_SIGNATURBLOCK_EN_NOTE/example_ref.png | Bin 139822 -> 0 bytes .../POS_SIGNATURBLOCK_EN_PDFA/config.properties | 5 - .../POS_SIGNATURBLOCK_EN_PDFA/example.pdf | Bin 6257 -> 0 bytes .../POS_SIGNATURBLOCK_EN_PDFA/example_ref.png | Bin 125912 -> 0 bytes .../config.properties | 5 - .../POS_SIGNATURBLOCK_EN_PDFA_NOTE/example.pdf | Bin 6257 -> 0 bytes .../POS_SIGNATURBLOCK_EN_PDFA_NOTE/example_ref.png | Bin 150499 -> 0 bytes .../POS_SIGNATURBLOCK_EN_SMALL/config.properties | 5 - .../POS_SIGNATURBLOCK_EN_SMALL/example.pdf | Bin 6257 -> 0 bytes .../POS_SIGNATURBLOCK_EN_SMALL/example_ref.png | Bin 72673 -> 0 bytes .../config.properties | 5 - .../POS_SIGNATURBLOCK_EN_SMALL_NOTE/example.pdf | Bin 6257 -> 0 bytes .../example_ref.png | Bin 86601 -> 0 bytes .../public_pdfbox1/auto_pos_example.properties | 6 - .../test-suites/public_pdfbox1/config.properties | 9 - .../public_pdfbox1/css/bootstrap-theme.css | 442 -- .../public_pdfbox1/css/bootstrap-theme.css.map | 1 - .../public_pdfbox1/css/bootstrap-theme.min.css | 5 - .../test-suites/public_pdfbox1/css/bootstrap.css | 6203 -------------------- .../public_pdfbox1/css/bootstrap.css.map | 1 - .../public_pdfbox1/css/bootstrap.min.css | 5 - .../test-suites/public_pdfbox1/js/bootstrap.js | 2114 ------- .../test-suites/public_pdfbox1/js/bootstrap.min.js | 6 - .../src/test/test-suites/public_pdfbox1/test.p12 | Bin 3372 -> 0 bytes pdf-as-web-client/build.gradle | 7 +- .../egiz/pdfas/web/client/test/SimpleTestSOAP.java | 95 + .../test/SimpleTestSOAPInvalidParameter.java | 90 + pdf-as-web-db/build.gradle | 15 +- pdf-as-web-statistic-api/build.gradle | 8 +- pdf-as-web-status/build.gradle | 8 +- pdf-as-web/build.gradle | 135 +- .../src/main/assembly/tomcat/setVariables.bat | 4 +- .../at/gv/egiz/pdfas/web/helper/PdfAsHelper.java | 28 +- .../pdfas/web/helper/PdfAsParameterExtractor.java | 27 +- .../egiz/pdfas/web/servlets/ExternSignServlet.java | 20 +- .../gv/egiz/pdfas/web/servlets/JSONAPIServlet.java | 32 +- .../web/servlets/PlaceholderGeneratorServlet.java | 8 +- .../pdfas/web/servlets/UIEntryPointServlet.java | 4 +- .../gv/egiz/pdfas/web/servlets/VerifyServlet.java | 2 +- .../at/gv/egiz/pdfas/web/ws/PDFASSigningImpl.java | 9 +- .../egiz/pdfas/web/ws/PDFASVerificationImpl.java | 2 +- pdf-as-web/src/main/webapp/WEB-INF/web.xml | 17 +- pdf-as-web/src/main/webapp/index.jsp | 15 +- settings.gradle | 2 +- signature-standards/sigs-pades/build.gradle | 10 +- .../sigs-pkcs7detached/build.gradle | 10 +- 236 files changed, 3974 insertions(+), 17318 deletions(-) mode change 100755 => 100644 doc/PDFAS4_Dokumentation.pdf mode change 100755 => 100644 doc/PDFAS4_Profile_Dokumentation.docx mode change 100755 => 100644 doc/PDFAS4_Profile_Dokumentation.pdf create mode 100644 pdf-as-cli/src/test/java/at/gv/egiz/pdfas/cli/test/SignatureBlockParameterTest.java create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/cfg/advancedconfig.properties create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/cfg/config.properties create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/cfg/log4j.properties create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/cfg/logback.xml create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles.zip create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles/BASE_LOGO.properties create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles/BASE_NORMAL.properties create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles/BASE_NORMAL_NOTE.properties create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles/SIGNATURBLOCK_DE.properties create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles/SIGNATURBLOCK_DE_NOTE.properties create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles/SIGNATURBLOCK_DE_NOTE_DYNAMIC.properties create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles/SIGNATURBLOCK_DE_NOTE_DYNAMIC_WITH_TEXT_AFTER_VARIABLE.properties create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/fonts/DejaVuSansCondensed-Bold.ttf create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/fonts/DejaVuSansCondensed.ttf create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/fonts/DejaVuSansMono.ttf create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/fonts/arial.ttf create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/images/Baik_Archiv.gif create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/images/Baik_Urkunde.gif create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/images/amtsignatur-logo_demo.png create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/images/justizsignatur_neu.gif create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/images/seal-logo_de.png create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/images/seal-logo_en.png create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/images/signatur-logo_de.png create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/images/signatur-logo_de_highest_resolution.png create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/images/signatur-logo_en.png create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/images/signatur-logo_en_highest_resolution.png create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/licenses/adobe/AFM_License.html create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/licenses/ant/LICENSE create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/licenses/ant/LICENSE.dom create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/licenses/ant/LICENSE.sax create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/licenses/ant/LICENSE.xerces create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/licenses/apache/LICENSE create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/licenses/checkstyle/LICENSE create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/licenses/checkstyle/LICENSE.apache create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/licenses/dejavu-font/LICENSE create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/licenses/fonts/BitStream.txt create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/licenses/ikvm/LICENSE create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/licenses/junit/cpl-v10.html create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/licenses/log4j/LICENSE.txt create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/licenses/lucene/LICENSE.txt create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/licenses/pdfbox/LICENSE create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/licenses/sun-jaicmm/JAI-LICENSE create mode 100644 pdf-as-cli/src/test/resources/pdfas-config/licenses/sun-jaicmm/LICENSE create mode 100644 pdf-as-common/src/main/java/at/gv/egiz/pdfas/common/utils/CheckSignatureBlockParameters.java create mode 100644 pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/CertificateAndRequestParameterResolver.java create mode 100644 pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/RequestParameterResolver.java create mode 100644 pdf-as-lib/src/test/java/at/gv/egiz/pdfas/lib/test/mains/SignatureBlockParameterTest.java delete mode 100644 pdf-as-pdfbox/.gitignore delete mode 100644 pdf-as-pdfbox/build.gradle delete mode 100644 pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox/PDFBOXBackend.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox/PDFBOXObject.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox/placeholder/PDFBoxPlaceholderExtractor.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox/placeholder/SignaturePlaceholderExtractor.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox/positioning/Positioning.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox/utils/PdfBoxUtils.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/PADESPDFBOXSigner.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/PDFASPDFBOXExtractorInterface.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/PDFASPDFBOXSignatureInterface.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/PdfboxSignerWrapper.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/SignatureDataExtractor.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/FontInfoCache.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/IDGenerator.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/ImageObject.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsTemplateCreator.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureBuilder.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureDesigner.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureProperties.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFBoxFont.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFBoxTable.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PdfBoxStamper.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PdfBoxVisualObject.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/StamperFactory.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/TableDrawUtils.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/verify/pdfbox/PDFBOXVerifier.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFPage.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFUtilities.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/PathConstructionOperatorProcessor.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/PathPaintingOperatorProcessor.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/construction/ClosePath.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/construction/CurveTo.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/construction/CurveToReplicateFinalPoint.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/construction/CurveToReplicateInitialPoint.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/construction/LineTo.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/construction/MoveTo.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/CloseAndStrokePath.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/CloseFillEvenOddAndStrokePath.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/CloseFillNonZeroAndStrokePath.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/EndPath.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/FillEvenOddAndStrokePath.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/FillNonZeroAndStrokePath.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/FillPathEvenOddRule.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/FillPathNonZeroWindingNumberRule.java delete mode 100644 pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/StrokePath.java delete mode 100644 pdf-as-pdfbox/src/main/resources/META-INF/services/at.gv.egiz.pdfas.lib.backend.PDFASBackend delete mode 100644 pdf-as-pdfbox/src/test/java/at/gv/egiz/pdfas/lib/testpdfbox/TTFFontTest.java delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_DE/TestGhostscriptPdfA.pdf delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_DE/config.properties delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_DE_NOTE/TestGhostscriptPdfA.pdf delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_DE_NOTE/config.properties delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_EN/TestGhostscriptPdfA.pdf delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_EN/config.properties delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_EN_NOTE/TestGhostscriptPdfA.pdf delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_EN_NOTE/config.properties delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_DE/config.properties delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_DE/example.pdf delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_DE/example_ref.png delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_DE_SMALL/config.properties delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_DE_SMALL/example.pdf delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_DE_SMALL/example_ref.png delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_EN/config.properties delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_EN/example.pdf delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_EN/example_ref.png delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_EN_SMALL/config.properties delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_EN_SMALL/example.pdf delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_EN_SMALL/example_ref.png delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AUTO/config.properties delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AUTO/example.pdf delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AUTO/example_ref.png delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE/config.properties delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE/example.pdf delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE/example_ref.png delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_MINIMAL/config.properties delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_MINIMAL/example.pdf delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_MINIMAL/example_ref.png delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_NOTE/config.properties delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_NOTE/example.pdf delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_NOTE/example_ref.png delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_PDFA/config.properties delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_PDFA/example.pdf delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_PDFA/example_ref.png delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_PDFA_NOTE/config.properties delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_PDFA_NOTE/example.pdf delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_PDFA_NOTE/example_ref.png delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_SMALL/config.properties delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_SMALL/example.pdf delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_SMALL/example_ref.png delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_SMALL_NOTE/config.properties delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_SMALL_NOTE/example.pdf delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_SMALL_NOTE/example_ref.png delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN/config.properties delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN/example.pdf delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN/example_ref.png delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_MINIMAL/config.properties delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_MINIMAL/example.pdf delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_MINIMAL/example_ref.png delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_NOTE/config.properties delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_NOTE/example.pdf delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_NOTE/example_ref.png delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_PDFA/config.properties delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_PDFA/example.pdf delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_PDFA/example_ref.png delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_PDFA_NOTE/config.properties delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_PDFA_NOTE/example.pdf delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_PDFA_NOTE/example_ref.png delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_SMALL/config.properties delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_SMALL/example.pdf delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_SMALL/example_ref.png delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_SMALL_NOTE/config.properties delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_SMALL_NOTE/example.pdf delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_SMALL_NOTE/example_ref.png delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/auto_pos_example.properties delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/config.properties delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/css/bootstrap-theme.css delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/css/bootstrap-theme.css.map delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/css/bootstrap-theme.min.css delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/css/bootstrap.css delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/css/bootstrap.css.map delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/css/bootstrap.min.css delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/js/bootstrap.js delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/js/bootstrap.min.js delete mode 100644 pdf-as-tests/src/test/test-suites/public_pdfbox1/test.p12 create mode 100644 pdf-as-web-client/src/test/java/at/gv/egiz/pdfas/web/client/test/SimpleTestSOAP.java create mode 100644 pdf-as-web-client/src/test/java/at/gv/egiz/pdfas/web/client/test/SimpleTestSOAPInvalidParameter.java diff --git a/.gitignore b/.gitignore index 8b0de7ae..0009ad2f 100644 --- a/.gitignore +++ b/.gitignore @@ -49,4 +49,6 @@ local.properties .buildpath /PDF-AS/.nb-gradle/ -.idea/* \ No newline at end of file +/releases + +.idea/* diff --git a/README.md b/README.md index 48613cc9..2dd4f220 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,14 @@ arguments: `-Dpdf-as-web.conf=$CATALINA_BASE/conf/pdf-as/pdf-as-web.properties \` +#### 4. Intellij Config for testing: + +* Main class: at.gv.egiz.pdfas.cli.Main +* Classpath: pdf-as-4-pdf-as-cli.pdfbox2 +* Parameters: -p SIGNATURBLOCK_DE_NOTE_DYNAMIC -c bku -m sign /Users/user/Documents/pdf-as-4/unsigned.pdf +* Needs local BKU (e.g. Mocca) +* Uses configuration from /Users/user/.pdfas/ + diff --git a/build.gradle b/build.gradle index f57f4555..7ef1711c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ buildscript { repositories { - jcenter() + gradlePluginPortal() mavenCentral() } @@ -9,16 +9,10 @@ buildscript { } } -/* -task wrapper(type: Wrapper) { - gradleVersion = '5.6.4' -} -*/ - allprojects { apply plugin: "com.github.ben-manes.versions" repositories { mavenCentral() } - version = '4.1.7-RC-0.0.4' + version = '4.2.0' } configurations { @@ -50,9 +44,10 @@ task checkCVE { subprojects { - apply plugin: 'java' + apply plugin: 'java-library' apply plugin: 'eclipse' - apply plugin: 'maven' + apply plugin: 'maven-publish' + //apply plugin: 'maven' group = 'at.gv.egiz.pdfas' configurations { @@ -63,8 +58,8 @@ subprojects { repositories { mavenCentral() } dependencies { - testCompile 'junit:junit:4.8.2' - cveCheck 'org.owasp:dependency-check-ant:1.2.5' + testImplementation 'junit:junit:4.13.2' + cveCheck 'org.owasp:dependency-check-ant:6.1.3' } task sourcesJar(type: Jar, dependsOn: classes) { @@ -77,6 +72,8 @@ subprojects { } sourceCompatibility = 1.7 + compileJava.options.encoding = "UTF-8" + compileTestJava.options.encoding = "UTF-8" project.ext{ releaseRepoUrl = "file://${project(':').projectDir}/../mvn-repo/releases" snapshotRepoUrl = "file://${project(':').projectDir}/../mvn-repo/snapshots" @@ -84,7 +81,8 @@ subprojects { pdfasversion = version revision = getCheckedOutGitCommitHash() //tomcatVersion = '7.0.54'; - tomcatVersion = '8.0.36'; + //tomcatVersion = '8.0.36'; + tomcatVersion = '9.0.46'; slf4jVersion = '1.7.30' cxfVersion = '3.0.1' } @@ -124,12 +122,27 @@ subprojects { checkCVELocal.dependsOn copyDepsLocal - uploadArchives { - repositories.mavenDeployer { - repository(url: project.releaseRepoUrl) - snapshotRepository(url: project.snapshotRepoUrl) - } - } + publishing { + publications { + myLibrary(MavenPublication) { + from components.java + } + } + + repositories { + maven { + name = 'egiz_repo' + url = version.endsWith('SNAPSHOT') ? project.snapshotRepoUrl : project.releaseRepoUrl + } + } + } + +// uploadArchives { +// repositories.mavenDeployer { +// repository(url: project.releaseRepoUrl) +// snapshotRepository(url: project.snapshotRepoUrl) +// } +// } task(internalRelease) { doLast { diff --git a/doc/AnbindungExterneWebanwendung.docx b/doc/AnbindungExterneWebanwendung.docx index 42e26e72..764b9517 100644 Binary files a/doc/AnbindungExterneWebanwendung.docx and b/doc/AnbindungExterneWebanwendung.docx differ diff --git a/doc/AnbindungExterneWebanwendung.pdf b/doc/AnbindungExterneWebanwendung.pdf index 3ae63741..00338b3c 100644 Binary files a/doc/AnbindungExterneWebanwendung.pdf and b/doc/AnbindungExterneWebanwendung.pdf differ diff --git a/doc/PDFAS4_Dokumentation.docx b/doc/PDFAS4_Dokumentation.docx index dd058bb3..9112d5b5 100644 Binary files a/doc/PDFAS4_Dokumentation.docx and b/doc/PDFAS4_Dokumentation.docx differ diff --git a/doc/PDFAS4_Dokumentation.pdf b/doc/PDFAS4_Dokumentation.pdf old mode 100755 new mode 100644 index 2514129d..3dbafb00 Binary files a/doc/PDFAS4_Dokumentation.pdf and b/doc/PDFAS4_Dokumentation.pdf differ diff --git a/doc/PDFAS4_Profile_Dokumentation.docx b/doc/PDFAS4_Profile_Dokumentation.docx old mode 100755 new mode 100644 index 866e6b70..fbb35cf7 Binary files a/doc/PDFAS4_Profile_Dokumentation.docx and b/doc/PDFAS4_Profile_Dokumentation.docx differ diff --git a/doc/PDFAS4_Profile_Dokumentation.pdf b/doc/PDFAS4_Profile_Dokumentation.pdf old mode 100755 new mode 100644 index 7cb3dfd2..8bf5d5a3 Binary files a/doc/PDFAS4_Profile_Dokumentation.pdf and b/doc/PDFAS4_Profile_Dokumentation.pdf differ diff --git a/doc/PDFAS4_WebDokumentation.docx b/doc/PDFAS4_WebDokumentation.docx index c5d9d818..880a3dcc 100644 Binary files a/doc/PDFAS4_WebDokumentation.docx and b/doc/PDFAS4_WebDokumentation.docx differ diff --git a/doc/PDFAS4_WebDokumentation.pdf b/doc/PDFAS4_WebDokumentation.pdf index 5f3b006d..83207e5d 100644 Binary files a/doc/PDFAS4_WebDokumentation.pdf and b/doc/PDFAS4_WebDokumentation.pdf differ diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index a1347e58..94336fca 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1d5b29fb..442d9132 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-bin.zip diff --git a/pdf-as-cli/build.gradle b/pdf-as-cli/build.gradle index 3c80e425..79efe54a 100644 --- a/pdf-as-cli/build.gradle +++ b/pdf-as-cli/build.gradle @@ -1,4 +1,4 @@ -apply plugin: 'java' +apply plugin: 'java-library' apply plugin: 'eclipse' apply plugin: 'application' @@ -16,8 +16,7 @@ task releases(type: Copy) { } configurations { - pdfBox2Compile - pdfBox1Compile + pdfBox2Compile } sourceSets{ @@ -25,24 +24,19 @@ sourceSets{ compileClasspath = configurations.pdfBox2Compile runtimeClasspath = configurations.pdfBox2Compile + main.runtimeClasspath } - pdfBox1{ - compileClasspath = configurations.pdfBox1Compile - runtimeClasspath = configurations.pdfBox1Compile + main.runtimeClasspath - } } dependencies { - compile project (':pdf-as-lib') - compile project (':signature-standards:sigs-pkcs7detached') - compile project (':signature-standards:sigs-pades') - compile project (':pdf-as-moa') - pdfBox1Compile project (':pdf-as-pdfbox') - pdfBox2Compile project (':pdf-as-pdfbox-2') - compile group: 'commons-collections', name: 'commons-collections', version: '3.2.2' - compile group: 'commons-cli', name: 'commons-cli', version: '1.2' - compile group: 'javax.activation', name: 'activation', version: '1.1.1' - compile 'ch.qos.logback:logback-classic:1.1.2' - testCompile group: 'junit', name: 'junit', version: '4.+' + implementation project (':pdf-as-lib') + implementation project (':signature-standards:sigs-pkcs7detached') + implementation project (':signature-standards:sigs-pades') + implementation project (':pdf-as-moa') + implementation project (':pdf-as-pdfbox-2') + implementation group: 'commons-collections', name: 'commons-collections', version: '3.2.2' + implementation group: 'commons-cli', name: 'commons-cli', version: '1.2' + implementation group: 'javax.activation', name: 'activation', version: '1.1.1' + implementation 'ch.qos.logback:logback-classic:1.1.2' + testImplementation group: 'junit', name: 'junit', version: '4.+' } @@ -52,62 +46,18 @@ startScripts{ compileJava{ classpath=sourceSets.main.compileClasspath - classpath+=sourceSets.pdfBox1.compileClasspath classpath+=sourceSets.pdfBox2.compileClasspath } -task pdfbox1Startscript(type: CreateStartScripts) { - description "Creates OS specific scripts to call the 'other' entry point" - - classpath = startScripts.classpath.minus(configurations.pdfBox2Compile) + sourceSets.pdfBox1.compileClasspath - outputDir = startScripts.outputDir - mainClassName = startScripts.mainClassName - applicationName = startScripts.applicationName+"-pdfbox1" -} - -distZip { - baseName = archivesBaseName - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - - into("${baseName}-${version}/lib") { - from startScripts.classpath - } - into("${baseName}-${version}/lib") { - from pdfbox1Startscript.classpath - } - into("${baseName}-${version}/bin") { - from pdfbox1Startscript - } -} - -distTar { - baseName = archivesBaseName - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - - into("${baseName}-${version}/lib") { - from startScripts.classpath - } - into("${baseName}-${version}/lib") { - from pdfbox1Startscript.classpath - } - into("${baseName}-${version}/bin") { - from pdfbox1Startscript - } -} - - releases.dependsOn jar releases.dependsOn sourcesJar releases.dependsOn distZip releases.dependsOn distTar distZip.dependsOn startScripts -startScripts.dependsOn pdfbox1Startscript - test { systemProperties 'property': 'value' } - diff --git a/pdf-as-cli/src/main/java/at/gv/egiz/pdfas/cli/Main.java b/pdf-as-cli/src/main/java/at/gv/egiz/pdfas/cli/Main.java index c2d35c40..86769c49 100644 --- a/pdf-as-cli/src/main/java/at/gv/egiz/pdfas/cli/Main.java +++ b/pdf-as-cli/src/main/java/at/gv/egiz/pdfas/cli/Main.java @@ -26,8 +26,10 @@ package at.gv.egiz.pdfas.cli; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; +import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Map.Entry; import java.util.UUID; @@ -83,6 +85,9 @@ public class Main { public static final String CLI_ARG_CONF_SHORT = "conf"; public static final String CLI_ARG_CONF = "configuration"; + public static final String CLI_ARG_SIGNATURE_BLOCK_PARAM_SHORT = "sbp"; + public static final String CLI_ARG_SIGNATURE_BLOCK_PARAM = "signature_block_parameter"; + public static final String CLI_ARG_DEPLOY_SHORT = "d"; public static final String CLI_ARG_DEPLOY = "deploy"; @@ -197,6 +202,10 @@ public class Main { true, "The output file"); cliOptions.addOption(outputOption); + Option signatureBlockParameters = new Option(CLI_ARG_SIGNATURE_BLOCK_PARAM_SHORT, CLI_ARG_SIGNATURE_BLOCK_PARAM, + true, "Parameters or signature block"); + cliOptions.addOption(signatureBlockParameters); + return cliOptions; } @@ -432,6 +441,23 @@ public class Main { System.out.println("Starting signature for " + pdfFile); System.out.println("Selected signature Profile " + profilID); + // get console parameters related to signature block + String[] signatureBlockParameters = null; + if (cli.hasOption(CLI_ARG_SIGNATURE_BLOCK_PARAM_SHORT)) { + signatureBlockParameters = cli.getOptionValues(CLI_ARG_SIGNATURE_BLOCK_PARAM_SHORT); + } + Map signatureBlockParametersMap = new HashMap<>(); + if(signatureBlockParameters != null && signatureBlockParameters.length > 0) { + for(String s : signatureBlockParameters) { + if(!s.contains("=")) { + throw new Exception("Invalid parameter: "+s); + } + String[] values = s.split("=", 2); + signatureBlockParametersMap.put(values[0], values[1]); + } + } + signParameter.setDynamicSignatureBlockArguments(signatureBlockParametersMap); + SignResult result = null; try { result = pdfAs.sign(signParameter); diff --git a/pdf-as-cli/src/test/java/at/gv/egiz/pdfas/cli/test/SignatureBlockParameterTest.java b/pdf-as-cli/src/test/java/at/gv/egiz/pdfas/cli/test/SignatureBlockParameterTest.java new file mode 100644 index 00000000..186eb5a9 --- /dev/null +++ b/pdf-as-cli/src/test/java/at/gv/egiz/pdfas/cli/test/SignatureBlockParameterTest.java @@ -0,0 +1,292 @@ +/******************************************************************************* + * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria + * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a + * joint initiative of the Federal Chancellery Austria and Graz University of + * Technology. + * + * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by + * the European Commission - subsequent versions of the EUPL (the "Licence"); + * You may not use this work except in compliance with the Licence. + * You may obtain a copy of the Licence at: + * http://www.osor.eu/eupl/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the Licence is distributed on an "AS IS" basis, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the Licence for the specific language governing permissions and + * limitations under the Licence. + * + * This product combines work with different licenses. See the "NOTICE" text + * file for details on the various modules and licenses. + * The "NOTICE" text file is part of the distribution. Any derivative works + * that you distribute must include a readable copy of the "NOTICE" text file. + ******************************************************************************/ +package at.gv.egiz.pdfas.cli.test; + +import at.gv.egiz.pdfas.common.exceptions.PDFASError; +import at.gv.egiz.pdfas.common.exceptions.PdfAsException; +import at.gv.egiz.pdfas.lib.api.ByteArrayDataSource; +import at.gv.egiz.pdfas.lib.api.Configuration; +import at.gv.egiz.pdfas.lib.api.PdfAs; +import at.gv.egiz.pdfas.lib.api.PdfAsFactory; +import at.gv.egiz.pdfas.lib.api.sign.IPlainSigner; +import at.gv.egiz.pdfas.lib.api.sign.SignParameter; +import at.gv.egiz.pdfas.lib.api.sign.SignResult; +import at.gv.egiz.pdfas.sigs.pades.PAdESSignerKeystore; +import org.apache.commons.io.IOUtils; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature; +import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; +import org.apache.pdfbox.pdmodel.interactive.form.PDField; +import org.apache.pdfbox.pdmodel.interactive.form.PDSignatureField; +import org.junit.Assert; +import org.junit.Test; + +import javax.activation.DataSource; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class SignatureBlockParameterTest { + + public static final String KS_ALIAS = "ecc_test"; + public static final String KS_TYPE = "PKCS12"; + public static final String KS_PASS = "123456"; + public static final String KS_KEY_PASS = "123456"; + + public String getPath(String resourceName) { + ClassLoader classLoader = this.getClass().getClassLoader(); + File file = new File(classLoader.getResource(resourceName).getFile()); + String absolutePath = file.getAbsolutePath(); + + System.out.println(absolutePath); + return absolutePath; + } + + @Test(expected = PdfAsException.class) + public void invalid() throws IOException, PdfAsException, PDFASError { + + PdfAs pdfas = PdfAsFactory.createPdfAs(new File(getPath("pdfas-config"))); + Configuration config = pdfas.getConfiguration(); + + byte[] input = IOUtils.toByteArray(new FileInputStream(getPath("simple_rotated_0.pdf"))); + + IPlainSigner signer = new PAdESSignerKeystore(getPath("test.p12"), KS_ALIAS, KS_PASS, KS_KEY_PASS, KS_TYPE); + + String profile = "SIGNATURBLOCK_DE_NOTE_DYNAMIC"; + System.out.println("Testing " + profile); + + DataSource source = new ByteArrayDataSource(input); + String outFile = getPath("out") + "/" + profile + ".pdf"; + FileOutputStream fos = new FileOutputStream(outFile); + SignParameter signParameter = PdfAsFactory.createSignParameter( + config, source, fos); + + Map map = new HashMap<>(); + map.put("subject", "TEST123"); + map.put("WAY_TOOOOOOOOOOOOOOOOOOOOO_LONG_KEY", "bar"); + signParameter.setDynamicSignatureBlockArguments(map); +// signParameter.setPlainSigner(signer); +// signParameter.setSignatureProfileId(profile); +// +// SignResult result = pdfas.sign(signParameter); + + fos.close(); + + } + + @Test + public void test() throws IOException, PDFASError, PdfAsException { + + PdfAs pdfas = PdfAsFactory.createPdfAs(new File(getPath("pdfas-config"))); + Configuration config = pdfas.getConfiguration(); + + byte[] input = IOUtils.toByteArray(new FileInputStream(getPath("simple_rotated_0.pdf"))); + + IPlainSigner signer = new PAdESSignerKeystore(getPath("test.p12"), KS_ALIAS, KS_PASS, KS_KEY_PASS, KS_TYPE); + + String profile = "SIGNATURBLOCK_DE_NOTE_DYNAMIC"; + System.out.println("Testing " + profile); + + DataSource source = new ByteArrayDataSource(input); + String outFile = getPath("out") + "/" + profile + ".pdf"; + FileOutputStream fos = new FileOutputStream(outFile); + SignParameter signParameter = PdfAsFactory.createSignParameter( + config, source, fos); + + Map map = new HashMap<>(); + map.put("subject", "TEST123"); + map.put("foo", "bar"); + signParameter.setDynamicSignatureBlockArguments(map); + signParameter.setPlainSigner(signer); + signParameter.setSignatureProfileId(profile); + + SignResult result = pdfas.sign(signParameter); + + fos.close(); + String name = getName(outFile, "PDF-AS Signatur1"); + Assert.assertEquals("TEST123 test bar 123 c TEST123 Andreas Fitzek ECC", name); + + + outFile = getPath("out") + "/" + profile + "-1.pdf"; + fos = new FileOutputStream(outFile); + signParameter = PdfAsFactory.createSignParameter( + config, source, fos); + + map = new HashMap<>(); + map.put("subject", "TEST123"); + signParameter.setDynamicSignatureBlockArguments(map); + signParameter.setPlainSigner(signer); + signParameter.setSignatureProfileId(profile); + + result = pdfas.sign(signParameter); + + fos.close(); + name = getName(outFile, "PDF-AS Signatur1"); + Assert.assertEquals("TEST123 test null 123 c TEST123 Andreas Fitzek ECC", name); + + outFile = getPath("out") + "/" + profile + "-2.pdf"; + fos = new FileOutputStream(outFile); + signParameter = PdfAsFactory.createSignParameter( + config, source, fos); + map = new HashMap<>(); + map.put("foo", "bar"); + signParameter.setDynamicSignatureBlockArguments(map); + signParameter.setPlainSigner(signer); + signParameter.setSignatureProfileId(profile); + result = pdfas.sign(signParameter); + fos.close(); + name = getName(outFile, "PDF-AS Signatur1"); + Assert.assertEquals("null test bar 123 c null Andreas Fitzek ECC", name); + + outFile = getPath("out") + "/" + profile + "-3.pdf"; + fos = new FileOutputStream(outFile); + signParameter = PdfAsFactory.createSignParameter( + config, source, fos); + + signParameter.setPlainSigner(signer); + signParameter.setSignatureProfileId(profile); + result = pdfas.sign(signParameter); + fos.close(); + name = getName(outFile, "PDF-AS Signatur1"); + Assert.assertEquals("null test null 123 c null Andreas Fitzek ECC", name); +// Assert.assertEquals("{sbp.subject} test {sbp.foo} 123 {subject.T != null ? (subject.T + \" a \"+sbp.subject) : " + +// "\"c \"+sbp.subject+\" \"}Andreas Fitzek ECC", name); +//TODO was ist gewünscht? + + + outFile = getPath("out") + "/" + profile + "-4.pdf"; + fos = new FileOutputStream(outFile); + signParameter = PdfAsFactory.createSignParameter( + config, source, fos); + map = new HashMap<>(); + signParameter.setDynamicSignatureBlockArguments(map); + signParameter.setPlainSigner(signer); + signParameter.setSignatureProfileId(profile); + result = pdfas.sign(signParameter); + fos.close(); + name = getName(outFile, "PDF-AS Signatur1"); + Assert.assertEquals("null test null 123 c null Andreas Fitzek ECC", name); + + + } + + @Test + public void testWithUmlaute() throws IOException, PDFASError, PdfAsException { + + PdfAs pdfas = PdfAsFactory.createPdfAs(new File(getPath("pdfas-config"))); + Configuration config = pdfas.getConfiguration(); + + + byte[] input = IOUtils.toByteArray(new FileInputStream(getPath("simple_rotated_0.pdf"))); + + IPlainSigner signer = new PAdESSignerKeystore(getPath("test.p12"), KS_ALIAS, KS_PASS, KS_KEY_PASS, KS_TYPE); + + String profile = "SIGNATURBLOCK_DE_NOTE_DYNAMIC"; + System.out.println("Testing " + profile); + + DataSource source = new ByteArrayDataSource(input); + String outFile = getPath("out") + "/" + profile + "-umlaute.pdf"; + FileOutputStream fos = new FileOutputStream(outFile); + SignParameter signParameter = PdfAsFactory.createSignParameter( + config, source, fos); + + Map map = new HashMap<>(); + map.put("subject", "TEST123"); + map.put("foo", "baräöÜ"); + signParameter.setDynamicSignatureBlockArguments(map); + signParameter.setPlainSigner(signer); + signParameter.setSignatureProfileId(profile); + + SignResult result = pdfas.sign(signParameter); + + fos.close(); + String name = getName(outFile, "PDF-AS Signatur1"); + Assert.assertEquals("TEST123 test baräöÜ 123 c TEST123 Andreas Fitzek ECC", name); + //expected: but was: + } + + + @Test + public void testWithTextAfterVariable() throws IOException, PDFASError, PdfAsException { + + PdfAs pdfas = PdfAsFactory.createPdfAs(new File(getPath("pdfas-config"))); + Configuration config = pdfas.getConfiguration(); + + + byte[] input = IOUtils.toByteArray(new FileInputStream(getPath("simple_rotated_0.pdf"))); + + IPlainSigner signer = new PAdESSignerKeystore(getPath("test.p12"), KS_ALIAS, KS_PASS, KS_KEY_PASS, KS_TYPE); + + String profile = "SIGNATURBLOCK_DE_NOTE_DYNAMIC_WITH_TEXT_AFTER_VARIABLE"; + System.out.println("Testing " + profile); + + DataSource source = new ByteArrayDataSource(input); + String outFile = getPath("out") + "/" + profile + "-umlaute.pdf"; + FileOutputStream fos = new FileOutputStream(outFile); + SignParameter signParameter = PdfAsFactory.createSignParameter( + config, source, fos); + + Map map = new HashMap<>(); + map.put("subject", "TEST123"); + map.put("foo", "baräöÜ"); + signParameter.setDynamicSignatureBlockArguments(map); + signParameter.setPlainSigner(signer); + signParameter.setSignatureProfileId(profile); + + SignResult result = pdfas.sign(signParameter); + + fos.close(); + String name = getName(outFile, "PDF-AS Signatur1"); + Assert.assertEquals("Andreas Fitzek ECC text after variable", name); + //expected: but was: + } + + private String getName(String fileName, String sigFieldName) throws IOException { + PDDocument pdDoc = PDDocument.load(new File(fileName)); + PDSignature signature = null; + PDSignatureField signatureField; + PDAcroForm acroForm = pdDoc.getDocumentCatalog().getAcroForm(); + if (acroForm != null) { + List aa = acroForm.getFields(); + signatureField = (PDSignatureField) acroForm.getField(sigFieldName); + if (signatureField != null) { + // retrieve signature dictionary + signature = signatureField.getSignature(); + if (signature != null) { + String name = signature.getName(); + return name; + + } + + } + } + return null; + } + +} diff --git a/pdf-as-cli/src/test/resources/pdfas-config/cfg/advancedconfig.properties b/pdf-as-cli/src/test/resources/pdfas-config/cfg/advancedconfig.properties new file mode 100644 index 00000000..d6b965cd --- /dev/null +++ b/pdf-as-cli/src/test/resources/pdfas-config/cfg/advancedconfig.properties @@ -0,0 +1,107 @@ +###################################################################### +# Fortgeschrittene PDF-AS Konfiguration +# +# Hier koennen fortgeschrittene Einstellungen getaetigt werden. +# Die hier angefuehrten Eigenschaften werden grundsaetzlich durch die +# interne Standard-Konfiguration abgedeckt und sind deshalb hier +# lediglich als Kommentare ausgefuehrt. Die Werte entsprechen jenen +# der Standard-Konfiguration. +# Diese Konfiguration muss in config.properties via include- +# Instruktion eingebunden werden: +# include.advancedconfig = advancedconfig.properties +##################################################################### + +# Aktiviert, oder deaktiviert grundsaetzlich das - potenziell zeit- und ressourcen-aufwaendige +# Suchen nach Platzhalter-Bildern in PDF-Dokumenten +# Festlegung fuer einzelnes Profil +# sig_obj.PROFILE.enable_placeholder_search=[true|false] +# Die Suche ist standardmaessig aus Sicherheitsgruenden deaktiviert (Defaultwert hier = false) +# Es muss bewusst sein, dass ueber einen Platzhalter benutzerseitig bestimmte Profile zur Signatur +# ausgewaehlt werden koennen! + +#enable_placeholder_search=true + + +#Aktiviert oder deaktiviert die Kompatibilität mit dem PAdES Signaturstandard manuell +sig_obj.PAdESCompatibility=true +#Überprüft PAdES Kompatibiltät für lokale BKU +sig_obj.CheckPAdESCompatibility=true + + +# These values should be configured at runtime: + +# Set this for placeholder Identifier +# default is unset +#placeholder_id= + +# Set this for placeholder Mode +# MATCH_MODE_STRICT = 0 +# MATCH_MODE_MODERATE = 1 +# MATCH_MODE_LENIENT = 2 +# MATCH_MODE_SORTED = 3 +#placeholder_mode= + +################## +# Signaturdienste + + +## Lokale BKU + +#bku.available_for_web=true +#bku.available_for_commandline=true +#bku.sign.KeyboxIdentifier=SecureSignatureKeypair + + +## Online BKU (MOCCA) + +#moc.available_for_web=true +#moc.available_for_commandline=false +#moc.sign.KeyboxIdentifier=SecureSignatureKeypair + + +## Handy + +#mobile.sign.KeyboxIdentifier=SecureSignatureKeypair +#mobiletest.sign.KeyboxIdentifier=SecureSignatureKeypair + + +## MOA + +#moa.available_for_web=true +#moa.available_for_commandline=true + +# MOA Detached Signieren aus Konsole moeglich - zurzeit moeglich nur mit BKU + +#moa.sign.console.detached.enabled=false + +# PDF/A-1b Unterstuetzung fuer alle Profile einschalten + +#default.SIG_PDFA1B_VALID=false + + +# BAIK-Signatur Unterstuetzung fuer alle Profile einschalten + +#default.SIG_BAIK_ENABLED=false + +# Standardwert fuer "Reason"-Feld der jeweiligen Signatur + +#default.adobeSignReasonValue=Informationen zur Pr\u00FCfung finden Sie unter http://www.signaturpruefung.gv.at + +# Standard Prueflink fuer die Adobe Signaturkennzeichnung (nur relevant falls Adobe Plugin fuer Pruefung verwendet wird) + +#default.verifyURL=http://www.signaturpruefung.gv.at + +# Standard Alternativer Text fuer den Signaturblock (WAI) (globale Einstellung) + +#default.sigLogoAltText=Abgebildet ist eine Standard-Signaturbildmarke. + +#register Verificators + +default.verifier.01=at.gv.egiz.pdfas.sigs.pades.PAdESVerifier + +#default.verifier.02=at.gv.egiz.pdfas.sigs.pkcs7detached.PKCS7DetachedVerifier + +#Enable background color detection +#sigblock.placement.bgcolor.detection.enabled=true +#sigblock.placement.debug.file=/home/user/temp/debugImg.png +#runtime.backend=PDFBOX_2_BACKEND diff --git a/pdf-as-cli/src/test/resources/pdfas-config/cfg/config.properties b/pdf-as-cli/src/test/resources/pdfas-config/cfg/config.properties new file mode 100644 index 00000000..74e328a9 --- /dev/null +++ b/pdf-as-cli/src/test/resources/pdfas-config/cfg/config.properties @@ -0,0 +1,108 @@ +###################################################################### +# PDF-AS Konfiguration +# +# Diese Datei enthaelt empfohlene Einstellungen fuer PDF-AS. +# +# Hinweis: Hier werden die wichtigsten Einstellungsmoeglichkeiten +# angeboten. Eine fortgeschrittene Konfiguration ist ueber die Datei +# advancedconfig.properties moeglich, die mit der Include-Anweisung: +# include.advancedconfig = advancedconfig.properties eingebunden +# eingebunden werden kann. +###################################################################### + + + +################## +# Signaturdienste +# Hier werden die verwendbaren Signaturdienste (Lokale BKU, Online BKU, Handy-Signatur, MOA) +# angefuehrt. + +## +# Lokal installierte Buergerkartensoftware +# ohne SSL: http://127.0.0.1:3495/http-security-layer-request +# mit SSL : https://127.0.0.1:3496/https-security-layer-request +# Signatur +bku.sign.url=http://127.0.0.1:3495/http-security-layer-request +# Verifikation +bku.verify.url=http://127.0.0.1:3495/http-security-layer-request + + +## +# Handy-Signatur +# Signaturservice URL +mobile.sign.url=https://www.handy-signatur.at/mobile/https-security-layer-request/default.aspx + +## +# MOA Signatur +# Signaturservice URL +moa.sign.url=http://localhost:8080/moa-spss/services/SignatureCreation +# Identifier fuer den zu verwendenden serverseitig hinterlegten Signaturschluessel. +# Siehe auch http://joinup.ec.europa.eu/site/moa-idspss/moa-spss-1.5.1/doc/handbook/config/config.html#konfigurationsparameter_ss +moa.sign.KeyIdentifier=KG_allgemein +moa.sign.Certificate=test.cer + +## +# MOA Verifikation +# Verifikationsservice URL +moa.verify.url=http://localhost:8080/moa-spss/services/SignatureVerification +# Identifier des zu verwendenden Vertrauensprofils fuer die Signaturpruefung. +# Siehe auch http://joinup.ec.europa.eu/site/moa-idspss/moa-spss-1.5.1/doc/handbook/config/config.html#konfigurationsparameter_sp_certificatevalidation_pathvalidation_trustprofile +moa.verify.TrustProfileID=SecureSignature + +# Bietet die Moeglichkeit, eine fortgeschrittene Konfiguration einzubinden. +include.advancedconfig = advancedconfig.properties + +#sigblockparameter.key.regex=^([A-za-z]){1,20}$ +#sigblockparameter.value.regex=^([\\p{Print}]){1,100}$ + + +##################################################################################################### +# Unterstuetzte Signaturprofile +# Hinweise zum Include-Mechanismus: +# - Pfade sind relativ zu dieser Konfigurationsdatei zu setzen. +# - Es koennen Wildcards verwendet werden. +# z.B. include = profiles/*AMTSSIGNATURBLOCK*.properties +# - Bei mehrfachen Include-Anweisungen ist darauf zu achten, dass die Include-Keys eindeutig sind. +# Dazu sollte ein beliebiger Bezeichner an "include." angehaengt werden. +# z.B. include.standard = profiles/SIGNATURBLOCK*.properties +# include.amtssignatur = profiles/*AMTSSIGNATUR*.properties +# - Include-Keys werden lexikografisch sortiert, bevor die Include-Anweisungen ausgefuehrt werden. +# Dadurch kann eine Reihenfolge der Includes vorgegeben werden. +# +# Anm.: profiles/SIGNATURBLOCK_DE.properties enthaelt Erlaeuterungen in Hinblick auf die +# Konfiguration einzelner Profile. + +# Standard-Profile +include.01 = profiles/*.properties +#include.02 = profiles/BASE_LOGO.properties +#include.02 = profiles/SIGNATURBLOCK_DE.properties +#include.03 = profiles/SIGNATURBLOCK_DE_NOTE.properties +#include.04 = profiles/SIGNATURBLOCK_DE_PDFA.properties +#include.05 = profiles/SIGNATURBLOCK_DE_PDFA_NOTE.properties +#include.06 = profiles/SIGNATURBLOCK_EN.properties +#include.07 = profiles/SIGNATURBLOCK_EN_NOTE.properties +#include.08 = profiles/SIGNATURBLOCK_EN_PDFA.properties +#include.09 = profiles/SIGNATURBLOCK_EN_PDFA_NOTE.properties +#include.10 = profiles/SIGNATURBLOCK_MINIMAL_DE.properties +#include.12 = profiles/SIGNATURBLOCK_SMALL_DE.properties +#include.13 = profiles/SIGNATURBLOCK_SMALL_DE_NOTE.properties +#include.14 = profiles/SIGNATURBLOCK_SMALL_EN.properties +#include.15 = profiles/SIGNATURBLOCK_SMALL_EN_NOTE.properties + +# Amtssignatur-Profile +#include.16 = profiles/AMTSSIGNATURBLOCK_DE.properties +#include.17 = profiles/AMTSSIGNATURBLOCK_EN.properties +#include.18 = profiles/AMTSSIGNATURBLOCK_DE_SMALL.properties +#include.19 = profiles/AMTSSIGNATURBLOCK_EN_SMALL.properties + + +# BAIK-Profile +#include.20 = profiles/BAIK_ARCHIV_SIGNATUR.properties +#include.21 = profiles/BAIK_URKUNDE_SIGNATUR.properties + +#include.22 = profiles/justizsignatur.properties + +# Legt das Standard-Signaturprofil fest +sig_obj.type.default=SIGNATURBLOCK_SMALL_DE_NOTE + + diff --git a/pdf-as-cli/src/test/resources/pdfas-config/cfg/log4j.properties b/pdf-as-cli/src/test/resources/pdfas-config/cfg/log4j.properties new file mode 100644 index 00000000..9cc9f155 --- /dev/null +++ b/pdf-as-cli/src/test/resources/pdfas-config/cfg/log4j.properties @@ -0,0 +1,23 @@ +log4j.rootLogger = INFO, CONSOLE +#, ROLLINGFILE + +# DETAIL LEVELS +log4j.logger.at.gv.egiz = INFO +log4j.logger.at.knowcenter = INFO +# Statistical logger +#log4j.logger.statistic = INFO, STATISTIC + +# CONSOLE +log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppender +log4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayout +log4j.appender.CONSOLE.layout.ConversionPattern = %-4r [%t] %-5p %c %x - %m%n +log4j.appender.CONSOLE.threshold = DEBUG +log4j.appender.CONSOLE.Target = System.out + +# ROLLINGFILE +#log4j.appender.ROLLINGFILE = org.apache.log4j.RollingFileAppender +#log4j.appender.ROLLINGFILE.File = ${catalina.base}/logs/pdf-as.log +#log4j.appender.ROLLINGFILE.MaxFileSize = 10240KB +#log4j.appender.ROLLINGFILE.MaxBackupIndex = 1 +#log4j.appender.ROLLINGFILE.layout = org.apache.log4j.PatternLayout +#log4j.appender.ROLLINGFILE.layout.ConversionPattern = [%-5p@%d{dd.MM.yyyy HH:mm:ss}] %c:%M:%L - %m%n diff --git a/pdf-as-cli/src/test/resources/pdfas-config/cfg/logback.xml b/pdf-as-cli/src/test/resources/pdfas-config/cfg/logback.xml new file mode 100644 index 00000000..3665f8f0 --- /dev/null +++ b/pdf-as-cli/src/test/resources/pdfas-config/cfg/logback.xml @@ -0,0 +1,16 @@ + + + + + + %date{ISO8601} [%thread] %-5level %class - %msg%n + + + + + + + + + + \ No newline at end of file diff --git a/pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles.zip b/pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles.zip new file mode 100644 index 00000000..c520ad43 Binary files /dev/null and b/pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles.zip differ diff --git a/pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles/BASE_LOGO.properties b/pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles/BASE_LOGO.properties new file mode 100644 index 00000000..8234d4d1 --- /dev/null +++ b/pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles/BASE_LOGO.properties @@ -0,0 +1,28 @@ +################################################################################################### +# PROFIL: Signature block with logo + +sig_obj.types.BASE_LOGO=on + +sig_obj.BASE_LOGO.description= Signature block with logo +sig_obj.BASE_LOGO.key.SIG_META=Pr\u00fcfinformation + +sig_obj.BASE_LOGO.pos=w:230.0;f:80 +sig_obj.BASE_LOGO.adobeSignFieldValue=PDF-AS Signatur +sig_obj.BASE_LOGO.adobeSignReasonValue=Signaturpruefung unter http://www.signaturpruefung.gv.at +sig_obj.BASE_LOGO.verifyURL=http://www.signaturpruefung.gv.at + +sig_obj.BASE_LOGO.value.SIG_LABEL=./images/signatur-logo_de.png +sig_obj.BASE_LOGO.table.main.Style.imagescaletofit=65.0;65.0 + +# WAI +sig_obj.BASE_LOGO.sigLogoAltText=Abgebildet ist eine Standard-Signaturbildmarke. + +#---------------------- MAIN TABLE ------------------------- +sig_obj.BASE_LOGO.table.main.1=SIG_LABEL-i + +sig_obj.BASE_LOGO.table.main.Style.bgcolor=255 255 255 +sig_obj.BASE_LOGO.table.main.Style.border=0 +sig_obj.BASE_LOGO.table.main.Style.halign=center +sig_obj.BASE_LOGO.table.main.Style.valign=middle +sig_obj.BASE_LOGO.table.main.Style.font=TTF:DejaVuSansCondensed-Bold.ttf,5 +sig_obj.BASE_LOGO.table.main.Style.valuefont=TTF:DejaVuSansMono.ttf,5 \ No newline at end of file diff --git a/pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles/BASE_NORMAL.properties b/pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles/BASE_NORMAL.properties new file mode 100644 index 00000000..b72af10a --- /dev/null +++ b/pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles/BASE_NORMAL.properties @@ -0,0 +1,145 @@ + +################################################################################################### +# PROFIL: Basissignatur Deutsch + +# Kurzbeschreibung +sig_obj.BASE_NORMAL.description=Basissignatur Deutsch + +# Aktiviert ("on") bzw. deaktiviert ("off") dieses Profil. +# "verify_only" beschraenkt das Profil auf Signaturpruefung, d.h. es kann nicht zum Erstellen von +# Signaturen verwendet werden. +# "sign_only" beschraenkt das Profil insofern, dass es nur noch zum Signieren, nicht aber +# zum Pruefen verwendet werden kann. +sig_obj.types.BASE_NORMAL=on + +# Festlegung der einzelner Bezeichnungen im Signaturblock. +sig_obj.BASE_NORMAL.key.SIG_SUBJECT=Unterzeichner +sig_obj.BASE_NORMAL.key.SIG_DATE=Datum/Zeit-UTC +sig_obj.BASE_NORMAL.key.SIG_ISSUER=Aussteller-Zertifikat +sig_obj.BASE_NORMAL.key.SIG_NUMBER=Serien-Nr. +sig_obj.BASE_NORMAL.key.SIG_META=Pr\u00fcfinformation +sig_obj.BASE_NORMAL.key.SIG_NOTE=Hinweis + + +# Festlegung des Unterzeichnernamens. +# Es moeglich, den Namen des Signators dynamisch aus Informationen des verwendeten Zertifikats +# zusammenzusetzen. Konkret kann auf die einzelnen RDN Teile des Issuer DN und des Subject DN +# des Signaturzertifikats wie im folgenden Beispiel illustriert zugegriffen werden: +# +# (1) sig_obj.PROFIL.value.SIG_SUBJECT= ${subjectDieses mit einer qualifizierten elektronischen Signatur versehene Dokument hat gem\u00e4\u00df Art. 25 Abs. 2 der Verordnung (EU) Nr. 910/2014 vom 23. Juli 2014 (\"eIDAS-VO\") die gleiche Rechtswirkung wie ein handschriftlich unterschriebenes Dokument..CN}${subject.O != null ? ("\n" + subject.O) : ""} +# (2) sig_obj.PROFIL.value.SIG_SUBJECT= ${subject.T \!\= null ? (subject.T + " ") \: ""}${subject.CN} +# +# Beispiel (1) gibt die Organisation des Unterzeichners an, Beispiel (2) Titel und Name. +# +# Die Notation ${..} ermoeglicht die dynamische Auswertung eines Ausdrucks. Verfuegbar sind "subject" +# und "issuer" und die im Zertifikat-DN vorhandenen RDNs. +# +# Achtung: +# Fuer die binaere Signatur muss die maximale Anzahl zu erwartender Zeichen in der globalen Einstellung +# defaults.phlength.SIG_SUBJECT=... +# bzw. profileweise via +# sig_obj.PROFIL.phlength.SIG_SUBJECT=... +# festgelegt werden. +sig_obj.BASE_NORMAL.value.SIG_SUBJECT=${subject.T != null ? (subject.T + " ") : ""}${subject.CN} +sig_obj.BASE_NORMAL.value.SIG_ISSUER=${issuer.T != null ? (issuer.T + " ") : ""}${issuer.CN} +sig_obj.BASE_NORMAL.value.SIG_NUMBER=${sn} +sig_obj.BASE_NORMAL.value.SIG_META=Informationen zur Pr\u00FCfung der elektronischen Signatur finden Sie unter: https://www.signaturpruefung.gv.at +sig_obj.BASE_NORMAL.value.SIG_NOTE=Dieses mit einer qualifizierten elektronischen Signatur versehene Dokument hat gem\u00e4\u00df Art. 25 Abs. 2 der Verordnung (EU) Nr. 910/2014 vom 23. Juli 2014 (\"eIDAS-VO\") die gleiche Rechtswirkung wie ein handschriftlich unterschriebenes Dokument. +## Profilspezifische Festlegung der Position des Signaturblocks +# +# sig_obj.PROFILE.pos=[p:["auto"|"new"|pagenumber];][x:["auto"|floatvalue];][y:["auto"|floatvalue];][w:["auto"|width_floatvalue];][f:footerheight_floatvalue] +# z.B. +# sig_obj.PROFILE.pos=p:1;x:40.0;y:800.0;w:400.0;f:80 +sig_obj.BASE_NORMAL.pos=f:80 + +sig_obj.BASE_NORMAL.adobeSignFieldValue=PDF-AS Signatur +# Text, der im Adobe Reader unter "Reason" angezeigt wird. +sig_obj.BASE_NORMAL.adobeSignReasonValue=Signaturpruefung unter http://www.signaturpruefung.gv.at + +# URL fuer die Signaturpruefung durch das Adobe Acrobat Professional PDF-AS Plugin. +#sig_obj.SIGNATURBLOCK_DE.verifyURL=http://www.signaturpruefung.gv.at + +# WAI +sig_obj.BASE_NORMAL.sigLogoAltText=Abgebildet ist eine Standard-Signaturbildmarke. + +# Pruefhinweis im Signaturblock +#sig_obj.SIGNATURBLOCK_DE.value.SIG_META=Signaturpruefung unter: http://www.signaturpruefung.gv.at + +# Signaturlogo im Signaturblock +sig_obj.BASE_NORMAL.value.SIG_LABEL=./images/signatur-logo_de.png + + +#---------------------- MAIN TABLE ------------------------- +sig_obj.BASE_NORMAL.table.main.1=SIG_LABEL-i|TABLE-info +#sig_obj.BASE_NORMAL.table.main.2=SIG_NOTE-cv + +sig_obj.BASE_NORMAL.table.main.ColsWidth=1 6 +sig_obj.BASE_NORMAL.table.main.Style.bgcolor=255 255 255 +sig_obj.BASE_NORMAL.table.main.Style.padding=4 +sig_obj.BASE_NORMAL.table.main.Style.border=0.1 + + +## Horizontale Ausrichtung der Eintraege im Signaturblock. +# +# sig_obj.PROFILE.table.TABLE_NAME.Style.halign=[left|center|right] +# sig_obj.PROFILE.table.TABLE_NAME.Style.valuehalign=[left|lineCenter|center|right] +# sig_obj.PROFILE.table.TABLE_NAME.Style.imagehalign=[left|center|right] +sig_obj.BASE_NORMAL.table.main.Style.halign=right + + +## Vertikale Ausrichtung der Eintraege im Signaturblock. +# +# sig_obj.PROFILE.table.TABLE_NAME.Style.valign=[bottom|middle|top] +# sig_obj.PROFILE.table.TABLE_NAME.Style.valuevalign=[bottom|middle|top] +# sig_obj.PROFILE.table.TABLE_NAME.Style.imagevalign=[bottom|middle|top] +sig_obj.BASE_NORMAL.table.main.Style.valuehalign=left +sig_obj.BASE_NORMAL.table.main.Style.valign=top +sig_obj.BASE_NORMAL.table.main.Style.imagevalign=middle + + +## Schriftart +# +# sig_obj.PROFIL.table.TABLE_NAME.Style.font=FACE,WEIGHT,STYLE +# Setzt die Schriftart fuer die gesamte Tabelle TABLE_NAME. +# +# sig_obj.PROFIL.table.TABLE_NAME.Style.valuefont=FACE,WEIGHT,STYLE +# Setzt die Schriftart ausschliesslich fuer die Werte-Zellen der Tabelle TABLE_NAME. +# +# FACE: HELVETICA | TIMES_ROMAN | COURIER +# WEIGHT: float value +# STYLE: NORMAL | BOLD | ITALIC | BOLDITALIC | UNDERLINE | STRIKETHRU +# +# z.B. sig_obj.SIGNATURBLOCK_DE.table.main.Style.valuefont=COURIER,8,NORMAL +sig_obj.BASE_NORMAL.table.main.Style.font=TTF:DejaVuSansCondensed-Bold.ttf,8 +sig_obj.BASE_NORMAL.table.main.Style.valuefont=TTF:DejaVuSansMono.ttf,8 + +#---------------------- INFO TABLE ------------------------- +sig_obj.BASE_NORMAL.table.info.ColsWidth=1 4 +sig_obj.BASE_NORMAL.table.info.1=SIG_SUBJECT-cv +sig_obj.BASE_NORMAL.table.info.2=SIG_DATE-cv +#sig_obj.BASE_NORMAL.table.info.3=SIG_ISSUER-cv +#sig_obj.BASE_NORMAL.table.info.4=SIG_NUMBER-cv +sig_obj.BASE_NORMAL.table.info.3=SIG_META-cv + +## Signaturkennzeichnung (fuer Adobe Acrobat) +# +# Ein-/Ausschalten der Signaturkennung: +# sig_obj.PROFILE.adobeSignEnabled=true|false (default: true) +# +# Name fuer die Signaturkennzeichnung (binaer) +# sig_obj.PROFILE.adobeSignText.binary=PDF-AS +# +# Name fuer die Signaturkennzeichnung (binaer) +# sig_obj.PROFILE.adobeSignText.textual=PDF-AS +# +# Name fuer die PDF-Signatur +# sig_obj.PROFILE.adobeSignFieldValue=PDF-AS Signatur +# +# "Reason"-Feld der jeweiligen Signatur +# sig_obj.PROFILE.adobeSignReasonValue=Informationen zur Pr\u00FCfung finden Sie unter http://www.signaturpruefung.gv.at +# +# Prueflink fuer die Adobe Signaturkennzeichnung (nur relevant falls Adobe Plugin fuer Pruefung verwendet wird) +# sig_obj.PROFILE.verifyURL=http://www.signaturpruefung.gv.at +# +# Alternativer Text fuer den Signaturblock (WAI) (globale Einstellung) +# sig_obj.PROFILE.sigLogoAltText=Abgebildet ist eine Standard-Signaturbildmarke. diff --git a/pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles/BASE_NORMAL_NOTE.properties b/pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles/BASE_NORMAL_NOTE.properties new file mode 100644 index 00000000..3d2af547 --- /dev/null +++ b/pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles/BASE_NORMAL_NOTE.properties @@ -0,0 +1,10 @@ + +################################################################################################### +# PROFIL: Basissignatur Deutsch, mit Hinweistext + +# Kurzbeschreibung +sig_obj.BASE_NORMAL_NOTE.description=Basissignatur Deutsch, mit Hinweistext +sig_obj.BASE_NORMAL_NOTE.parent=BASE_NORMAL +sig_obj.types.BASE_NORMAL_NOTE=on + +sig_obj.BASE_NORMAL_NOTE.table.main.2=SIG_NOTE-cv diff --git a/pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles/SIGNATURBLOCK_DE.properties b/pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles/SIGNATURBLOCK_DE.properties new file mode 100644 index 00000000..242ef793 --- /dev/null +++ b/pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles/SIGNATURBLOCK_DE.properties @@ -0,0 +1,8 @@ + +################################################################################################### +# PROFIL: Standardsignatur Deutsch + +# Kurzbeschreibung +sig_obj.SIGNATURBLOCK_DE.description=Standardsignatur Deutsch +sig_obj.SIGNATURBLOCK_DE.parent=BASE_NORMAL +sig_obj.types.SIGNATURBLOCK_DE=on \ No newline at end of file diff --git a/pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles/SIGNATURBLOCK_DE_NOTE.properties b/pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles/SIGNATURBLOCK_DE_NOTE.properties new file mode 100644 index 00000000..b6309031 --- /dev/null +++ b/pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles/SIGNATURBLOCK_DE_NOTE.properties @@ -0,0 +1,9 @@ +################################################################################################### +# PROFIL: Standardsignatur Deutsch, mit Hinweistext + +sig_obj.SIGNATURBLOCK_DE_NOTE.description=Standardsignatur Deutsch, mit Hinweistext +sig_obj.SIGNATURBLOCK_DE_NOTE.parent=BASE_NORMAL_NOTE +sig_obj.types.SIGNATURBLOCK_DE_NOTE=on + +#---------------------- INFO TABLE ------------------------- +sig_obj.SIGNATURBLOCK_DE_NOTE.table.info.ColsWidth=1 5 \ No newline at end of file diff --git a/pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles/SIGNATURBLOCK_DE_NOTE_DYNAMIC.properties b/pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles/SIGNATURBLOCK_DE_NOTE_DYNAMIC.properties new file mode 100644 index 00000000..fdf4a6c2 --- /dev/null +++ b/pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles/SIGNATURBLOCK_DE_NOTE_DYNAMIC.properties @@ -0,0 +1,16 @@ +################################################################################################### +# PROFIL: Standardsignatur Deutsch, mit Hinweistext + +sig_obj.SIGNATURBLOCK_DE_NOTE_DYNAMIC.description=Standardsignatur Deutsch, mit Hinweistext +sig_obj.SIGNATURBLOCK_DE_NOTE_DYNAMIC.parent=BASE_NORMAL_NOTE +sig_obj.types.SIGNATURBLOCK_DE_NOTE_DYNAMIC=on + + +sig_obj.SIGNATURBLOCK_DE_NOTE_DYNAMIC.value.SIG_SUBJECT=${sbp.subject} test ${sbp.foo} 123 ${subject.T != null ? \ + (subject.T + " a "+sbp.subject) : "c "+sbp.subject+" "}${subject.CN} +sig_obj.SIGNATURBLOCK_DE_NOTE_DYNAMIC.value.SIG_ISSUER=${issuer.T != null ? (issuer.T + " ") : ""}${issuer.CN} +sig_obj.SIGNATURBLOCK_DE_NOTE_DYNAMIC.value.SIG_NUMBER=${sn} +sig_obj.SIGNATURBLOCK_DE_NOTE_DYNAMIC.value.SIG_META=Informationen zur Pr\u00FCfung der elektronischen Signatur finden Sie unter: https://www.signaturpruefung.gv.at + +#---------------------- INFO TABLE ------------------------- +sig_obj.SIGNATURBLOCK_DE_NOTE_DYNAMIC.table.info.ColsWidth=1 5 \ No newline at end of file diff --git a/pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles/SIGNATURBLOCK_DE_NOTE_DYNAMIC_WITH_TEXT_AFTER_VARIABLE.properties b/pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles/SIGNATURBLOCK_DE_NOTE_DYNAMIC_WITH_TEXT_AFTER_VARIABLE.properties new file mode 100644 index 00000000..bf904b1c --- /dev/null +++ b/pdf-as-cli/src/test/resources/pdfas-config/cfg/profiles/SIGNATURBLOCK_DE_NOTE_DYNAMIC_WITH_TEXT_AFTER_VARIABLE.properties @@ -0,0 +1,16 @@ +################################################################################################### +# PROFIL: Standardsignatur Deutsch, mit Hinweistext + +sig_obj.SIGNATURBLOCK_DE_NOTE_DYNAMIC_WITH_TEXT_AFTER_VARIABLE.description=Standardsignatur Deutsch, mit Hinweistext +sig_obj.SIGNATURBLOCK_DE_NOTE_DYNAMIC_WITH_TEXT_AFTER_VARIABLE.parent=BASE_NORMAL_NOTE +sig_obj.types.SIGNATURBLOCK_DE_NOTE_DYNAMIC_WITH_TEXT_AFTER_VARIABLE=on + + +sig_obj.SIGNATURBLOCK_DE_NOTE_DYNAMIC_WITH_TEXT_AFTER_VARIABLE.value.SIG_SUBJECT=${subject.T != null ? (subject.T + " ") : ""}${subject.CN} text after variable +sig_obj.SIGNATURBLOCK_DE_NOTE_DYNAMIC_WITH_TEXT_AFTER_VARIABLE.value.SIG_ISSUER=${issuer.T != null ? (issuer.T + " ") : ""}${issuer.CN} +sig_obj.SIGNATURBLOCK_DE_NOTE_DYNAMIC_WITH_TEXT_AFTER_VARIABLE.value.SIG_NUMBER=${sn} +sig_obj.SIGNATURBLOCK_DE_NOTE_DYNAMIC_WITH_TEXT_AFTER_VARIABLE.value.SIG_META=Informationen zur Pr\u00FCfung der \ + elektronischen Signatur finden Sie unter: https://www.signaturpruefung.gv.at + +#---------------------- INFO TABLE ------------------------- +sig_obj.SIGNATURBLOCK_DE_NOTE_DYNAMIC_WITH_TEXT_AFTER_VARIABLE.table.info.ColsWidth=1 5 \ No newline at end of file diff --git a/pdf-as-cli/src/test/resources/pdfas-config/fonts/DejaVuSansCondensed-Bold.ttf b/pdf-as-cli/src/test/resources/pdfas-config/fonts/DejaVuSansCondensed-Bold.ttf new file mode 100644 index 00000000..2364a473 Binary files /dev/null and b/pdf-as-cli/src/test/resources/pdfas-config/fonts/DejaVuSansCondensed-Bold.ttf differ diff --git a/pdf-as-cli/src/test/resources/pdfas-config/fonts/DejaVuSansCondensed.ttf b/pdf-as-cli/src/test/resources/pdfas-config/fonts/DejaVuSansCondensed.ttf new file mode 100644 index 00000000..94a9b01c Binary files /dev/null and b/pdf-as-cli/src/test/resources/pdfas-config/fonts/DejaVuSansCondensed.ttf differ diff --git a/pdf-as-cli/src/test/resources/pdfas-config/fonts/DejaVuSansMono.ttf b/pdf-as-cli/src/test/resources/pdfas-config/fonts/DejaVuSansMono.ttf new file mode 100644 index 00000000..a96ac6f4 Binary files /dev/null and b/pdf-as-cli/src/test/resources/pdfas-config/fonts/DejaVuSansMono.ttf differ diff --git a/pdf-as-cli/src/test/resources/pdfas-config/fonts/arial.ttf b/pdf-as-cli/src/test/resources/pdfas-config/fonts/arial.ttf new file mode 100644 index 00000000..12cc15c8 Binary files /dev/null and b/pdf-as-cli/src/test/resources/pdfas-config/fonts/arial.ttf differ diff --git a/pdf-as-cli/src/test/resources/pdfas-config/images/Baik_Archiv.gif b/pdf-as-cli/src/test/resources/pdfas-config/images/Baik_Archiv.gif new file mode 100644 index 00000000..3f2e6cfc Binary files /dev/null and b/pdf-as-cli/src/test/resources/pdfas-config/images/Baik_Archiv.gif differ diff --git a/pdf-as-cli/src/test/resources/pdfas-config/images/Baik_Urkunde.gif b/pdf-as-cli/src/test/resources/pdfas-config/images/Baik_Urkunde.gif new file mode 100644 index 00000000..502a0c4c Binary files /dev/null and b/pdf-as-cli/src/test/resources/pdfas-config/images/Baik_Urkunde.gif differ diff --git a/pdf-as-cli/src/test/resources/pdfas-config/images/amtsignatur-logo_demo.png b/pdf-as-cli/src/test/resources/pdfas-config/images/amtsignatur-logo_demo.png new file mode 100644 index 00000000..0e9a6b06 Binary files /dev/null and b/pdf-as-cli/src/test/resources/pdfas-config/images/amtsignatur-logo_demo.png differ diff --git a/pdf-as-cli/src/test/resources/pdfas-config/images/justizsignatur_neu.gif b/pdf-as-cli/src/test/resources/pdfas-config/images/justizsignatur_neu.gif new file mode 100644 index 00000000..99debd3e Binary files /dev/null and b/pdf-as-cli/src/test/resources/pdfas-config/images/justizsignatur_neu.gif differ diff --git a/pdf-as-cli/src/test/resources/pdfas-config/images/seal-logo_de.png b/pdf-as-cli/src/test/resources/pdfas-config/images/seal-logo_de.png new file mode 100644 index 00000000..6032cb55 Binary files /dev/null and b/pdf-as-cli/src/test/resources/pdfas-config/images/seal-logo_de.png differ diff --git a/pdf-as-cli/src/test/resources/pdfas-config/images/seal-logo_en.png b/pdf-as-cli/src/test/resources/pdfas-config/images/seal-logo_en.png new file mode 100644 index 00000000..bc5c37c7 Binary files /dev/null and b/pdf-as-cli/src/test/resources/pdfas-config/images/seal-logo_en.png differ diff --git a/pdf-as-cli/src/test/resources/pdfas-config/images/signatur-logo_de.png b/pdf-as-cli/src/test/resources/pdfas-config/images/signatur-logo_de.png new file mode 100644 index 00000000..988c0793 Binary files /dev/null and b/pdf-as-cli/src/test/resources/pdfas-config/images/signatur-logo_de.png differ diff --git a/pdf-as-cli/src/test/resources/pdfas-config/images/signatur-logo_de_highest_resolution.png b/pdf-as-cli/src/test/resources/pdfas-config/images/signatur-logo_de_highest_resolution.png new file mode 100644 index 00000000..c9a2da9b Binary files /dev/null and b/pdf-as-cli/src/test/resources/pdfas-config/images/signatur-logo_de_highest_resolution.png differ diff --git a/pdf-as-cli/src/test/resources/pdfas-config/images/signatur-logo_en.png b/pdf-as-cli/src/test/resources/pdfas-config/images/signatur-logo_en.png new file mode 100644 index 00000000..682d3833 Binary files /dev/null and b/pdf-as-cli/src/test/resources/pdfas-config/images/signatur-logo_en.png differ diff --git a/pdf-as-cli/src/test/resources/pdfas-config/images/signatur-logo_en_highest_resolution.png b/pdf-as-cli/src/test/resources/pdfas-config/images/signatur-logo_en_highest_resolution.png new file mode 100644 index 00000000..59a0feba Binary files /dev/null and b/pdf-as-cli/src/test/resources/pdfas-config/images/signatur-logo_en_highest_resolution.png differ diff --git a/pdf-as-cli/src/test/resources/pdfas-config/licenses/adobe/AFM_License.html b/pdf-as-cli/src/test/resources/pdfas-config/licenses/adobe/AFM_License.html new file mode 100644 index 00000000..d4d7e8aa --- /dev/null +++ b/pdf-as-cli/src/test/resources/pdfas-config/licenses/adobe/AFM_License.html @@ -0,0 +1 @@ + Core 14 AFM Files - ReadMe or
This file and the 14 PostScript(R) AFM files it accompanies may be used, copied, and distributed for any purpose and without charge, with or without modification, provided that all copyright notices are retained; that the AFM files are not distributed without this file; that all modifications to this file or any of the AFM files are prominently noted in the modified file(s); and that this paragraph is not modified. Adobe Systems has no responsibility or obligation to support the use of the AFM files. Col
\ No newline at end of file diff --git a/pdf-as-cli/src/test/resources/pdfas-config/licenses/ant/LICENSE b/pdf-as-cli/src/test/resources/pdfas-config/licenses/ant/LICENSE new file mode 100644 index 00000000..8b5861db --- /dev/null +++ b/pdf-as-cli/src/test/resources/pdfas-config/licenses/ant/LICENSE @@ -0,0 +1,203 @@ +/* + * Apache License + * Version 2.0, January 2004 + * http://www.apache.org/licenses/ + * + * TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + * + * 1. Definitions. + * + * "License" shall mean the terms and conditions for use, reproduction, + * and distribution as defined by Sections 1 through 9 of this document. + * + * "Licensor" shall mean the copyright owner or entity authorized by + * the copyright owner that is granting the License. + * + * "Legal Entity" shall mean the union of the acting entity and all + * other entities that control, are controlled by, or are under common + * control with that entity. For the purposes of this definition, + * "control" means (i) the power, direct or indirect, to cause the + * direction or management of such entity, whether by contract or + * otherwise, or (ii) ownership of fifty percent (50%) or more of the + * outstanding shares, or (iii) beneficial ownership of such entity. + * + * "You" (or "Your") shall mean an individual or Legal Entity + * exercising permissions granted by this License. + * + * "Source" form shall mean the preferred form for making modifications, + * including but not limited to software source code, documentation + * source, and configuration files. + * + * "Object" form shall mean any form resulting from mechanical + * transformation or translation of a Source form, including but + * not limited to compiled object code, generated documentation, + * and conversions to other media types. + * + * "Work" shall mean the work of authorship, whether in Source or + * Object form, made available under the License, as indicated by a + * copyright notice that is included in or attached to the work + * (an example is provided in the Appendix below). + * + * "Derivative Works" shall mean any work, whether in Source or Object + * form, that is based on (or derived from) the Work and for which the + * editorial revisions, annotations, elaborations, or other modifications + * represent, as a whole, an original work of authorship. For the purposes + * of this License, Derivative Works shall not include works that remain + * separable from, or merely link (or bind by name) to the interfaces of, + * the Work and Derivative Works thereof. + * + * "Contribution" shall mean any work of authorship, including + * the original version of the Work and any modifications or additions + * to that Work or Derivative Works thereof, that is intentionally + * submitted to Licensor for inclusion in the Work by the copyright owner + * or by an individual or Legal Entity authorized to submit on behalf of + * the copyright owner. For the purposes of this definition, "submitted" + * means any form of electronic, verbal, or written communication sent + * to the Licensor or its representatives, including but not limited to + * communication on electronic mailing lists, source code control systems, + * and issue tracking systems that are managed by, or on behalf of, the + * Licensor for the purpose of discussing and improving the Work, but + * excluding communication that is conspicuously marked or otherwise + * designated in writing by the copyright owner as "Not a Contribution." + * + * "Contributor" shall mean Licensor and any individual or Legal Entity + * on behalf of whom a Contribution has been received by Licensor and + * subsequently incorporated within the Work. + * + * 2. Grant of Copyright License. Subject to the terms and conditions of + * this License, each Contributor hereby grants to You a perpetual, + * worldwide, non-exclusive, no-charge, royalty-free, irrevocable + * copyright license to reproduce, prepare Derivative Works of, + * publicly display, publicly perform, sublicense, and distribute the + * Work and such Derivative Works in Source or Object form. + * + * 3. Grant of Patent License. Subject to the terms and conditions of + * this License, each Contributor hereby grants to You a perpetual, + * worldwide, non-exclusive, no-charge, royalty-free, irrevocable + * (except as stated in this section) patent license to make, have made, + * use, offer to sell, sell, import, and otherwise transfer the Work, + * where such license applies only to those patent claims licensable + * by such Contributor that are necessarily infringed by their + * Contribution(s) alone or by combination of their Contribution(s) + * with the Work to which such Contribution(s) was submitted. If You + * institute patent litigation against any entity (including a + * cross-claim or counterclaim in a lawsuit) alleging that the Work + * or a Contribution incorporated within the Work constitutes direct + * or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate + * as of the date such litigation is filed. + * + * 4. Redistribution. You may reproduce and distribute copies of the + * Work or Derivative Works thereof in any medium, with or without + * modifications, and in Source or Object form, provided that You + * meet the following conditions: + * + * (a) You must give any other recipients of the Work or + * Derivative Works a copy of this License; and + * + * (b) You must cause any modified files to carry prominent notices + * stating that You changed the files; and + * + * (c) You must retain, in the Source form of any Derivative Works + * that You distribute, all copyright, patent, trademark, and + * attribution notices from the Source form of the Work, + * excluding those notices that do not pertain to any part of + * the Derivative Works; and + * + * (d) If the Work includes a "NOTICE" text file as part of its + * distribution, then any Derivative Works that You distribute must + * include a readable copy of the attribution notices contained + * within such NOTICE file, excluding those notices that do not + * pertain to any part of the Derivative Works, in at least one + * of the following places: within a NOTICE text file distributed + * as part of the Derivative Works; within the Source form or + * documentation, if provided along with the Derivative Works; or, + * within a display generated by the Derivative Works, if and + * wherever such third-party notices normally appear. The contents + * of the NOTICE file are for informational purposes only and + * do not modify the License. You may add Your own attribution + * notices within Derivative Works that You distribute, alongside + * or as an addendum to the NOTICE text from the Work, provided + * that such additional attribution notices cannot be construed + * as modifying the License. + * + * You may add Your own copyright statement to Your modifications and + * may provide additional or different license terms and conditions + * for use, reproduction, or distribution of Your modifications, or + * for any such Derivative Works as a whole, provided Your use, + * reproduction, and distribution of the Work otherwise complies with + * the conditions stated in this License. + * + * 5. Submission of Contributions. Unless You explicitly state otherwise, + * any Contribution intentionally submitted for inclusion in the Work + * by You to the Licensor shall be under the terms and conditions of + * this License, without any additional terms or conditions. + * Notwithstanding the above, nothing herein shall supersede or modify + * the terms of any separate license agreement you may have executed + * with Licensor regarding such Contributions. + * + * 6. Trademarks. This License does not grant permission to use the trade + * names, trademarks, service marks, or product names of the Licensor, + * except as required for reasonable and customary use in describing the + * origin of the Work and reproducing the content of the NOTICE file. + * + * 7. Disclaimer of Warranty. Unless required by applicable law or + * agreed to in writing, Licensor provides the Work (and each + * Contributor provides its Contributions) on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied, including, without limitation, any warranties or conditions + * of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + * PARTICULAR PURPOSE. You are solely responsible for determining the + * appropriateness of using or redistributing the Work and assume any + * risks associated with Your exercise of permissions under this License. + * + * 8. Limitation of Liability. In no event and under no legal theory, + * whether in tort (including negligence), contract, or otherwise, + * unless required by applicable law (such as deliberate and grossly + * negligent acts) or agreed to in writing, shall any Contributor be + * liable to You for damages, including any direct, indirect, special, + * incidental, or consequential damages of any character arising as a + * result of this License or out of the use or inability to use the + * Work (including but not limited to damages for loss of goodwill, + * work stoppage, computer failure or malfunction, or any and all + * other commercial damages or losses), even if such Contributor + * has been advised of the possibility of such damages. + * + * 9. Accepting Warranty or Additional Liability. While redistributing + * the Work or Derivative Works thereof, You may choose to offer, + * and charge a fee for, acceptance of support, warranty, indemnity, + * or other liability obligations and/or rights consistent with this + * License. However, in accepting such obligations, You may act only + * on Your own behalf and on Your sole responsibility, not on behalf + * of any other Contributor, and only if You agree to indemnify, + * defend, and hold each Contributor harmless for any liability + * incurred by, or claims asserted against, such Contributor by reason + * of your accepting any such warranty or additional liability. + * + * END OF TERMS AND CONDITIONS + * + * APPENDIX: How to apply the Apache License to your work. + * + * To apply the Apache License to your work, attach the following + * boilerplate notice, with the fields enclosed by brackets "[]" + * replaced with your own identifying information. (Don't include + * the brackets!) The text should be enclosed in the appropriate + * comment syntax for the file format. We also recommend that a + * file or class name and description of purpose be included on the + * same "printed page" as the copyright notice for easier + * identification within third-party archives. + * + * Copyright [yyyy] [name of copyright owner] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/pdf-as-cli/src/test/resources/pdfas-config/licenses/ant/LICENSE.dom b/pdf-as-cli/src/test/resources/pdfas-config/licenses/ant/LICENSE.dom new file mode 100644 index 00000000..2959b704 --- /dev/null +++ b/pdf-as-cli/src/test/resources/pdfas-config/licenses/ant/LICENSE.dom @@ -0,0 +1,71 @@ +This license came from: +http://www.w3.org/Consortium/Legal/copyright-software-19980720 + + +W3C® SOFTWARE NOTICE AND LICENSE +Copyright © 1994-2001 World +Wide Web Consortium, World +Wide Web Consortium, (Massachusetts Institute of +Technology, Institut National de +Recherche en Informatique et en Automatique, Keio University). All Rights Reserved. +http://www.w3.org/Consortium/Legal/ + +This W3C work (including software, documents, or other related +items) is being provided by the copyright holders under the +following license. By obtaining, using and/or copying this work, +you (the licensee) agree that you have read, understood, and will +comply with the following terms and conditions: +Permission to use, copy, modify, and distribute this software +and its documentation, with or without modification,  for any +purpose and without fee or royalty is hereby granted, provided that +you include the following on ALL copies of the software and +documentation or portions thereof, including modifications, that +you make: + +The full text of this NOTICE in a location viewable to users of +the redistributed or derivative work. + +Any pre-existing intellectual property disclaimers, notices, or +terms and conditions. If none exist, a short notice of the +following form (hypertext is preferred, text is permitted) should +be used within the body of any redistributed or derivative code: +"Copyright © [$date-of-software] World Wide Web Consortium, (Massachusetts Institute of +Technology, Institut National de +Recherche en Informatique et en Automatique, Keio University). All Rights Reserved. +http://www.w3.org/Consortium/Legal/" + +Notice of any changes or modifications to the W3C files, +including the date changes were made. (We recommend you provide +URIs to the location from which the code is derived.) + +THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND +COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF +MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE +USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD +PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. +COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, +SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE +SOFTWARE OR DOCUMENTATION. + +The name and trademarks of copyright holders may NOT be used in +advertising or publicity pertaining to the software without +specific, written prior permission. Title to copyright in this +software and any associated documentation will at all times remain +with copyright holders. +____________________________________ +This formulation of W3C's notice and license became active on +August 14 1998 so as to improve compatibility with GPL. This +version ensures that W3C software licensing terms are no more +restrictive than GPL and consequently W3C software may be +distributed in GPL packages. See the older formulation for the +policy prior to this date. Please see our Copyright FAQ for common +questions about using materials from +our site, including specific terms and conditions for packages like +libwww, Amaya, and Jigsaw. +Other questions about this notice can be +directed to site-policy@w3.org. + +webmaster diff --git a/pdf-as-cli/src/test/resources/pdfas-config/licenses/ant/LICENSE.sax b/pdf-as-cli/src/test/resources/pdfas-config/licenses/ant/LICENSE.sax new file mode 100644 index 00000000..05bccc9a --- /dev/null +++ b/pdf-as-cli/src/test/resources/pdfas-config/licenses/ant/LICENSE.sax @@ -0,0 +1,20 @@ +This license came from: http://www.megginson.com/SAX/copying.html + However please note future versions of SAX may be covered + under http://saxproject.org/?selected=pd + + +This page is now out of date -- see the new SAX site at +http://www.saxproject.org/ for more up-to-date +releases and other information. Please change your bookmarks. + + +SAX2 is Free! + +I hereby abandon any property rights to SAX 2.0 (the Simple API for +XML), and release all of the SAX 2.0 source code, compiled code, and +documentation contained in this distribution into the Public Domain. +SAX comes with NO WARRANTY or guarantee of fitness for any +purpose. + +David Megginson, david@megginson.com +2000-05-05 \ No newline at end of file diff --git a/pdf-as-cli/src/test/resources/pdfas-config/licenses/ant/LICENSE.xerces b/pdf-as-cli/src/test/resources/pdfas-config/licenses/ant/LICENSE.xerces new file mode 100644 index 00000000..28282b45 --- /dev/null +++ b/pdf-as-cli/src/test/resources/pdfas-config/licenses/ant/LICENSE.xerces @@ -0,0 +1,56 @@ +/* + * The Apache Software License, Version 1.1 + * + * + * Copyright (c) 1999-2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Xerces" and "Apache Software Foundation" must + * not be used to endorse or promote products derived from this + * software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * nor may "Apache" appear in their name, without prior written + * permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation and was + * originally based on software copyright (c) 1999, International + * Business Machines, Inc., http://www.ibm.com. For more + * information on the Apache Software Foundation, please see + * . + */ diff --git a/pdf-as-cli/src/test/resources/pdfas-config/licenses/apache/LICENSE b/pdf-as-cli/src/test/resources/pdfas-config/licenses/apache/LICENSE new file mode 100644 index 00000000..75b52484 --- /dev/null +++ b/pdf-as-cli/src/test/resources/pdfas-config/licenses/apache/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/pdf-as-cli/src/test/resources/pdfas-config/licenses/checkstyle/LICENSE b/pdf-as-cli/src/test/resources/pdfas-config/licenses/checkstyle/LICENSE new file mode 100644 index 00000000..cbee875b --- /dev/null +++ b/pdf-as-cli/src/test/resources/pdfas-config/licenses/checkstyle/LICENSE @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser 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 Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "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 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/pdf-as-cli/src/test/resources/pdfas-config/licenses/checkstyle/LICENSE.apache b/pdf-as-cli/src/test/resources/pdfas-config/licenses/checkstyle/LICENSE.apache new file mode 100644 index 00000000..3c0a9367 --- /dev/null +++ b/pdf-as-cli/src/test/resources/pdfas-config/licenses/checkstyle/LICENSE.apache @@ -0,0 +1,60 @@ +/* + * $Header: /filer/cvs-repository/pdf-as/command-line/licenses/checkstyle/LICENSE.apache,v 1.1 2006/06/14 10:05:39 wlackner Exp $ + * $Revision: 1.1 $ + * $Date: 2006/06/14 10:05:39 $ + * + * ==================================================================== + * + * The Apache Software License, Version 1.1 + * + * Copyright (c) 1999 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Jakarta-Regexp", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + * + */ diff --git a/pdf-as-cli/src/test/resources/pdfas-config/licenses/dejavu-font/LICENSE b/pdf-as-cli/src/test/resources/pdfas-config/licenses/dejavu-font/LICENSE new file mode 100644 index 00000000..254e2cc4 --- /dev/null +++ b/pdf-as-cli/src/test/resources/pdfas-config/licenses/dejavu-font/LICENSE @@ -0,0 +1,99 @@ +Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. +Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below) + +Bitstream Vera Fonts Copyright +------------------------------ + +Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is +a trademark of Bitstream, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of the fonts accompanying this license ("Fonts") and associated +documentation files (the "Font Software"), to reproduce and distribute the +Font Software, including without limitation the rights to use, copy, merge, +publish, distribute, and/or sell copies of the Font Software, and to permit +persons to whom the Font Software is furnished to do so, subject to the +following conditions: + +The above copyright and trademark notices and this permission notice shall +be included in all copies of one or more of the Font Software typefaces. + +The Font Software may be modified, altered, or added to, and in particular +the designs of glyphs or characters in the Fonts may be modified and +additional glyphs or characters may be added to the Fonts, only if the fonts +are renamed to names not containing either the words "Bitstream" or the word +"Vera". + +This License becomes null and void to the extent applicable to Fonts or Font +Software that has been modified and is distributed under the "Bitstream +Vera" names. + +The Font Software may be sold as part of a larger software package but no +copy of one or more of the Font Software typefaces may be sold by itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, +TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME +FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING +ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE +FONT SOFTWARE. + +Except as contained in this notice, the names of Gnome, the Gnome +Foundation, and Bitstream Inc., shall not be used in advertising or +otherwise to promote the sale, use or other dealings in this Font Software +without prior written authorization from the Gnome Foundation or Bitstream +Inc., respectively. For further information, contact: fonts at gnome dot +org. + +Arev Fonts Copyright +------------------------------ + +Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the fonts accompanying this license ("Fonts") and +associated documentation files (the "Font Software"), to reproduce +and distribute the modifications to the Bitstream Vera Font Software, +including without limitation the rights to use, copy, merge, publish, +distribute, and/or sell copies of the Font Software, and to permit +persons to whom the Font Software is furnished to do so, subject to +the following conditions: + +The above copyright and trademark notices and this permission notice +shall be included in all copies of one or more of the Font Software +typefaces. + +The Font Software may be modified, altered, or added to, and in +particular the designs of glyphs or characters in the Fonts may be +modified and additional glyphs or characters may be added to the +Fonts, only if the fonts are renamed to names not containing either +the words "Tavmjong Bah" or the word "Arev". + +This License becomes null and void to the extent applicable to Fonts +or Font Software that has been modified and is distributed under the +"Tavmjong Bah Arev" names. + +The Font Software may be sold as part of a larger software package but +no copy of one or more of the Font Software typefaces may be sold by +itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL +TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +Except as contained in this notice, the name of Tavmjong Bah shall not +be used in advertising or otherwise to promote the sale, use or other +dealings in this Font Software without prior written authorization +from Tavmjong Bah. For further information, contact: tavmjong @ free +. fr. + +$Id: LICENSE 2133 2007-11-28 02:46:28Z lechimp $ diff --git a/pdf-as-cli/src/test/resources/pdfas-config/licenses/fonts/BitStream.txt b/pdf-as-cli/src/test/resources/pdfas-config/licenses/fonts/BitStream.txt new file mode 100644 index 00000000..8e56be2d --- /dev/null +++ b/pdf-as-cli/src/test/resources/pdfas-config/licenses/fonts/BitStream.txt @@ -0,0 +1,17 @@ +Copyright (c) 2003 by Bitstream, Inc. +All Rights Reserved. +Bitstream Vera is a trademark of Bitstream, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: + +The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. + +The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". + +This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. + +The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. + +Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.http://www.bitstream.com \ No newline at end of file diff --git a/pdf-as-cli/src/test/resources/pdfas-config/licenses/ikvm/LICENSE b/pdf-as-cli/src/test/resources/pdfas-config/licenses/ikvm/LICENSE new file mode 100644 index 00000000..2fbfb21f --- /dev/null +++ b/pdf-as-cli/src/test/resources/pdfas-config/licenses/ikvm/LICENSE @@ -0,0 +1,34 @@ +IMPORTANT NOTICE + + Some files in this distribution are part of GNU Classpath and have a + different license. This applies in particular to: + - IKVM.GNU.Classpath.dll + - some of the *.java files (see each file header for license) + + See http://www.gnu.org/software/classpath/ for information on the + GNU Classpath license. + +----------------------------------------------------------------------------- + + Copyright (C) 2002, 2003, 2004 Jeroen Frijters + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jeroen Frijters + jeroen@frijters.net + +----------------------------------------------------------------------------- diff --git a/pdf-as-cli/src/test/resources/pdfas-config/licenses/junit/cpl-v10.html b/pdf-as-cli/src/test/resources/pdfas-config/licenses/junit/cpl-v10.html new file mode 100644 index 00000000..19009948 --- /dev/null +++ b/pdf-as-cli/src/test/resources/pdfas-config/licenses/junit/cpl-v10.html @@ -0,0 +1,125 @@ + + + +Common Public License - v 1.0 + + + + + + +

Common Public License - v 1.0 +

+

THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. +

+

1. DEFINITIONS +

"Contribution" means: + +

    a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
    +b) in the case of each subsequent Contributor:
+ + +
    i) changes to the Program, and
+ + +
    ii) additions to the Program;
+ + +
    where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
+ +

+

"Contributor" means any person or entity that distributes the Program. +

+

"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. +

+

"Program" means the Contributions distributed in accordance with this Agreement. +

+

"Recipient" means anyone who receives the Program under this Agreement, including all Contributors. +

+

2. GRANT OF RIGHTS + +

    a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
+ + +
+ + +
    b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
+ + +
+ + +
    c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.
+ + +
+ + +
    d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
+ + +
+ +

3. REQUIREMENTS +

A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: + +

    a) it complies with the terms and conditions of this Agreement; and
+ + +
    b) its license agreement:
+ + +
    i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
+ + +
    ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
+ + +
    iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
+ + +
    iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.
+ + +
+ +

When the Program is made available in source code form: + +

    a) it must be made available under this Agreement; and
+ + +
    b) a copy of this Agreement must be included with each copy of the Program.
+ +

+

Contributors may not remove or alter any copyright notices contained within the Program. +

+

Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. +

+

4. COMMERCIAL DISTRIBUTION +

Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. +

+

For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. +

+

5. NO WARRANTY +

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. +

+

6. DISCLAIMER OF LIABILITY +

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +

+

7. GENERAL +

If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. +

+

If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. +

+

All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. +

+

Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. +

+

This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. +

+

+ + + + \ No newline at end of file diff --git a/pdf-as-cli/src/test/resources/pdfas-config/licenses/log4j/LICENSE.txt b/pdf-as-cli/src/test/resources/pdfas-config/licenses/log4j/LICENSE.txt new file mode 100644 index 00000000..030564fc --- /dev/null +++ b/pdf-as-cli/src/test/resources/pdfas-config/licenses/log4j/LICENSE.txt @@ -0,0 +1,48 @@ +/* + * ============================================================================ + * The Apache Software License, Version 1.1 + * ============================================================================ + * + * Copyright (C) 1999 The Apache Software Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The end-user documentation included with the redistribution, if any, must + * include the following acknowledgment: "This product includes software + * developed by the Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, if + * and wherever such third-party acknowledgments normally appear. + * + * 4. The names "log4j" and "Apache Software Foundation" must not be used to + * endorse or promote products derived from this software without prior + * written permission. For written permission, please contact + * apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", nor may + * "Apache" appear in their name, without prior written permission of the + * Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- + * DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This software consists of voluntary contributions made by many individuals + * on behalf of the Apache Software Foundation. For more information on the + * Apache Software Foundation, please see . + * + */ diff --git a/pdf-as-cli/src/test/resources/pdfas-config/licenses/lucene/LICENSE.txt b/pdf-as-cli/src/test/resources/pdfas-config/licenses/lucene/LICENSE.txt new file mode 100644 index 00000000..ad8d37e4 --- /dev/null +++ b/pdf-as-cli/src/test/resources/pdfas-config/licenses/lucene/LICENSE.txt @@ -0,0 +1,15 @@ +/** + * Copyright 2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/pdf-as-cli/src/test/resources/pdfas-config/licenses/pdfbox/LICENSE b/pdf-as-cli/src/test/resources/pdfas-config/licenses/pdfbox/LICENSE new file mode 100644 index 00000000..761bc80f --- /dev/null +++ b/pdf-as-cli/src/test/resources/pdfas-config/licenses/pdfbox/LICENSE @@ -0,0 +1,25 @@ +Copyright (c) 2003-2005, www.pdfbox.org +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +3. Neither the name of pdfbox; nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/pdf-as-cli/src/test/resources/pdfas-config/licenses/sun-jaicmm/JAI-LICENSE b/pdf-as-cli/src/test/resources/pdfas-config/licenses/sun-jaicmm/JAI-LICENSE new file mode 100644 index 00000000..c56029e3 --- /dev/null +++ b/pdf-as-cli/src/test/resources/pdfas-config/licenses/sun-jaicmm/JAI-LICENSE @@ -0,0 +1,283 @@ +Sun Microsystems, Inc. + +Binary Code License Agreement + + + +JAVA ADVANCED IMAGING API, VERSION 1.1.2 + + + +READ THE TERMS OF THIS AGREEMENT AND ANY PROVIDED +SUPPLEMENTAL LICENS E TERMS (COLLECTIVELY "AGREEMENT") +CAREFULLY BEFORE OPENING THE SOFTW ARE MEDIA PACKAGE. BY +OPENING THE SOFTWARE MEDIA PACKAGE, YOU AGRE E TO THE TERMS +OF THIS AGREEMENT. IF YOU ARE ACCESSING THE SOFTWAR E +ELECTRONICALLY, INDICATE YOUR ACCEPTANCE OF THESE TERMS BY +SELECTIN G THE "ACCEPT" BUTTON AT THE END OF THIS +AGREEMENT. IF YOU DO NOT AGREE TO ALL THESE TERMS, +PROMPTLY RETURN THE UNUSED SOFTWARE TO YOUR + PLACE OF PURCHASE FOR A REFUND OR, IF THE SOFTWARE IS + ACCESSED ELECT RONICALLY, SELECT THE "DECLINE" BUTTON AT +THE END OF THIS AGREEMENT. + + + + +1. LICENSE TO USE. Sun grants you a non-exclusive and +non-trans ferable license for the internal use only of the +accompanying softwar e and documentation and any error +corrections provided by Sun (collec tively "Software"), by +the number of users and the class of computer hardware for +which the corresponding fee has been paid. + + + +2. RESTRICTIONS. Software is confidential and +copyrighted. Titl e to Software and all associated +intellectual property rights is reta ined by Sun and/or its +licensors. Except as specifically authorize d in any +Supplemental License Terms, you may not make copies of +Softw are, other than a single copy of Software for +archival purposes. U nless enforcement is prohibited by +applicable law, you may not modify , decompile, or reverse +engineer Software. Licensee acknowledges t hat Software is +not designed or intended for use in the design, const +ruction, operation or maintenance of any nuclear facility. +Sun Micros ystems, Inc. disclaims any express or implied +warranty of fitness for + such uses. No right, title or interest in or to any + trademark, s ervice mark, logo or trade name of Sun or its +licensors is granted un der this Agreement. + + + +3. LIMITED WARRANTY. Sun warrants to you that for a +period of nin ety (90) days from the date of purchase, as +evidenced by a copy of th e receipt, the media on which +Software is furnished (if any) will be free of defects in +materials and workmanship under normal use. Exc ept for +the foregoing, Software is provided "AS IS". Your exclusiv +e remedy and Sun's entire liability under this limited +warranty will be at Sun's option to replace Software media +or refund the fee paid f or Software. + + + +4. DISCLAIMER OF WARRANTY. UNLESS SPECIFIED IN THIS +AGREEMENT, ALL EXPRESS OR IMPLIED CONDITIONS, +REPRESENTATIONS AND WARRANTIES, IN CLUDING ANY IMPLIED +WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTIC ULAR +PURPOSE OR NON-INFRINGEMENT ARE DISCLAIMED, EXCEPT TO THE +EXTENT + THAT THESE DISCLAIMERS ARE HELD TO BE LEGALLY INVALID. + + + +5. LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED +BY LAW , IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE +FOR ANY LOST REVENU E, PROFIT OR DATA, OR FOR SPECIAL, +INDIRECT, CONSEQUENTIAL, INCIDENTA L OR PUNITIVE DAMAGES, +HOWEVER CAUSED REGARDLESS OF THE THEORY OF LIA BILITY, +ARISING OUT OF OR RELATED TO THE USE OF OR INABILITY TO USE +S OFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY +OF SUCH DAMA GES. In no event will Sun's liability to you, +whether in contract, + tort (including negligence), or otherwise, exceed the + amount paid by you for Software under this Agreement. The + foregoing limitations will apply even if the above stated +warranty fails of its essential p urpose. + + + +6. Termination. This Agreement is effective until +terminated. You may terminate this Agreement at any time +by destroying all co pies of Software. This Agreement will +terminate immediately withou t notice from Sun if you fail +to comply with any provision of this Ag reement. Upon +Termination, you must destroy all copies of Software +. + + + +7. Export Regulations. All Software and technical data +delivered und er this Agreement are subject to US export +control laws and may be su bject to export or import +regulations in other countries. You agre e to comply +strictly with all such laws and regulations and acknowled +ge that you have the responsibility to obtain such licenses +to export , re-export, or import as may be required after +delivery to you. + + + +8. U.S. Government Restricted Rights. If Software is +being acqu ired by or on behalf of the U.S. Government or +by a U.S. Government p rime contractor or subcontractor (at +any tier), then the Government's + rights in Software and accompanying documentation will be + only as se t forth in this Agreement; this is in +accordance with 48 CFR 227.7201 + through 227.7202-4 (for Department of Defense (DOD) + acquisitions) an d with 48 CFR 2.101 and 12.212 (for +non-DOD acquisitions). + + + +9. Governing Law. Any action related to this Agreement +will be governed by California law and controlling U.S. +federal law. No ch oice of law rules of any jurisdiction +will apply. + + + +10. Severability. If any provision of this Agreement is +held to be un enforceable, this Agreement will remain in +effect with the provision omitted, unless omission would +frustrate the intent of the parties, i n which case this +Agreement will immediately terminate. + + + +11. Integration. This Agreement is the entire agreement +between yo u and Sun relating to its subject matter. It +supersedes all prior or contemporaneous oral or written +communications, proposals, represe ntations and warranties +and prevails over any conflicting or addition al terms of +any quote, order, acknowledgment, or other communication +between the parties relating to its subject matter during +the term of + this Agreement. No modification of this Agreement will be + binding , unless in writing and signed by an authorized +representative of eac h party. + + + + + + JAVA ADVANCED IMAGING, VERSION 1.1.2 + + + + SUPPLEMENTAL LICENSE TERMS + + + +These supplemental license terms ("Supplemental Terms") add +to or mod ify the terms of the Binary Code License +Agreement (collectively, the + "Agreement"). Capitalized terms not defined in these + Supplemental Te rms shall have the same meanings ascribed +to them in the Agreement. T hese Supplemental Terms shall +supersede any inconsistent or conflicti ng terms in the +Agreement, or in any license contained within the Sof +tware. + + + +1. Software Internal Use and Development License Grant. +Subject to + the terms and conditions of this Agreement, including, but + not limit ed to Section 3 (Java Technology Restrictions) +of these Supplemental Terms, Sun grants you a +non-exclusive, non-transferable, limited lice nse to +reproduce internally and use internally the binary form of +the + Software, complete and unmodified, for the sole purpose of + designing , developing and testing your Java applets and +applications ("Program s"). + + + +2. License to Distribute Software. In addition to the +license gran ted in Section 1 (Software Internal Use and +Development License Grant ) of these Supplemental Terms, +subject to the terms and conditions of + this Agreement, including but not limited to, Section 3 + (Java Techno logy Restrictions) of these Supplemental +Terms, Sun grants you a non- exclusive, non-transferable, +limited license to reproduce and distrib ute the Software +in binary code form only, provided that you (i) dist ribute +the Software complete and unmodified and only bundled as +part of your Programs, (ii) do not distribute additional +software intended + to replace any component(s) of the Software, (iii) do not + remove or alter any proprietary legends or notices +contained in the Software, ( iv) only distribute the +Software subject to a license agreement that protects Sun's +interests consistent with the terms contained in this +Agreement, and (v) agree to defend and indemnify Sun and +its licensor s from and against any damages, costs, +liabilities, settlement amount s and/or expenses (including +attorneys' fees) incurred in connection with any claim, +lawsuit or action by any third party that arises or r +esults from the use or distribution of any and all Programs +and/or So ftware. + + + +3. Java Technology Restrictions. You may not modify the +Java Platform + Interface ("JPI", identified as classes contained within + the "java" package or any subpackages of the "java" +package), by creating additi onal classes within the JPI or +otherwise causing the addition to or m odification of the +classes in the JPI. In the event that you creat e an +additional class and associated API(s) which (i) extends +the fun ctionality of the Java platform, and (ii) is +exposed to third party s oftware developers for the purpose +of developing additional software which invokes such +additional API, you must promptly publish broadly an +accurate specification for such API for free use by all +developers +. You may not create, or authorize your licensees to create additi +onal classes, interfaces, or subpackages that are in any +way identifi ed as "java", "javax", "sun" or similar +convention as specified by Su n in any naming convention +designation. + + + +4. Java Runtime Availability. Refer to the appropriate +version of t he Java Runtime Environment binary code +license (currently located at + http://www.java.sun.com/jdk/index.html) for the + availability of runt ime code which may be distributed +with Java applets and applications. + + + +5. Trademarks and Logos. You acknowledge and agree as +between you and + Sun that Sun owns the SUN, SOLARIS, JAVA, JINI, FORTE, and + iPLANET t rademarks and all SUN, SOLARIS, JAVA, JINI, +FORTE, and iPLANET-relate d trademarks, service marks, +logos and other brand designations ("Sun + Marks"), and you agree to comply with the Sun Trademark + and Logo Usa ge Requirements currently located at +http://www.sun.com/policies/trad emarks. Any use you make +of the Sun Marks inures to Sun's benefit. + + + + +6. Source Code. Software may contain source code that is +provided sol ely for reference purposes pursuant to the +terms of this Agreement. Source code may not be +redistributed unless expressly provided fo r in this +Agreement. + + + +7. Termination for Infringement. Either party may +terminate this A greement immediately should any Software +become, or in either party's + opinion be likely to become, the subject of a claim of + infringement of any intellectual property right. + + + +For inquiries please contact: Sun Microsystems, Inc., 4150 +Network Ci rcle, Santa Clara, California 95054, U.S.A + +(LFI#143342/Form ID#011801) diff --git a/pdf-as-cli/src/test/resources/pdfas-config/licenses/sun-jaicmm/LICENSE b/pdf-as-cli/src/test/resources/pdfas-config/licenses/sun-jaicmm/LICENSE new file mode 100644 index 00000000..b5873aae --- /dev/null +++ b/pdf-as-cli/src/test/resources/pdfas-config/licenses/sun-jaicmm/LICENSE @@ -0,0 +1,186 @@ +License for sun JAI ICC color profiles. Downloaded from +http://java.sun.com/products/java-media/jai/downloads/download-1_1_2.html + + + Java(TM) Advanced Imaging API + Version 1.0 + Binary Code License + +This binary code license ("License") contains +rights and restrictions associated with use of +the accompanying Java(TM) Advanced Imaging API +software and documentation ("Software"). Read the +License carefully before using the Software. By +using the Software you agree to the terms and +conditions of this License. + +1. License to Distribute. Licensee is granted a + royalty-free right to reproduce and + distribute the Software provided that + Licensee: + + (A) distributes the Software complete and + unmodified (except for the specific files + identified as optional in the Software + README file), only as part of, and for + the sole purpose of running, Licensee's + Java compatible applet or application + ("Program") into which the Software is + incorporated; + + (B) does not distribute additional software + intended to replace any component(s) of + the Software; + + (C) agrees to incorporate the most current + version of the Software that was + available 180 days prior to each + production release of the Program; + + (D) does not remove or alter any proprietary + legends or notices contained in the + Software; + + (E) includes the provisions of Sections 2, 3, + 5, 6, 8 and 9 in Licensee's license + agreement for the Program; and + + (F) agrees to indemnify, hold harmless, and + defend Sun and its licensors from and + against any claims or lawsuits, including + attorneys' fees, that arise or result + from the use or distribution of the + Program. + +2. Java Platform Interface. Licensee may not + modify the Java Platform Interface ("JPI", + identified as classes contained within the + "java" package or any subpackages of the + "java" package), by creating additional + classes within the JPI or otherwise causing + the addition to or modification of the + classes in the JPI. In the event that + Licensee creates any Java-related API and + distributes such API to others for applet or + application development, Licensee must + promptly publish broadly, an accurate + specification for such API for free use by + all developers of Java-based software. + +3. Restrictions. Software is confidential + copyrighted information of Sun and title to + all copies is retained by Sun and/or its + licensors. Licensee shall not decompile, + disassemble, decrypt, extract, or otherwise + reverse engineer Software. Software may not + be leased, assigned, or sublicensed, in whole + or in part, except as specifically authorized + in Section 1. Software is not designed or + intended for use in online control of + aircraft, air traffic, aircraft navigation or + aircraft communications; or in the design, + construction, operation or maintenance of any + nuclear facility. Licensee warrants that it + will not use or redistribute the Software for + such purposes. + +4. Trademarks and Logos. This License does not + authorize Licensee to use any Sun name, + trademark or logo. Licensee acknowledges that + Sun owns the Java trademark and all + Java-related trademarks, logos and icons + including the Coffee Cup and Duke ("Java + Marks") and agrees to: + + (A) comply with the Java Trademark Guidelines + at http://java.sun.com/trademarks.html; + + (B) not do anything harmful to or + inconsistent + with Sun's rights in the Java Marks; and + + (C) assist Sun in protecting those rights, + including assigning to Sun any rights + acquired by Licensee in any Java Mark. + +5. Disclaimer of Warranty. Software is provided + "AS IS," without a warranty of any kind. ALL + EXPRESS OR IMPLIED REPRESENTATIONS AND + WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NON-INFRINGEMENT, ARE HEREBY + EXCLUDED. + +6. Limitation of Liability. SUN AND ITS +LICENSORS + SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED + BY LICENSEE OR ANY THIRD PARTY AS A RESULT OF + USING OR DISTRIBUTING SOFTWARE. IN NO EVENT + WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY + LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, + INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL + OR PUNITIVE DAMAGES, HOWEVER CAUSED AND + REGARDLESS OF THE THEORY OF LIABILITY, + ARISING OUT OF THE USE OF OR INABILITY TO USE + SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE + POSSIBILITY OF SUCH DAMAGES. + +7. Termination. This license shall automatically + terminate 180 days after production release + of the next version of the Software by Sun. + Licensee may terminate this License at any + time by destroying all copies of Software. + This License will terminate immediately + without notice from Sun if Licensee fails to + comply with any provision of this License. + Upon such termination, Licensee must destroy + all copies of Software. + +8. Export Regulations. Software, including + technical data, is subject to U.S. export + control laws, including the U.S. Export + Administration Act and its associated + regulations, and may be subject to export or + import regulations in other countries. + Licensee agrees to comply strictly with all + such regulations and acknowledges that it has + the responsibility to obtain licenses to + export, re-export, or import Software. + Software may not be downloaded, or otherwise + exported or re-exported + + (A) into, or to a national or resident of, + Cuba, Iraq, Iran, North Korea, Libya, + Sudan, Syria or any country to which the + U.S. has embargoed goods; or + + (B) to anyone on the U.S. Treasury + Department's list of Specially Designated + Nations or the U.S. Commerce Department's + Table of Denial Orders. + +9. Restricted Rights. Use, duplication or + disclosure by the United States government is + subject to the restrictions as set forth in + the Rights in Technical Data and Computer + Software Clauses in DFARS 252.227-7013(c) (1) + (ii) and FAR 52.227-19(c) (2) as applicable. + +10. Governing Law. Any action related to this + License will be governed by California law + and controlling U.S. federal law. No choice + of law rules of any jurisdiction will apply. + +11. Severability. If any of the above provisions + are held to be in violation of applicable + law, void, or unenforceable in any + jurisdiction, then such provisions are + herewith waived or amended to the extent + necessary for the License to be otherwise + enforceable in such jurisdiction. However, + if in Sun's opinion deletion or amendment of + any provisions of the License by operation of + this paragraph unreasonably compromises the + rights or increase the liabilities of Sun or + its licensors, Sun reserves the right to + terminate the License. diff --git a/pdf-as-common/build.gradle b/pdf-as-common/build.gradle index e1a5fdfc..a607fcfe 100644 --- a/pdf-as-common/build.gradle +++ b/pdf-as-common/build.gradle @@ -1,4 +1,4 @@ -apply plugin: 'java' +apply plugin: 'java-library' apply plugin: 'eclipse' jar { @@ -20,14 +20,15 @@ releases.dependsOn jar releases.dependsOn sourcesJar dependencies { - compile group: 'org.slf4j', name: 'slf4j-api', version: slf4jVersion - compile group: 'commons-collections', name: 'commons-collections', version: '3.2.2' - compile group: 'commons-io', name: 'commons-io', version: '2.4' - compile group: 'ognl', name: 'ognl', version: '3.0.6' - compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.1' - compile 'commons-codec:commons-codec:1.10' - compile group: 'org.glassfish.jaxb', name: 'jaxb-runtime', version: '2.3.3' - testCompile group: 'junit', name: 'junit', version: '4.+' + api group: 'org.slf4j', name: 'slf4j-api', version: slf4jVersion + api group: 'commons-collections', name: 'commons-collections', version: '3.2.2' + api group: 'commons-io', name: 'commons-io', version: '2.8.0' + api group: 'ognl', name: 'ognl', version: '3.2.19' + api group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.1' + api 'commons-codec:commons-codec:1.10' + api group: 'org.glassfish.jaxb', name: 'jaxb-runtime', version: '2.3.3' + api group: 'javax.jws', name: 'javax.jws-api', version: '1.1' + testImplementation group: 'junit', name: 'junit', version: '4.+' } test { diff --git a/pdf-as-common/src/main/java/at/gv/egiz/pdfas/api/ws/PDFASSignRequest.java b/pdf-as-common/src/main/java/at/gv/egiz/pdfas/api/ws/PDFASSignRequest.java index 3e714ea9..39a384b2 100644 --- a/pdf-as-common/src/main/java/at/gv/egiz/pdfas/api/ws/PDFASSignRequest.java +++ b/pdf-as-common/src/main/java/at/gv/egiz/pdfas/api/ws/PDFASSignRequest.java @@ -24,6 +24,8 @@ package at.gv.egiz.pdfas.api.ws; import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlType; @@ -40,6 +42,9 @@ public class PDFASSignRequest implements Serializable { byte[] inputData; PDFASSignParameters parameters; VerificationLevel verificationLevel; + + //map of user provided parameters, these values can be used in the signature block + Map signatureBlockParameters; @XmlElement(required = true, nillable = false, name="requestID") public String getRequestID() { @@ -76,4 +81,15 @@ public class PDFASSignRequest implements Serializable { public void setParameters(PDFASSignParameters parameters) { this.parameters = parameters; } + + @XmlElement(required = false, nillable = true, name="signatureBlockParameter") + public Map getSignatureBlockParameters() { + if(signatureBlockParameters == null) + signatureBlockParameters = new HashMap<>(); + return signatureBlockParameters; + } + + public void setSignatureBlockParameters(Map signatureBlockParameters) { + this.signatureBlockParameters = signatureBlockParameters; + } } diff --git a/pdf-as-common/src/main/java/at/gv/egiz/pdfas/common/settings/DefaultSignatureProfileSettings.java b/pdf-as-common/src/main/java/at/gv/egiz/pdfas/common/settings/DefaultSignatureProfileSettings.java index 6f1519a4..6e288a27 100644 --- a/pdf-as-common/src/main/java/at/gv/egiz/pdfas/common/settings/DefaultSignatureProfileSettings.java +++ b/pdf-as-common/src/main/java/at/gv/egiz/pdfas/common/settings/DefaultSignatureProfileSettings.java @@ -65,6 +65,10 @@ public class DefaultSignatureProfileSettings { public static final String VALUE_SIG_DATE_DEFAULT = "yyyy-MM-dd'T'HH:mm:ssXXX"; + public static final String SIG_BLOCK_PARAMETER_DEFAULT_KEY_REGEX = "^([A-za-z]){1,20}$"; +// public static final String SIG_BLOCK_PARAMETER_DEFAULT_VALUE_REGEX = "^([\\p{Print}-ß_'\\+\\!\u00e4\u00f6\u00fc" + +// "\u00c4\u00d6\u00dc]){1,100}$"; +public static final String SIG_BLOCK_PARAMETER_DEFAULT_VALUE_REGEX = "^([\\p{Print}\u00df\u00A7\u20AC\u00e4\u00f6\u00fc\u00c4\u00d6\u00dc]){1,100}$"; static { profileSettings.put(KEY_SIG_SUBJECT, new SignatureProfileEntry(KEY_SIG_SUBJECT, KEY_SIG_SUBJECT_DEFAULT, VALUE_SIG_SUBJECT_DEFAULT) ); diff --git a/pdf-as-common/src/main/java/at/gv/egiz/pdfas/common/settings/IProfileConstants.java b/pdf-as-common/src/main/java/at/gv/egiz/pdfas/common/settings/IProfileConstants.java index e1fcb9d0..3f07f774 100644 --- a/pdf-as-common/src/main/java/at/gv/egiz/pdfas/common/settings/IProfileConstants.java +++ b/pdf-as-common/src/main/java/at/gv/egiz/pdfas/common/settings/IProfileConstants.java @@ -96,4 +96,5 @@ public interface IProfileConstants { public final static String SIG_PDFUA_FORCE = "SIG_PDFUA_FORCE"; public final static String LATIN1_ENCODING = "latin1_encoding"; + public final static String SIGNATURE_BLOCK_PARAMETER = "sbp"; } diff --git a/pdf-as-common/src/main/java/at/gv/egiz/pdfas/common/utils/CheckSignatureBlockParameters.java b/pdf-as-common/src/main/java/at/gv/egiz/pdfas/common/utils/CheckSignatureBlockParameters.java new file mode 100644 index 00000000..756a240c --- /dev/null +++ b/pdf-as-common/src/main/java/at/gv/egiz/pdfas/common/utils/CheckSignatureBlockParameters.java @@ -0,0 +1,42 @@ +package at.gv.egiz.pdfas.common.utils; + +import at.gv.egiz.pdfas.common.settings.DefaultSignatureProfileSettings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Map; + +public class CheckSignatureBlockParameters { + + private static final Logger logger = LoggerFactory + .getLogger(CheckSignatureBlockParameters.class); + public static boolean checkSignatureBlockParameterMapIsValid(Map map, String keyRegex, + String valueRegex) { + + logger.trace("regex1:"+keyRegex+", regex1:"+valueRegex); + if(keyRegex == null || keyRegex.length() == 0) { + keyRegex = DefaultSignatureProfileSettings.SIG_BLOCK_PARAMETER_DEFAULT_KEY_REGEX; + } + if(valueRegex == null || valueRegex.length() == 0) { + valueRegex = DefaultSignatureProfileSettings.SIG_BLOCK_PARAMETER_DEFAULT_VALUE_REGEX; + } + logger.trace("regex2:"+keyRegex+", regex2:"+valueRegex); + for(String key : map.keySet()){ + if(isValid(key, keyRegex) == false) { + logger.error("Invalid key:"+key+", regex:"+keyRegex); + return false; + } + if(isValid(map.get(key), valueRegex) == false) { + logger.error("Invalid value:"+map.get(key)+", regex:"+valueRegex); + return false; + } + } + + return true; + } + + public static boolean isValid(String s, String regex) { + return s.matches(regex); + } + +} diff --git a/pdf-as-common/src/main/resources/resources/messages/common.properties b/pdf-as-common/src/main/resources/resources/messages/common.properties index 8ddfe312..0a7f1787 100644 --- a/pdf-as-common/src/main/resources/resources/messages/common.properties +++ b/pdf-as-common/src/main/resources/resources/messages/common.properties @@ -25,6 +25,7 @@ error.pdf.stamp.09=no suitable placeholder found and STRICT matching mode reques error.pdf.stamp.10=no stamper available error.pdf.stamp.11=Failed to calculate page length +error.invalid.signature.parameter.01=Signature block parameter is invalid #Signature errors error.pdf.sig.01=Failed to create signature error.pdf.sig.02=Failed to open keystore diff --git a/pdf-as-legacy/build.gradle b/pdf-as-legacy/build.gradle index e82c265f..9b5d685d 100644 --- a/pdf-as-legacy/build.gradle +++ b/pdf-as-legacy/build.gradle @@ -1,4 +1,4 @@ -apply plugin: 'java' +apply plugin: 'java-library' apply plugin: 'eclipse' apply plugin: 'java-library-distribution' @@ -15,13 +15,13 @@ repositories { } dependencies { - compile project (':pdf-as-lib') - compile project (':pdf-as-moa') - compile project (':signature-standards:sigs-pkcs7detached') - compile project (':signature-standards:sigs-pades') - compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.1' - compile group: 'commons-codec', name: 'commons-codec', version: '1.8' - testCompile group: 'junit', name: 'junit', version: '4.+' + implementation project (':pdf-as-lib') + implementation project (':pdf-as-moa') + implementation project (':signature-standards:sigs-pkcs7detached') + implementation project (':signature-standards:sigs-pades') + implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.12.0' + implementation group: 'commons-codec', name: 'commons-codec', version: '1.15' + testImplementation group: 'junit', name: 'junit', version: '4.+' } task releases(type: Copy) { diff --git a/pdf-as-lib/build.gradle b/pdf-as-lib/build.gradle index 1ddc1f9a..634d7df4 100644 --- a/pdf-as-lib/build.gradle +++ b/pdf-as-lib/build.gradle @@ -1,4 +1,4 @@ -apply plugin: 'java' +apply plugin: 'java-library' apply plugin: 'eclipse' apply plugin: 'java-library-distribution' @@ -13,7 +13,8 @@ buildscript { mavenLocal() mavenCentral() } - dependencies { classpath("commons-io:commons-io:2.4") } + dependencies { classpath("commons-io:commons-io:2.8.0") } + } sourceSets { @@ -22,6 +23,11 @@ sourceSets { srcDirs = [ 'src/main/java', 'src/generated/java' ] } } + test { + java { + srcDirs = ["src/test/java"] + } + } } configurations { @@ -41,6 +47,7 @@ project.ext { task createConf(type: Zip, dependsOn: JavaPlugin.PROCESS_RESOURCES_TASK_NAME) { from 'src/configuration' + //archiveBaseName 'config' archiveName 'config.zip' destinationDir new File(projectDir, 'src/main/resources/config') } @@ -54,29 +61,30 @@ repositories { } dependencies { - compile project (':pdf-as-common') - compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.10' - compile group: 'org.apache.httpcomponents', name: 'httpmime', version: '4.5.12' - compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.12' - compile group: 'org.bouncycastle', name: 'bcprov-jdk15on', version: '1.65' - compile group: 'javax.activation', name: 'activation', version: '1.1.1' - compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.1' - compile group: 'com.google.code.gson', name: 'gson', version: '2.8.6' - compile group: 'org.bitbucket.b_c', name: 'jose4j', version: '0.7.0' - compile group: 'commons-io', name: 'commons-io', version: '2.6' - compile group: 'org.glassfish.jaxb', name: 'jaxb-runtime', version: '2.3.3' - compile 'org.apache.commons:commons-collections4:4.4' - compile group: 'ognl', name: 'ognl', version: '3.0.8' - compile files('libs/iaik_eccelerate_cms.jar') - compile files('libs/iaik_eccelerate.jar') - compile files('libs/iaik_jce_full.jar') - compile files('libs/iaik_cms.jar') - compile group: 'org.slf4j', name: 'slf4j-api', version: slf4jVersion - compile group: 'org.slf4j', name: 'jcl-over-slf4j', version: slf4jVersion + api project (':pdf-as-common') + api group: 'org.apache.commons', name: 'commons-lang3', version: '3.12.0' + api group: 'org.apache.httpcomponents', name: 'httpmime', version: '4.5.13' + api group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.13' + api group: 'org.bouncycastle', name: 'bcprov-jdk15on', version: '1.68' + api group: 'javax.activation', name: 'activation', version: '1.1.1' + api group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.1' + api group: 'com.google.code.gson', name: 'gson', version: '2.8.6' + api group: 'org.bitbucket.b_c', name: 'jose4j', version: '0.7.6' + api group: 'commons-io', name: 'commons-io', version: '2.8' + api group: 'org.glassfish.jaxb', name: 'jaxb-runtime', version: '2.3.3' + api 'org.apache.commons:commons-collections4:4.4' + api group: 'ognl', name: 'ognl', version: '3.2.19' + api files('libs/iaik_eccelerate_cms.jar') + api files('libs/iaik_eccelerate.jar') + api files('libs/iaik_jce_full.jar') + api files('libs/iaik_cms.jar') + api group: 'org.slf4j', name: 'slf4j-api', version: slf4jVersion + api group: 'org.slf4j', name: 'jcl-over-slf4j', version: slf4jVersion - compile group: 'com.google.zxing', name: 'core', version: '3.2.0' - compile group: 'com.google.zxing', name: 'javase', version: '3.2.0' - testCompile group: 'junit', name: 'junit', version: '4.+' + api group: 'com.google.zxing', name: 'core', version: '3.4.1' + api group: 'com.google.zxing', name: 'javase', version: '3.4.1' + testImplementation group: 'junit', name: 'junit', version: '4.+' + testCompile "junit:junit:4.11" ws group: 'org.apache.cxf', name: 'cxf-tools', version: cxfVersion ws group: 'org.apache.cxf', name: 'cxf-tools-wsdlto-databinding-jaxb', version: cxfVersion ws group: 'org.apache.cxf', name: 'cxf-tools-wsdlto-frontend-jaxws', version: cxfVersion diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/api/IConfigurationConstants.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/api/IConfigurationConstants.java index 610f5eba..4d6cef47 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/api/IConfigurationConstants.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/api/IConfigurationConstants.java @@ -113,6 +113,9 @@ public interface IConfigurationConstants { public static final String BG_COLOR_DETECTION = "sigblock.placement.bgcolor.detection.enabled"; public static final String SIG_PLACEMENT_DEBUG_OUTPUT = "sigblock.placement.debug.file"; + public static final String SIG_BLOCK_PARAMETER_KEY_REGEX = "sigblockparameter.key.regex"; + public static final String SIG_BLOCK_PARAMETER_VALUE_REGEX = "sigblockparameter.value.regex"; + /** * PADES Constants */ diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/api/PdfAsFactory.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/api/PdfAsFactory.java index f917de64..b2845959 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/api/PdfAsFactory.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/api/PdfAsFactory.java @@ -42,14 +42,24 @@ import javax.activation.DataSource; import javax.crypto.Cipher; import java.awt.*; import java.awt.image.BufferedImage; -import java.io.*; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.lang.management.ManagementFactory; import java.lang.management.OperatingSystemMXBean; import java.lang.management.RuntimeMXBean; +import java.net.URL; +import java.net.URLClassLoader; import java.security.Provider; import java.security.Security; +import java.util.Enumeration; import java.util.Map; import java.util.Map.Entry; +import java.util.jar.Attributes; +import java.util.jar.Manifest; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; @@ -347,7 +357,12 @@ public class PdfAsFactory implements IConfigurationConstants { */ public static String getSCMRevision() { Package pack = PdfAsFactory.class.getPackage(); - return pack.getSpecificationVersion(); + String specificationVersion = pack.getSpecificationVersion(); + + if(specificationVersion != null) + return specificationVersion; + //fallback + return getJarAttributes().getValue("Specification-Version"); } /** @@ -356,8 +371,39 @@ public class PdfAsFactory implements IConfigurationConstants { * @return PDF-AS Verison string */ public static String getVersion() { + Package pack = PdfAsFactory.class.getPackage(); - return pack.getImplementationVersion(); + String version = pack.getImplementationVersion(); + if(version != null) + return version; + //fallback + return getJarAttributes().getValue("Implementation-Version"); + } + + private static Attributes jarAttributes = null; + private static Attributes getJarAttributes() { + if(jarAttributes != null) + return jarAttributes; + try { + URLClassLoader cl = (URLClassLoader) PdfAsFactory.class.getClassLoader(); + Enumeration urls = cl.findResources("META-INF/MANIFEST.MF"); + URL url = null; + while (urls.hasMoreElements()) { + URL tmp = urls.nextElement(); + if (tmp.getFile().contains("pdf-as-lib")) { + //System.out.println("Found:" + tmp); + url = tmp; + } + + } + Manifest manifest = new Manifest(url.openStream()); + Attributes mainAttributes = manifest.getMainAttributes(); + jarAttributes = mainAttributes; + return mainAttributes; + } catch (Exception e) { + + } + return new Attributes(); } /** diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/api/PdfAsParameter.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/api/PdfAsParameter.java index c2368255..5a646505 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/api/PdfAsParameter.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/api/PdfAsParameter.java @@ -23,6 +23,8 @@ ******************************************************************************/ package at.gv.egiz.pdfas.lib.api; +import at.gv.egiz.pdfas.common.exceptions.PdfAsException; + import java.util.Map; import javax.activation.DataSource; @@ -80,4 +82,18 @@ public interface PdfAsParameter { * @param map the map */ public void setPreprocessorArguments(Map map); + + /** + * Sets the dynamic signature-block values. + * + * @param map the map + */ + public void setDynamicSignatureBlockArguments(Map map) throws PdfAsException; + + /** + * Gets the dynamic signature-block values. + * + * @return the dynamic signature-block values + */ + public Map getDynamicSignatureBlockArguments(); } diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java index 324712cb..bca1ff2b 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java @@ -23,6 +23,7 @@ ******************************************************************************/ package at.gv.egiz.pdfas.lib.impl; +import at.gv.egiz.pdfas.lib.impl.status.PDFObject; import iaik.x509.X509Certificate; import java.awt.Image; @@ -144,7 +145,10 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants, IPdfSigner signer = backend.getPdfSigner(); - status.setPdfObject(signer.buildPDFObject(status)); + + PDFObject pdfObject = signer.buildPDFObject(status); + + status.setPdfObject(pdfObject); // set Original PDF Document Data status.getPdfObject() diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsParameterImpl.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsParameterImpl.java index fb737c13..1929f95e 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsParameterImpl.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsParameterImpl.java @@ -23,11 +23,16 @@ ******************************************************************************/ package at.gv.egiz.pdfas.lib.impl; +import java.util.Collections; +import java.util.HashMap; import java.util.Map; import javax.activation.DataSource; +import at.gv.egiz.pdfas.common.exceptions.PdfAsException; +import at.gv.egiz.pdfas.common.utils.CheckSignatureBlockParameters; import at.gv.egiz.pdfas.lib.api.Configuration; +import at.gv.egiz.pdfas.lib.api.IConfigurationConstants; import at.gv.egiz.pdfas.lib.api.PdfAsParameter; public class PdfAsParameterImpl implements PdfAsParameter { @@ -36,7 +41,7 @@ protected Configuration configuration; protected DataSource dataSource; protected String transactionId; protected Map preProcessorProps; - + protected Map dynamicSignatureBlockArgumentsMap; public PdfAsParameterImpl(Configuration configuration, DataSource dataSource) { this.configuration = configuration; @@ -77,4 +82,24 @@ protected Configuration configuration; public void setPreprocessorArguments(Map map) { this.preProcessorProps = map; } + + @Override + public void setDynamicSignatureBlockArguments(Map map) throws PdfAsException { + if(map == null) + map = new HashMap(); + Map tmpMap = Collections.unmodifiableMap(map); + String keyRegex = configuration.getValue(IConfigurationConstants.SIG_BLOCK_PARAMETER_KEY_REGEX); + String valueRegex = configuration.getValue(IConfigurationConstants.SIG_BLOCK_PARAMETER_VALUE_REGEX); + if( CheckSignatureBlockParameters.checkSignatureBlockParameterMapIsValid(tmpMap, keyRegex, valueRegex) == true) { + this.dynamicSignatureBlockArgumentsMap = tmpMap; + }else{ + throw new PdfAsException("error.invalid.signature.parameter.01"); + } + + } + + @Override + public Map getDynamicSignatureBlockArguments() { + return this.dynamicSignatureBlockArgumentsMap; + } } diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/placeholder/PlaceholderExtractor.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/placeholder/PlaceholderExtractor.java index 4c352b90..0a55b834 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/placeholder/PlaceholderExtractor.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/placeholder/PlaceholderExtractor.java @@ -3,6 +3,10 @@ package at.gv.egiz.pdfas.lib.impl.placeholder; import at.gv.egiz.pdfas.common.exceptions.PdfAsException; import at.gv.egiz.pdfas.lib.impl.status.PDFObject; +import java.util.List; + public interface PlaceholderExtractor { SignaturePlaceholderData extract(PDFObject doc, String placeholderId, int matchMode) throws PdfAsException; + + List extractList(PDFObject pdfObject, String placeholderID, int placeholderMode) throws PdfAsException; } diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/placeholder/PlaceholderFilter.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/placeholder/PlaceholderFilter.java index 500b9e24..99c09295 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/placeholder/PlaceholderFilter.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/placeholder/PlaceholderFilter.java @@ -24,6 +24,7 @@ package at.gv.egiz.pdfas.lib.impl.placeholder; import java.io.IOException; +import java.util.List; import at.gv.egiz.pdfas.common.exceptions.PDFASError; import at.gv.egiz.pdfas.common.exceptions.PdfAsErrorCarrier; @@ -102,4 +103,66 @@ public class PlaceholderFilter implements IConfigurationConstants, return null; } + public static List checkPlaceholderSignatureLocationList(OperationStatus status, ISettings settings, String signatureLocation) throws PdfAsException, + IOException { + String placeholderID; + + if (status.getPlaceholderConfiguration().isGlobalPlaceholderEnabled()) { + PlaceholderExtractor extractor = status.getBackend().getPlaceholderExtractor(); + + if(StringUtils.isNotEmpty(signatureLocation)) { + placeholderID = signatureLocation; + } else { + placeholderID = PlaceholderWebConfiguration.getValue(PLACEHOLDER_WEB_ID); + if(StringUtils.isEmpty(placeholderID)) { + placeholderID = settings.getValue(PLACEHOLDER_ID); + } + } + + String placeholderModeString = settings.getValue(PLACEHOLDER_MODE); + int placeholderMode = PLACEHOLDER_MATCH_MODE_MODERATE; + if (StringUtils.isNotEmpty(placeholderModeString)) { + try { + placeholderMode = Integer.parseInt(placeholderModeString); + if (placeholderMode < PLACEHOLDER_MODE_MIN + || placeholderMode > PLACEHOLDER_MODE_MAX) { + throw new PdfAsErrorCarrier(new PDFASError( + PDFASError.ERROR_INVALID_PLACEHOLDER_MODE)); + } + } catch (NumberFormatException e) { + throw new PdfAsErrorCarrier(new PDFASError( + PDFASError.ERROR_INVALID_PLACEHOLDER_MODE, e)); + } + } + return extractor.extractList(status.getPdfObject(), placeholderID, + placeholderMode); + + } else if (status.getPlaceholderConfiguration().isProfileConfigurationEnabled(status.getRequestedSignature().getSignatureProfileID())) { + //filter for local placeholder in selected profiles + PlaceholderExtractor extractor = status.getBackend().getPlaceholderExtractor(); + int placeholderMode = PLACEHOLDER_MATCH_MODE_SORTED; + + placeholderID = status.getPlaceholderConfiguration().getProfilePlaceholderID(status.getRequestedSignature().getSignatureProfileID()); + if(StringUtils.isNotEmpty(placeholderID)) { + placeholderMode = PLACEHOLDER_MATCH_MODE_MODERATE; + } + String placeholderModeString = settings.getValue(PLACEHOLDER_MODE); + if (StringUtils.isNotEmpty(placeholderModeString)) { + try { + placeholderMode = Integer.parseInt(placeholderModeString); + if (placeholderMode < PLACEHOLDER_MODE_MIN + || placeholderMode > PLACEHOLDER_MODE_MAX) { + throw new PdfAsErrorCarrier(new PDFASError( + PDFASError.ERROR_INVALID_PLACEHOLDER_MODE)); + } + } catch (NumberFormatException e) { + throw new PdfAsErrorCarrier(new PDFASError( + PDFASError.ERROR_INVALID_PLACEHOLDER_MODE, e)); + } + } + return extractor.extractList(status.getPdfObject(), placeholderID, + placeholderMode); + } + return null; + } } \ No newline at end of file diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/CertificateAndRequestParameterResolver.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/CertificateAndRequestParameterResolver.java new file mode 100644 index 00000000..c53a9a4f --- /dev/null +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/CertificateAndRequestParameterResolver.java @@ -0,0 +1,99 @@ +/******************************************************************************* + * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria + * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a + * joint initiative of the Federal Chancellery Austria and Graz University of + * Technology. + * + * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by + * the European Commission - subsequent versions of the EUPL (the "Licence"); + * You may not use this work except in compliance with the Licence. + * You may obtain a copy of the Licence at: + * http://www.osor.eu/eupl/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the Licence is distributed on an "AS IS" basis, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the Licence for the specific language governing permissions and + * limitations under the Licence. + * + * This product combines work with different licenses. See the "NOTICE" text + * file for details on the various modules and licenses. + * The "NOTICE" text file is part of the distribution. Any derivative works + * that you distribute must include a readable copy of the "NOTICE" text file. + ******************************************************************************/ +package at.gv.egiz.pdfas.lib.impl.stamping; + +import at.gv.egiz.pdfas.common.settings.IProfileConstants; +import at.gv.egiz.pdfas.common.settings.SignatureProfileSettings; +import at.gv.egiz.pdfas.common.utils.DNUtils; +import at.gv.egiz.pdfas.common.utils.OgnlUtils; +import at.gv.egiz.pdfas.lib.impl.status.OperationStatus; +import iaik.x509.X509Certificate; +import ognl.AbstractMemberAccess; +import ognl.MemberAccess; +import ognl.OgnlContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.naming.InvalidNameException; +import java.lang.reflect.Member; +import java.lang.reflect.Modifier; +import java.util.HashMap; +import java.util.Map; + +public class CertificateAndRequestParameterResolver implements IResolver { + + private static final Logger logger = LoggerFactory.getLogger(CertificateAndRequestParameterResolver.class); + + private OgnlContext ctx; + private X509Certificate certificate; + + public CertificateAndRequestParameterResolver(X509Certificate certificate, OperationStatus operationStatus) { + this.certificate = certificate; + + MemberAccess memberAccess = new AbstractMemberAccess() { + @Override + public boolean isAccessible(Map context, Object target, Member member, String propertyName) { + int modifiers = member.getModifiers(); + return Modifier.isPublic(modifiers); + } + }; + + this.ctx = new OgnlContext(null, null, memberAccess); + + this.ctx = new OgnlContext(null, null, memberAccess); + Map map = operationStatus.getSignParamter().getDynamicSignatureBlockArguments(); + if(map == null) + map = new HashMap<>(); + this.ctx.put(IProfileConstants.SIGNATURE_BLOCK_PARAMETER, map); + + this.ctx.put("sn", this.certificate.getSerialNumber().toString()); + + try { + Map issuerDNMap = DNUtils.dnToMap(certificate.getIssuerDN().getName()); + this.ctx.put("issuer", issuerDNMap); + } catch (InvalidNameException e) { + logger.warn("Failed to build issuer Map", e); + } + + try { + Map subjectDNMap = DNUtils.dnToMap(certificate.getSubjectDN().getName()); + this.ctx.put("subject", subjectDNMap); + } catch (InvalidNameException e) { + logger.warn("Failed to build subject Map", e); + } + + Map iuiMap = new HashMap(); + try { + iuiMap.put("pdfVersion", operationStatus.getPdfObject().getPDFVersion()); + } catch(Throwable e) { + logger.warn("Cannot determine pdfVersion: " + e.getMessage()); + } + this.ctx.put("iui", iuiMap); + } + + public String resolve(String key, String value, SignatureProfileSettings settings) { + return OgnlUtils.resolvsOgnlExpression(value, this.ctx); + } + +} diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/CertificateResolver.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/CertificateResolver.java index edb87eb2..d7d83b34 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/CertificateResolver.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/CertificateResolver.java @@ -28,11 +28,17 @@ import at.gv.egiz.pdfas.common.utils.DNUtils; import at.gv.egiz.pdfas.common.utils.OgnlUtils; import at.gv.egiz.pdfas.lib.impl.status.OperationStatus; import iaik.x509.X509Certificate; +import ognl.AbstractMemberAccess; +import ognl.MemberAccess; +import ognl.Ognl; import ognl.OgnlContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.naming.InvalidNameException; + +import java.lang.reflect.Member; +import java.lang.reflect.Modifier; import java.util.HashMap; import java.util.Map; @@ -45,7 +51,16 @@ public class CertificateResolver implements IResolver { public CertificateResolver(X509Certificate certificate, OperationStatus operationStatus) { this.certificate = certificate; - this.ctx = new OgnlContext(); + + MemberAccess memberAccess = new AbstractMemberAccess() { + @Override + public boolean isAccessible(Map context, Object target, Member member, String propertyName) { + int modifiers = member.getModifiers(); + return Modifier.isPublic(modifiers); + } + }; + + this.ctx = new OgnlContext(null, null, memberAccess); this.ctx.put("sn", this.certificate.getSerialNumber().toString()); diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/RequestParameterResolver.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/RequestParameterResolver.java new file mode 100644 index 00000000..a4e88682 --- /dev/null +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/RequestParameterResolver.java @@ -0,0 +1,38 @@ +package at.gv.egiz.pdfas.lib.impl.stamping; + +import java.lang.reflect.Member; +import java.lang.reflect.Modifier; +import java.util.Map; + +import at.gv.egiz.pdfas.common.settings.IProfileConstants; +import at.gv.egiz.pdfas.common.settings.SignatureProfileSettings; +import at.gv.egiz.pdfas.common.utils.OgnlUtils; +import ognl.AbstractMemberAccess; +import ognl.MemberAccess; +import ognl.OgnlContext; + + +public class RequestParameterResolver implements IResolver { + + private OgnlContext ctx; + + public RequestParameterResolver(Map requestParameters) { + + MemberAccess memberAccess = new AbstractMemberAccess() { + @Override + public boolean isAccessible(Map context, Object target, Member member, String propertyName) { + int modifiers = member.getModifiers(); + return Modifier.isPublic(modifiers); + } + }; + + this.ctx = new OgnlContext(null, null, memberAccess); + this.ctx.put(IProfileConstants.SIGNATURE_BLOCK_PARAMETER, requestParameters); + } + + @Override + public String resolve(String key, String value, SignatureProfileSettings settings) { + return OgnlUtils.resolvsOgnlExpression(value, this.ctx); + } + +} diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/TableFactory.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/TableFactory.java index 01a3a298..2908cfcd 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/TableFactory.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/TableFactory.java @@ -221,19 +221,23 @@ public class TableFactory implements IProfileConstants { row.add(entry); } } - if ((TYPE_VALUE + TYPE_CAPTION).equals(type) || (TYPE_CAPTION + TYPE_VALUE).equals(type)) + + if ((TYPE_VALUE + TYPE_CAPTION).equals(type) || (TYPE_CAPTION + TYPE_VALUE).equals(type) || "req".equals(type)) { // add a caption value pair String caption = profile.getCaption(key); String value = profile.getValue(key); //String caption = getSigCaption(key); //String value = getSigValue(key); - if (value != null) - { + + ValueResolver resolver = new ValueResolver(certProvider, operationStatus); + + if (value != null) { Entry c_entry = new Entry(Entry.TYPE_CAPTION, caption, key); c_entry.setNoWrap(true); // dferbas fix bug #331 c_entry.setStyle(defaultCaptionStyle_); - ValueResolver resolver = new ValueResolver(certProvider, operationStatus); + + Entry v_entry = new Entry(Entry.TYPE_VALUE, resolver.resolve(key, value, profile), key); v_entry.setStyle(defaultValueStyle_); @@ -248,8 +252,6 @@ public class TableFactory implements IProfileConstants { c_entry.setNoWrap(true); // dferbas fix bug #331 c_entry.setStyle(defaultCaptionStyle_); - ValueResolver resolver = new ValueResolver(certProvider, operationStatus); - Entry v_entry = new Entry(Entry.TYPE_VALUE, resolver.resolve(key, value, profile), key); v_entry.setStyle(defaultValueStyle_); diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/ValueResolver.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/ValueResolver.java index f7210036..f71b639a 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/ValueResolver.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/ValueResolver.java @@ -27,12 +27,17 @@ import at.gv.egiz.pdfas.common.settings.IProfileConstants; import at.gv.egiz.pdfas.common.settings.SignatureProfileSettings; import at.gv.egiz.pdfas.lib.impl.status.ICertificateProvider; import at.gv.egiz.pdfas.lib.impl.status.OperationStatus; + +import at.gv.egiz.pdfas.lib.impl.status.RequestedSignature; +import org.apache.commons.lang3.RandomStringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.nio.charset.Charset; import java.text.SimpleDateFormat; import java.util.Calendar; +import java.util.HashMap; +import java.util.Map; import java.util.TimeZone; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -56,13 +61,12 @@ public class ValueResolver implements IProfileConstants, IResolver { private static final Charset UTF_8 = Charset.forName("UTF-8"); - private CertificateResolver certificateResolver; - + private IResolver internalResolver; public ValueResolver(ICertificateProvider certProvider, OperationStatus operationStatus) { - certificateResolver = new CertificateResolver( - certProvider.getCertificate(), operationStatus); + internalResolver = new CertificateAndRequestParameterResolver(certProvider.getCertificate(), + operationStatus); } - + public String resolve(String key, String value, SignatureProfileSettings settings) { @@ -102,11 +106,16 @@ public class ValueResolver implements IProfileConstants, IResolver { do { int idx = matcher.start(0); int idxe = matcher.end(0); - result += value.substring(curidx, idx); + String tmp1 = value.substring(curidx, idx); + result += tmp1; curidx = idxe; - result += certificateResolver.resolve(key, - matcher.group(1), settings); + String tmpValue = matcher.group(1); + String tmp2 = internalResolver.resolve(key, tmpValue, settings); + result += tmp2; } while (matcher.find()); + if(value.length() > curidx){ + result += value.substring(curidx); + } } else { result = value; } diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/status/OperationStatus.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/status/OperationStatus.java index ecdddfa1..898b7a00 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/status/OperationStatus.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/status/OperationStatus.java @@ -56,6 +56,8 @@ public class OperationStatus implements Serializable { private PDFASBackend backend; private Map metaInformations = new HashMap(); +// private HashMap requestParameters = new HashMap(); + public OperationStatus(ISettings configuration, SignParameter signParameter, PDFASBackend backend) { this.configuration = configuration; this.signParamter = signParameter; @@ -174,4 +176,8 @@ public class OperationStatus implements Serializable { public Map getMetaInformations() { return metaInformations; } + +// public HashMap getRequestParameters() { +// return requestParameters; +// } } diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/status/PDFObject.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/status/PDFObject.java index de88f610..6ba7251c 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/status/PDFObject.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/status/PDFObject.java @@ -24,6 +24,8 @@ package at.gv.egiz.pdfas.lib.impl.status; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; import javax.activation.DataSource; @@ -69,4 +71,8 @@ public abstract class PDFObject { } public abstract String getPDFVersion(); + + public Map getRequestParameters() { + return status.getSignParamter().getDynamicSignatureBlockArguments(); + } } diff --git a/pdf-as-lib/src/test/java/at/gv/egiz/pdfas/lib/test/mains/SignatureBlockParameterTest.java b/pdf-as-lib/src/test/java/at/gv/egiz/pdfas/lib/test/mains/SignatureBlockParameterTest.java new file mode 100644 index 00000000..23422e8e --- /dev/null +++ b/pdf-as-lib/src/test/java/at/gv/egiz/pdfas/lib/test/mains/SignatureBlockParameterTest.java @@ -0,0 +1,87 @@ +package at.gv.egiz.pdfas.lib.test.mains; + +import at.gv.egiz.pdfas.common.settings.DefaultSignatureProfileSettings; +import at.gv.egiz.pdfas.common.utils.CheckSignatureBlockParameters; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertFalse; +@RunWith(JUnit4.class) +public class SignatureBlockParameterTest { + + @Test + public void testKeyInvalid() { + assertFalse(checkValid( "aaaaaaaaaaaaaaaaaaaaa" , "^([A-za-z]){1,20}$")); + assertFalse(checkValid( "" , "^([A-za-z]){1,20}$")); + assertFalse(checkValid( "a9" , "^([A-za-z]){1,20}$")); + } + + @Test + public void testKeyValid() { + assertTrue(checkValid( "aaa" +"aa", "^([A-za-z]){1,20}$")); + assertTrue(checkValid( "aaa" , "^([A-za-z]){1,20}$")); + assertTrue(checkValid( "aaaaaaaaaaaaaaaaaaaa", "^([A-za-z]){1,20}$")); + assertTrue(checkValid( "AA", "^([A-za-z]){1,20}$")); + } + + @Test + public void testValueValid() { + assertTrue(checkValid( "aaa" +"aa", "^([\\p{Print}]){1,100}$")); + assertTrue(checkValid( "aaa" , "^([\\p{Print}]){1,100}$")); + assertTrue(checkValid( "a!\"$%&/()[]=?aa-_,;.:[]|{}" , "^([\\p{Print}]){1,100}$")); +// assertTrue(checkValid( "a!\"§$%&/()=?aa" , "^([\\p{Print}]){1,100}$")); + assertTrue(checkValid( "aa!%&/()=?a" , "^([\\p{Print}]){1,100}$")); + assertTrue(checkValid( "a{\"a!%&/()=?a" , "^([\\p{Print}]){1,100}$")); + assertTrue(checkValid( "BB" , "^([\\p{Print}]){1,100}$")); + assertTrue(checkValid( "BB " , "^([\\p{Print}]){1,100}$")); + } + + @Test + public void testValueValidWithDefaultRegex() { + assertTrue(checkValid( "aaa" +"aa", DefaultSignatureProfileSettings.SIG_BLOCK_PARAMETER_DEFAULT_VALUE_REGEX)); + assertTrue(checkValid( "aaa" , DefaultSignatureProfileSettings.SIG_BLOCK_PARAMETER_DEFAULT_VALUE_REGEX)); + assertTrue(checkValid( "a!\"$%&/()[]=?aa-_,;.:[]|{}" , DefaultSignatureProfileSettings.SIG_BLOCK_PARAMETER_DEFAULT_VALUE_REGEX)); +// assertTrue(checkValid( "a!\"§$%&/()=?aa" , DefaultSignatureProfileSettings.SIG_BLOCK_PARAMETER_DEFAULT_VALUE_REGEX)); + assertTrue(checkValid( "aa!%&/()=?a" , DefaultSignatureProfileSettings.SIG_BLOCK_PARAMETER_DEFAULT_VALUE_REGEX)); + assertTrue(checkValid( "a{\"a!%&/()=?a" , DefaultSignatureProfileSettings.SIG_BLOCK_PARAMETER_DEFAULT_VALUE_REGEX)); + assertTrue(checkValid( "BB" , DefaultSignatureProfileSettings.SIG_BLOCK_PARAMETER_DEFAULT_VALUE_REGEX)); + assertTrue(checkValid( "BB " , DefaultSignatureProfileSettings.SIG_BLOCK_PARAMETER_DEFAULT_VALUE_REGEX)); + assertTrue(checkValid("! €%&/()?`$\"§", DefaultSignatureProfileSettings.SIG_BLOCK_PARAMETER_DEFAULT_VALUE_REGEX)); + assertTrue(checkValid("€", DefaultSignatureProfileSettings.SIG_BLOCK_PARAMETER_DEFAULT_VALUE_REGEX)); + assertTrue(checkValid("$", DefaultSignatureProfileSettings.SIG_BLOCK_PARAMETER_DEFAULT_VALUE_REGEX)); + assertTrue(checkValid("! €\"§$%&/()=?`", DefaultSignatureProfileSettings.SIG_BLOCK_PARAMETER_DEFAULT_VALUE_REGEX)); + assertTrue(checkValid("#", DefaultSignatureProfileSettings.SIG_BLOCK_PARAMETER_DEFAULT_VALUE_REGEX)); + assertTrue(checkValid("-_", DefaultSignatureProfileSettings.SIG_BLOCK_PARAMETER_DEFAULT_VALUE_REGEX)); + assertTrue(checkValid("'", DefaultSignatureProfileSettings.SIG_BLOCK_PARAMETER_DEFAULT_VALUE_REGEX)); + assertTrue(checkValid("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#-_ß?+#*", + DefaultSignatureProfileSettings.SIG_BLOCK_PARAMETER_DEFAULT_VALUE_REGEX)); + } + + @Test + public void testValueInvalid() { + assertFalse(checkValid((char) 13 +"aaa" +"aa", "^([\\p{Print}]){1,100}$")); + assertFalse(checkValid((char) 13 +"", "^([\\p{Print}]){1,100}$")); + assertFalse(checkValid( "aaa" +(char) 13, "^([\\p{Print}]){1,100}$")); + assertFalse(checkValid("", "^([\\p{Print}]){1,100}$")); + assertFalse(checkValid("a", "^([\\p{Print}]){2,100}$")); + assertFalse(checkValid("aaa"+(char) 13 +"aa", "^([\\p{Print}]){1,100}$")); + } + + @Test + public void testUmlauteValid() { + assertTrue(checkValid( "ä", DefaultSignatureProfileSettings.SIG_BLOCK_PARAMETER_DEFAULT_VALUE_REGEX)); + assertTrue(checkValid( "ö", DefaultSignatureProfileSettings.SIG_BLOCK_PARAMETER_DEFAULT_VALUE_REGEX)); + assertTrue(checkValid( "ü", DefaultSignatureProfileSettings.SIG_BLOCK_PARAMETER_DEFAULT_VALUE_REGEX)); + assertTrue(checkValid( "Ä", DefaultSignatureProfileSettings.SIG_BLOCK_PARAMETER_DEFAULT_VALUE_REGEX)); + assertTrue(checkValid( "Ö", DefaultSignatureProfileSettings.SIG_BLOCK_PARAMETER_DEFAULT_VALUE_REGEX)); + assertTrue(checkValid( "Ü", DefaultSignatureProfileSettings.SIG_BLOCK_PARAMETER_DEFAULT_VALUE_REGEX)); + assertTrue(checkValid( "ÄÖÜöäüjhsbdjej", DefaultSignatureProfileSettings.SIG_BLOCK_PARAMETER_DEFAULT_VALUE_REGEX)); + assertTrue(checkValid( "aauacnhuisdc Ä Ü Ö aaxsa ö aÜaÖa", DefaultSignatureProfileSettings.SIG_BLOCK_PARAMETER_DEFAULT_VALUE_REGEX)); + assertTrue(checkValid( "NMS Güssing", DefaultSignatureProfileSettings.SIG_BLOCK_PARAMETER_DEFAULT_VALUE_REGEX)); + } + + public boolean checkValid(String s, String regex) { + return CheckSignatureBlockParameters.isValid(s, regex); + } +} diff --git a/pdf-as-moa/build.gradle b/pdf-as-moa/build.gradle index 5e9db4c0..62fa9530 100644 --- a/pdf-as-moa/build.gradle +++ b/pdf-as-moa/build.gradle @@ -1,4 +1,4 @@ -apply plugin: 'java' +apply plugin: 'java-library' apply plugin: 'eclipse' apply plugin: 'java-library-distribution' @@ -45,15 +45,16 @@ repositories { } dependencies { - compile project (':pdf-as-lib') - compile group: 'org.slf4j', name: 'slf4j-api', version: slf4jVersion - compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.1' - testCompile group: 'junit', name: 'junit', version: '4.+' + implementation project (':pdf-as-lib') + implementation group: 'org.slf4j', name: 'slf4j-api', version: slf4jVersion + implementation group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.1' + testImplementation group: 'junit', name: 'junit', version: '4.+' ws group: 'org.apache.cxf', name: 'cxf-tools', version: cxfVersion ws group: 'org.apache.cxf', name: 'cxf-tools-wsdlto-databinding-jaxb', version: cxfVersion ws group: 'org.apache.cxf', name: 'cxf-tools-wsdlto-frontend-jaxws', version: cxfVersion - compile group: 'javax.xml.ws', name: 'jaxws-api', version: '2.3.1' - compile group: 'org.glassfish.jaxb', name: 'jaxb-runtime', version: '2.3.3'} + api group: 'javax.xml.ws', name: 'jaxws-api', version: '2.3.1' + api group: 'javax.jws', name: 'javax.jws-api', version: '1.1' + api group: 'org.glassfish.jaxb', name: 'jaxb-runtime', version: '2.3.3'} task wsdl2Java() { if (!wsdlDir.listFiles()) { diff --git a/pdf-as-pdfbox-2/build.gradle b/pdf-as-pdfbox-2/build.gradle index 282c7a9e..66c003ec 100644 --- a/pdf-as-pdfbox-2/build.gradle +++ b/pdf-as-pdfbox-2/build.gradle @@ -1,4 +1,4 @@ -apply plugin: 'java' +apply plugin: 'java-library' apply plugin: 'eclipse' jar { @@ -30,19 +30,20 @@ releases.dependsOn jar releases.dependsOn sourcesJar dependencies { - compile project (':pdf-as-lib') - compile group: 'org.slf4j', name: 'slf4j-api', version: slf4jVersion - compile 'org.slf4j:jcl-over-slf4j:1.7.18' - compile group: 'org.apache.pdfbox', name: 'pdfbox', version: '2.0.21' - compile group: 'org.apache.pdfbox', name: 'pdfbox-tools', version: '2.0.21' - compile group: 'org.apache.pdfbox', name: 'preflight', version: '2.0.21' - compile group: 'commons-io', name: 'commons-io', version: '2.4' - compile group: 'ognl', name: 'ognl', version: '3.0.6' - testCompile group: 'junit', name: 'junit', version: '4.+' - compile group: 'com.github.jai-imageio', name: 'jai-imageio-jpeg2000', version: '1.3.0' - compile group: 'com.github.jai-imageio', name: 'jai-imageio-core', version: '1.4.0' - compile group: 'com.levigo.jbig2', name: 'levigo-jbig2-imageio', version: '1.6.5' - compile group: 'javax.activation', name: 'activation', version: '1.1.1' + implementation project (':pdf-as-lib') + implementation group: 'org.slf4j', name: 'slf4j-api', version: slf4jVersion + implementation 'org.slf4j:jcl-over-slf4j:1.7.30' + api group: 'org.apache.pdfbox', name: 'pdfbox', version: '2.0.23' + api group: 'org.apache.pdfbox', name: 'pdfbox-tools', version: '2.0.23' + api group: 'org.apache.pdfbox', name: 'preflight', version: '2.0.23' + implementation group: 'commons-io', name: 'commons-io', version: '2.8' + implementation group: 'ognl', name: 'ognl', version: '3.2.19' + testImplementation group: 'junit', name: 'junit', version: '4.+' + + api group: 'com.github.jai-imageio', name: 'jai-imageio-jpeg2000', version: '1.4.0' + api group: 'com.github.jai-imageio', name: 'jai-imageio-core', version: '1.4.0' + api group: 'com.levigo.jbig2', name: 'levigo-jbig2-imageio', version: '2.0' + implementation group: 'javax.activation', name: 'activation', version: '1.1.1' } diff --git a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/placeholder/PDFBoxPlaceholderExtractor.java b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/placeholder/PDFBoxPlaceholderExtractor.java index 256400a0..63b006bf 100644 --- a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/placeholder/PDFBoxPlaceholderExtractor.java +++ b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/placeholder/PDFBoxPlaceholderExtractor.java @@ -1,19 +1,47 @@ package at.gv.egiz.pdfas.lib.impl.pdfbox2.placeholder; +import at.gv.egiz.pdfas.common.exceptions.PDFIOException; import at.gv.egiz.pdfas.common.exceptions.PdfAsException; import at.gv.egiz.pdfas.lib.impl.pdfbox2.PDFBOXObject; import at.gv.egiz.pdfas.lib.impl.placeholder.PlaceholderExtractor; import at.gv.egiz.pdfas.lib.impl.placeholder.SignaturePlaceholderData; import at.gv.egiz.pdfas.lib.impl.status.PDFObject; +import java.io.IOException; +import java.util.List; + public class PDFBoxPlaceholderExtractor implements PlaceholderExtractor { + @Override public SignaturePlaceholderData extract(PDFObject doc, String placeholderId, int matchMode) throws PdfAsException { if (doc instanceof PDFBOXObject) { PDFBOXObject object = (PDFBOXObject) doc; - return SignaturePlaceholderExtractor.extract(object.getDocument(), - placeholderId, matchMode); + try { + SignaturePlaceholderExtractor extractor = new SignaturePlaceholderExtractor(placeholderId, + matchMode, object.getDocument()); + return extractor.extract(object.getDocument(), + placeholderId, matchMode); + } catch (IOException | ClassNotFoundException | InstantiationException | IllegalAccessException e2) { + throw new PDFIOException("error.pdf.io.04", e2); + } + + } + throw new PdfAsException("INVALID STATE"); + } + + @Override + public List extractList(PDFObject doc, String placeholderId, int matchMode) throws PdfAsException { + if (doc instanceof PDFBOXObject) { + PDFBOXObject object = (PDFBOXObject) doc; + try { + SignaturePlaceholderExtractor extractor = new SignaturePlaceholderExtractor(placeholderId, + matchMode, object.getDocument()); + return extractor.extractList(object.getDocument(), + placeholderId, matchMode); + } catch (IOException | ClassNotFoundException | InstantiationException | IllegalAccessException e2) { + throw new PDFIOException("error.pdf.io.04", e2); + } } throw new PdfAsException("INVALID STATE"); } diff --git a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/placeholder/SignaturePlaceholderExtractor.java b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/placeholder/SignaturePlaceholderExtractor.java index 8a2c1cff..4031d07f 100644 --- a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/placeholder/SignaturePlaceholderExtractor.java +++ b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/placeholder/SignaturePlaceholderExtractor.java @@ -103,11 +103,11 @@ public class SignaturePlaceholderExtractor extends PDFStreamEngine implements Pl private static Logger logger = LoggerFactory .getLogger(SignaturePlaceholderExtractor.class); - private static List placeholders = new ArrayList<>(); + private List placeholders = new ArrayList<>(); private int currentPage = 0; private PDDocument doc; - private SignaturePlaceholderExtractor(String placeholderId, + protected SignaturePlaceholderExtractor(String placeholderId, int placeholderMatchMode, PDDocument doc) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException { super(); @@ -126,9 +126,9 @@ public class SignaturePlaceholderExtractor extends PDFStreamEngine implements Pl this.doc = doc; } - public static List getPlaceholders() { - return placeholders; - } +// public static List getPlaceholders() { +// return placeholders; +// } /** @@ -136,38 +136,36 @@ public class SignaturePlaceholderExtractor extends PDFStreamEngine implements Pl * additional info.
* Searches only for the first placeholder page after page from top. * - * @param inputStream * @return all available info from the first found placeholder. - * @throws PDFDocumentException + * @throws PdfAsException * if the document could not be read. * @throws PlaceholderExtractionException * if STRICT matching mode was requested and no suitable * placeholder could be found. */ - public static SignaturePlaceholderData extract(PDDocument doc, + public SignaturePlaceholderData extract(PDDocument doc, String placeholderId, int matchMode) throws PdfAsException { SignaturePlaceholderContext.setSignaturePlaceholderData(null); - - SignaturePlaceholderExtractor extractor; - try { - extractor = new SignaturePlaceholderExtractor(placeholderId, - matchMode, doc); - } catch (IOException | ClassNotFoundException | InstantiationException | IllegalAccessException e2) { - throw new PDFIOException("error.pdf.io.04", e2); - } +// SignaturePlaceholderExtractor extractor; +// try { +// extractor = new SignaturePlaceholderExtractor(placeholderId, +// matchMode, doc); +// } catch (IOException | ClassNotFoundException | InstantiationException | IllegalAccessException e2) { +// throw new PDFIOException("error.pdf.io.04", e2); +// } int pageNr = 0; for(PDPage page : doc.getPages()){ pageNr++; try { - extractor.setCurrentPage(pageNr); + setCurrentPage(pageNr); if(page.getContents() != null && page.getResources() != null && page.getContentStreams() != null) { - extractor.processPage(page); //TODO: pdfbox2 - right? + processPage(page); //TODO: pdfbox2 - right? } SignaturePlaceholderData ret = matchPlaceholderPage( - extractor.placeholders, placeholderId, matchMode); + placeholders, placeholderId, matchMode); if (ret != null) { SignaturePlaceholderContext .setSignaturePlaceholderData(ret); @@ -179,9 +177,9 @@ public class SignaturePlaceholderExtractor extends PDFStreamEngine implements Pl throw new PDFIOException("error.pdf.io.04", e); } } - if (extractor.placeholders.size() > 0) { + if (placeholders.size() > 0) { SignaturePlaceholderData ret = matchPlaceholderDocument( - extractor.placeholders, placeholderId, matchMode); + placeholders, placeholderId, matchMode); SignaturePlaceholderContext.setSignaturePlaceholderData(ret); return ret; } @@ -193,7 +191,56 @@ public class SignaturePlaceholderExtractor extends PDFStreamEngine implements Pl return null; } - private static SignaturePlaceholderData matchPlaceholderDocument( + public List extractList(PDDocument doc, + String placeholderId, int matchMode) throws PdfAsException { + SignaturePlaceholderContext.setSignaturePlaceholderData(null); +// List placeholders = new ArrayList<>(); +// SignaturePlaceholderExtractor extractor; +// try { +// extractor = new SignaturePlaceholderExtractor(placeholderId, +// matchMode, doc); +// } catch (IOException | ClassNotFoundException | InstantiationException | IllegalAccessException e2) { +// throw new PDFIOException("error.pdf.io.04", e2); +// } + + int pageNr = 0; + for(PDPage page : doc.getPages()){ + pageNr++; + + try { + setCurrentPage(pageNr); + if(page.getContents() != null && page.getResources() != null && page.getContentStreams() != null) { + processPage(page); //TODO: pdfbox2 - right? + + } + SignaturePlaceholderData ret = matchPlaceholderPage( + placeholders, placeholderId, matchMode); + if (ret != null) { + SignaturePlaceholderContext + .setSignaturePlaceholderData(ret); + return placeholders; + } + } catch (IOException e1) { + throw new PDFIOException("error.pdf.io.04", e1); + } catch(Throwable e) { + throw new PDFIOException("error.pdf.io.04", e); + } + } + if (placeholders.size() > 0) { + SignaturePlaceholderData ret = matchPlaceholderDocument( + placeholders, placeholderId, matchMode); + SignaturePlaceholderContext.setSignaturePlaceholderData(ret); + return placeholders; + } + // no placeholders found, apply strict mode if set + if (matchMode == PLACEHOLDER_MATCH_MODE_STRICT) { + throw new PlaceholderExtractionException("error.pdf.stamp.09"); + } + + return null; + } + + private SignaturePlaceholderData matchPlaceholderDocument( List placeholders, String placeholderId, int matchMode) throws PlaceholderExtractionException { @@ -247,7 +294,7 @@ public class SignaturePlaceholderExtractor extends PDFStreamEngine implements Pl return null; } - private static SignaturePlaceholderData matchPlaceholderPage( + private SignaturePlaceholderData matchPlaceholderPage( List placeholders, String placeholderId, int matchMode) { @@ -266,6 +313,8 @@ public class SignaturePlaceholderExtractor extends PDFStreamEngine implements Pl return null; } + + private void setCurrentPage(int pageNr) { this.currentPage = pageNr; } diff --git a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/utils/PdfBoxUtils.java b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/utils/PdfBoxUtils.java index 1a6499ac..112d9a86 100644 --- a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/utils/PdfBoxUtils.java +++ b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/utils/PdfBoxUtils.java @@ -16,16 +16,26 @@ public class PdfBoxUtils { public static void checkPDFPermissions(PDDocument doc) throws PdfAsValidationException { - AccessPermission accessPermission = doc.getCurrentAccessPermission(); - if (doc.isEncrypted()) { - throw new PdfAsValidationException("error.pdf.sig.12", null); - } + if (doc.isEncrypted() || !accessPermission.isOwnerPermission()) { + //canFillInForm() + //This will tell if the user can fill in interactive form fields (including signature fields) even if + // canModifyAnnotations() returns false. - if (!accessPermission.isOwnerPermission()) { - throw new PdfAsValidationException("error.pdf.sig.12", null); + //canModifyAnnotations() + //This will tell if the user can add or modify text annotations and fill in interactive forms fields and, if + // canModify() returns true, create or modify interactive form fields (including signature fields). + if ((accessPermission.canModify() && accessPermission.canModifyAnnotations()) + || accessPermission.canFillInForm()) { + logger.debug("Document is protected, but Signing is allowed"); + + } else { + throw new PdfAsValidationException("error.pdf.sig.12", null); + + } } + } public static int countSignatures(PDDocument doc, String sigName) { diff --git a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox2/PADESPDFBOXSigner.java b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox2/PADESPDFBOXSigner.java index 0a32d7a5..3cf0853f 100644 --- a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox2/PADESPDFBOXSigner.java +++ b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox2/PADESPDFBOXSigner.java @@ -64,6 +64,7 @@ import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDDocumentCatalog; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDResources; +import org.apache.pdfbox.pdmodel.common.COSObjectable; import org.apache.pdfbox.pdmodel.common.PDMetadata; import org.apache.pdfbox.pdmodel.common.PDNumberTreeNode; import org.apache.pdfbox.pdmodel.common.PDRectangle; @@ -96,7 +97,10 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Calendar; +import java.util.Collections; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { @@ -157,9 +161,11 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { signature.setFilter(COSName.getPDFName(signer.getPDFFilter())); signature.setSubFilter(COSName.getPDFName(signer.getPDFSubFilter())); - SignaturePlaceholderData signaturePlaceholderDataInit = PlaceholderFilter.checkPlaceholderSignatureLocation(pdfObject.getStatus(), pdfObject.getStatus().getSettings(), placeholder_id); +// SignaturePlaceholderData signaturePlaceholderDataInit = + placeholders =PlaceholderFilter.checkPlaceholderSignatureLocationList(pdfObject.getStatus(), + pdfObject.getStatus().getSettings(), placeholder_id); - placeholders = SignaturePlaceholderExtractor.getPlaceholders(); +// placeholders = SignaturePlaceholderExtractor.getPlaceholders(); availablePlaceholders = listAvailablePlaceholders(placeholders, existingSignatureLocations(doc)); @@ -211,15 +217,16 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { } SignatureProfileSettings signatureProfileSettings = TableFactory .createProfile(requestedSignature.getSignatureProfileID(), pdfObject.getStatus().getSettings()); - //Check if input document is PDF-A conform + + //Check if input document is PDF-A conform if (signatureProfileSettings.isPDFA()) { DataSource origDoc = pdfObject.getOriginalDocument(); InputStream stream = origDoc.getInputStream(); //Run PreflightParser for checking conformity// //runPDFAPreflight(origDoc); } - ValueResolver resolver = new ValueResolver(requestedSignature, pdfObject.getStatus()); + String signerName = resolver.resolve("SIG_SUBJECT", signatureProfileSettings.getValue("SIG_SUBJECT"), signatureProfileSettings); @@ -508,12 +515,13 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { } } - + PDStructureElement sigBlock = new PDStructureElement("Form", docElement); // create object dictionary and add as child element COSDictionary objectDic = new COSDictionary(); objectDic.setName("Type", "OBJR"); + objectDic.setItem("Pg", signatureField.getWidget().getPage()); objectDic.setItem("Obj", signatureField.getWidget()); @@ -539,7 +547,6 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { // Modify number tree PDNumberTreeNode ntn = structureTreeRoot.getParentTree(); - int parentTreeNextKey = structureTreeRoot.getParentTreeNextKey(); if (ntn == null) { ntn = new PDNumberTreeNode(objectDic, null); logger.info("No number-tree-node found!"); @@ -547,9 +554,10 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { COSArray ntnKids = (COSArray) ntn.getCOSObject().getDictionaryObject(COSName.KIDS); COSArray ntnNumbers = (COSArray) ntn.getCOSObject().getDictionaryObject(COSName.NUMS); - - if(ntnNumbers == null && ntnKids != null){//no number array, so continue with the kids array - + + int parentTreeNextKey = getParentTreeNextKey(structureTreeRoot); + + if(ntnNumbers == null && ntnKids != null){//no number array, so continue with the kids array //create dictionary with limits and nums array COSDictionary pTreeEntry = new COSDictionary(); COSArray limitsArray = new COSArray(); @@ -628,7 +636,7 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { byte[] outputDocument = bos.toByteArray(); pdfObject.setSignedDocument(outputDocument); } - /* Check if resulting pdf is PDF-A conform */ + /* Check if resulting pdf is PDF-A conform */ if (signatureProfileSettings.isPDFA()) { runPDFAPreflight(new ByteArrayDataSource(pdfObject.getSignedDocument())); } @@ -653,7 +661,7 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { if (doc != null) { try { doc.close(); - SignaturePlaceholderExtractor.getPlaceholders().clear(); + //SignaturePlaceholderExtractor.getPlaceholders().clear(); } catch (IOException e) { logger.debug("Failed to close COS Doc!", e); // Ignore @@ -663,7 +671,23 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { } } - /** + private int getParentTreeNextKey(PDStructureTreeRoot structureTreeRoot) throws IOException { + int nextKey = structureTreeRoot.getParentTreeNextKey(); + if (nextKey < 0) { + Map destNumberTreeAsMap = getNumberTreeAsMap(structureTreeRoot.getParentTree()); + if (destNumberTreeAsMap.isEmpty()) { + nextKey = 0; + + } else { + nextKey = Collections.max(destNumberTreeAsMap.keySet()) + 1; + + } + } + + return nextKey; + } + + /** * Check via PreFlightParser if PDF-Document is a valid PDFA1 * @param signedDocument: signed Document * @throws PdfAsException @@ -914,16 +938,25 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { if(placeholders!=null) { for(int i = 0; i < placeholders.size(); ++i) { //take smallest id - if(!existingPlaceholders.contains(placeholders.get(i).getPlaceholderName())) { + if(!existingPlaceholders.contains(placeholders.get(i).getPlaceholderName())) { SignaturePlaceholderData spd = placeholders.get(i); if (spd.getId() != null) { if(result == null) { result = spd; } else { - String currentID = result.getId(); - String testID = spd.getId(); - if(testID.compareToIgnoreCase(currentID) < 0) { - result = spd; + try{ + int currentID = Integer.parseInt(result.getId()); + int testID = Integer.parseInt(spd.getId()); + if(testID < currentID) { + result = spd; + } + }catch(Exception e){ + //fallback to string compare + String currentID = result.getId(); + String testID = spd.getId(); + if(testID.compareToIgnoreCase(currentID) < 0) { + result = spd; + } } } } @@ -936,7 +969,7 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { //find first placeholder_id public List listAvailablePlaceholders(List placeholders, List existingPlaceholders) { - List result = null; + List result = new ArrayList<>(); if(placeholders!=null) { for(int i = 0; i < placeholders.size(); ++i) { @@ -948,4 +981,29 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { } return result; } + + static Map getNumberTreeAsMap(PDNumberTreeNode tree) + throws IOException + { + Map numbers = tree.getNumbers(); + if (numbers == null) + { + numbers = new LinkedHashMap<>(); + } + else + { + // must copy because the map is read only + numbers = new LinkedHashMap<>(numbers); + } + List kids = tree.getKids(); + if (kids != null) + { + for (PDNumberTreeNode kid : kids) + { + numbers.putAll(getNumberTreeAsMap(kid)); + } + } + return numbers; + } + } \ No newline at end of file diff --git a/pdf-as-pdfbox/.gitignore b/pdf-as-pdfbox/.gitignore deleted file mode 100644 index ae3c1726..00000000 --- a/pdf-as-pdfbox/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/pdf-as-pdfbox/build.gradle b/pdf-as-pdfbox/build.gradle deleted file mode 100644 index 2283057f..00000000 --- a/pdf-as-pdfbox/build.gradle +++ /dev/null @@ -1,37 +0,0 @@ -apply plugin: 'java' -apply plugin: 'eclipse' - -jar { - manifest { - attributes 'Implementation-Title': 'PDF-AS-4 PDFBOX Backend' - } -} - -repositories { - mavenCentral() -} - -task releases(type: Copy) { - from jar.outputs - into rootDir.toString() + "/releases/" + version + "/pdfbox1" -} - -releases.dependsOn jar -releases.dependsOn sourcesJar - -dependencies { - compile project (':pdf-as-lib') - compile group: 'org.slf4j', name: 'slf4j-api', version: slf4jVersion - compile 'org.slf4j:jcl-over-slf4j:1.7.18' - compile group: 'org.apache.pdfbox', name: 'pdfbox', version: '1.8.16' - compile group: 'commons-io', name: 'commons-io', version: '2.4' - compile group: 'ognl', name: 'ognl', version: '3.0.6' - compile group: 'javax.activation', name: 'activation', version: '1.1.1' - - testCompile group: 'junit', name: 'junit', version: '4.+' -} - -test { - systemProperties 'property': 'value' -} - diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox/PDFBOXBackend.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox/PDFBOXBackend.java deleted file mode 100644 index 949d5cc5..00000000 --- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox/PDFBOXBackend.java +++ /dev/null @@ -1,53 +0,0 @@ -package at.gv.egiz.pdfas.lib.impl.pdfbox; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.gv.egiz.pdfas.lib.backend.PDFASBackend; -import at.gv.egiz.pdfas.lib.impl.pdfbox.placeholder.PDFBoxPlaceholderExtractor; -import at.gv.egiz.pdfas.lib.impl.placeholder.PlaceholderExtractor; -import at.gv.egiz.pdfas.lib.impl.signing.IPdfSigner; -import at.gv.egiz.pdfas.lib.impl.signing.pdfbox.PADESPDFBOXSigner; -import at.gv.egiz.pdfas.lib.impl.verify.VerifyBackend; -import at.gv.egiz.pdfas.lib.impl.verify.pdfbox.PDFBOXVerifier; - -public class PDFBOXBackend implements PDFASBackend { - - private static final String NAME = "PDFBOX_BACKEND"; - - private static final Logger logger = LoggerFactory - .getLogger(PDFBOXBackend.class); - - static { - logger.info(" ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); - logger.info(" + PDFBOX Backend created"); - logger.info(" + PDFBOX Version used: " + org.apache.pdfbox.Version.getVersion()); - logger.info(" ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); - } - - @Override - public String getName() { - return NAME; - } - - @Override - public boolean usedAsDefault() { - return true; - } - - @Override - public IPdfSigner getPdfSigner() { - return new PADESPDFBOXSigner(); - } - - @Override - public PlaceholderExtractor getPlaceholderExtractor() { - return new PDFBoxPlaceholderExtractor(); - } - - @Override - public VerifyBackend getVerifier() { - return new PDFBOXVerifier(); - } - -} diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox/PDFBOXObject.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox/PDFBOXObject.java deleted file mode 100644 index d3babcb2..00000000 --- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox/PDFBOXObject.java +++ /dev/null @@ -1,70 +0,0 @@ -package at.gv.egiz.pdfas.lib.impl.pdfbox; - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -import javax.activation.DataSource; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.font.PDFont; - -import at.gv.egiz.pdfas.lib.impl.status.OperationStatus; -import at.gv.egiz.pdfas.lib.impl.status.PDFObject; - -public class PDFBOXObject extends PDFObject { - - private PDDocument doc; - - private Map fontCache = new HashMap(); - - public PDFBOXObject(OperationStatus operationStatus) { - super(operationStatus); - } - - @Override - protected void finalize() throws Throwable { - super.finalize(); - if(doc != null) { - doc.close(); - } - } - - public void close() { - if(doc != null) { - try { - doc.close(); - //System.gc(); - } catch(Throwable e) { - // ignore! - } - doc = null; - } - } - - public void setOriginalDocument(DataSource originalDocument) throws IOException { - this.originalDocument = originalDocument; - if(doc != null) { - doc.close(); - } - synchronized(PDDocument.class) { - this.doc = PDDocument.load(this.originalDocument.getInputStream()); - } - if(this.doc != null) { - this.doc.getDocument().setWarnMissingClose(false); - } - } - - public PDDocument getDocument() { - return this.doc; - } - - @Override - public String getPDFVersion() { - return String.valueOf(getDocument().getDocument().getVersion()); - } - - public Map getFontCache() { - return fontCache; - } -} diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox/placeholder/PDFBoxPlaceholderExtractor.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox/placeholder/PDFBoxPlaceholderExtractor.java deleted file mode 100644 index 0e4227ec..00000000 --- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox/placeholder/PDFBoxPlaceholderExtractor.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.gv.egiz.pdfas.lib.impl.pdfbox.placeholder; - -import at.gv.egiz.pdfas.common.exceptions.PdfAsException; -import at.gv.egiz.pdfas.lib.impl.pdfbox.PDFBOXObject; -import at.gv.egiz.pdfas.lib.impl.placeholder.PlaceholderExtractor; -import at.gv.egiz.pdfas.lib.impl.placeholder.SignaturePlaceholderData; -import at.gv.egiz.pdfas.lib.impl.status.PDFObject; - -public class PDFBoxPlaceholderExtractor implements PlaceholderExtractor { - - @Override - public SignaturePlaceholderData extract(PDFObject doc, - String placeholderId, int matchMode) throws PdfAsException { - if (doc instanceof PDFBOXObject) { - PDFBOXObject object = (PDFBOXObject) doc; - return SignaturePlaceholderExtractor.extract(object.getDocument(), - placeholderId, matchMode); - } - throw new PdfAsException("INVALID STATE"); - } -} diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox/placeholder/SignaturePlaceholderExtractor.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox/placeholder/SignaturePlaceholderExtractor.java deleted file mode 100644 index 54922864..00000000 --- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox/placeholder/SignaturePlaceholderExtractor.java +++ /dev/null @@ -1,477 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -/** - * Copyright 2006 by Know-Center, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - */ -package at.gv.egiz.pdfas.lib.impl.pdfbox.placeholder; - -import java.awt.geom.AffineTransform; -import java.awt.geom.NoninvertibleTransformException; -import java.awt.image.BufferedImage; -import java.io.IOException; -import java.util.HashMap; -import java.util.Hashtable; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Vector; - -import org.apache.pdfbox.cos.COSBase; -import org.apache.pdfbox.cos.COSDictionary; -import org.apache.pdfbox.cos.COSName; -import org.apache.pdfbox.exceptions.WrappedIOException; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.font.PDFont; -import org.apache.pdfbox.pdmodel.font.PDFontFactory; -import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObject; -import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage; -import org.apache.pdfbox.util.Matrix; -import org.apache.pdfbox.util.PDFOperator; -import org.apache.pdfbox.util.PDFStreamEngine; -import org.apache.pdfbox.util.ResourceLoader; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.gv.egiz.pdfas.common.exceptions.PDFIOException; -import at.gv.egiz.pdfas.common.exceptions.PdfAsException; -import at.gv.egiz.pdfas.common.exceptions.PlaceholderExtractionException; -import at.gv.egiz.pdfas.lib.impl.placeholder.PlaceholderExtractorConstants; -import at.gv.egiz.pdfas.lib.impl.placeholder.SignaturePlaceholderContext; -import at.gv.egiz.pdfas.lib.impl.placeholder.SignaturePlaceholderData; -import at.knowcenter.wag.egov.egiz.pdf.TablePos; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.BinaryBitmap; -import com.google.zxing.DecodeHintType; -import com.google.zxing.LuminanceSource; -import com.google.zxing.MultiFormatReader; -import com.google.zxing.NotFoundException; -import com.google.zxing.ReaderException; -import com.google.zxing.Result; -import com.google.zxing.client.j2se.BufferedImageLuminanceSource; -import com.google.zxing.common.HybridBinarizer; - -/** - * Extract all relevant information from a placeholder image. - * - * @author exthex - * - */ -public class SignaturePlaceholderExtractor extends PDFStreamEngine implements PlaceholderExtractorConstants{ - /** - * The log. - */ - private static Logger logger = LoggerFactory - .getLogger(SignaturePlaceholderExtractor.class); - - private List placeholders = new Vector(); - private int currentPage = 0; - private PDDocument doc; - - private SignaturePlaceholderExtractor(String placeholderId, - int placeholderMatchMode, PDDocument doc) throws IOException { - super(ResourceLoader.loadProperties( - "placeholder/pdfbox-reader.properties", true)); - this.doc = doc; - } - - /** - * Search the document for placeholder images and possibly included - * additional info.
- * Searches only for the first placeholder page after page from top. - * - * @param inputStream - * @return all available info from the first found placeholder. - * @throws PDFDocumentException - * if the document could not be read. - * @throws PlaceholderExtractionException - * if STRICT matching mode was requested and no suitable - * placeholder could be found. - */ - public static SignaturePlaceholderData extract(PDDocument doc, - String placeholderId, int matchMode) throws PdfAsException { - SignaturePlaceholderContext.setSignaturePlaceholderData(null); - - SignaturePlaceholderExtractor extractor; - try { - extractor = new SignaturePlaceholderExtractor(placeholderId, - matchMode, doc); - } catch (IOException e2) { - throw new PDFIOException("error.pdf.io.04", e2); - } - List pages = doc.getDocumentCatalog().getAllPages(); - Iterator iter = pages.iterator(); - int pageNr = 0; - while (iter.hasNext()) { - pageNr++; - PDPage page = (PDPage) iter.next(); - try { - extractor.setCurrentPage(pageNr); - if(page.getContents() != null && page.findResources() != null && - page.getContents().getStream() != null) { - extractor.processStream(page, page.findResources(), page - .getContents().getStream()); - } - SignaturePlaceholderData ret = matchPlaceholderPage( - extractor.placeholders, placeholderId, matchMode); - if (ret != null) { - SignaturePlaceholderContext - .setSignaturePlaceholderData(ret); - return ret; - } - } catch (IOException e1) { - throw new PDFIOException("error.pdf.io.04", e1); - } catch(Throwable e) { - throw new PDFIOException("error.pdf.io.04", e); - } - - } - if (extractor.placeholders.size() > 0) { - SignaturePlaceholderData ret = matchPlaceholderDocument( - extractor.placeholders, placeholderId, matchMode); - SignaturePlaceholderContext.setSignaturePlaceholderData(ret); - return ret; - } - // no placeholders found, apply strict mode if set - if (matchMode == PLACEHOLDER_MATCH_MODE_STRICT) { - throw new PlaceholderExtractionException("error.pdf.stamp.09"); - } - - return null; - } - - private static SignaturePlaceholderData matchPlaceholderDocument( - List placeholders, String placeholderId, - int matchMode) throws PlaceholderExtractionException { - - if (matchMode == PLACEHOLDER_MATCH_MODE_STRICT) - throw new PlaceholderExtractionException("error.pdf.stamp.09"); - - if (placeholders.size() == 0) - return null; - - if (matchMode == PLACEHOLDER_MATCH_MODE_SORTED) { - // sort all placeholders by the id string if all ids are null do nothing - SignaturePlaceholderData currentFirstSpd = null; - for (int i = 0; i < placeholders.size(); i++) { - SignaturePlaceholderData spd = placeholders.get(i); - if (spd.getId() != null) { - if(currentFirstSpd == null) { - currentFirstSpd = spd; - logger.debug("Setting new current ID: {}", - currentFirstSpd.getId()); - } else { - String currentID = currentFirstSpd.getId(); - String testID = spd.getId(); - logger.debug("Testing placeholder current: {} compare to {}", - currentID, testID); - if(testID.compareToIgnoreCase(currentID) < 0) { - currentFirstSpd = spd; - logger.debug("Setting new current ID: {}", - testID); - } - } - } - } - - if(currentFirstSpd != null) { - logger.info("Running Placeholder sorted mode: using id: {}", currentFirstSpd.getId()); - return currentFirstSpd; - } else { - logger.info("Running Placeholder sorted mode: no placeholder with id found, fallback to first placeholder"); - } - } - - for (int i = 0; i < placeholders.size(); i++) { - SignaturePlaceholderData spd = placeholders.get(i); - if (spd.getId() == null) - return spd; - } - - if (matchMode == PLACEHOLDER_MATCH_MODE_LENIENT) - return placeholders.get(0); - - return null; - } - - private static SignaturePlaceholderData matchPlaceholderPage( - List placeholders, String placeholderId, - int matchMode) { - - if(matchMode == PLACEHOLDER_MATCH_MODE_SORTED) - return null; - - if (placeholders.size() == 0) - return null; - for (int i = 0; i < placeholders.size(); i++) { - SignaturePlaceholderData data = placeholders.get(i); - if (placeholderId != null && placeholderId.equals(data.getId())) - return data; - if (placeholderId == null && data.getId() == null) - return data; - } - return null; - } - - private void setCurrentPage(int pageNr) { - this.currentPage = pageNr; - } - - @Override - protected void processOperator(PDFOperator operator, List arguments) - throws IOException { - String operation = operator.getOperation(); - if (operation.equals("Do")) { - COSName objectName = (COSName) arguments.get(0); - Map xobjects = getResources().getXObjects(); - PDXObject xobject = (PDXObject) xobjects.get(objectName.getName()); - if (xobject instanceof PDXObjectImage) { - try { - PDXObjectImage image = (PDXObjectImage) xobject; - SignaturePlaceholderData data = checkImage(image); - if (data != null) { - PDPage page = getCurrentPage(); - Matrix ctm = getGraphicsState() - .getCurrentTransformationMatrix(); - int pageRotation = page.findRotation(); - pageRotation = pageRotation % 360; - double rotationInRadians = Math.toRadians(pageRotation);//(page.findRotation() * Math.PI) / 180; - - AffineTransform rotation = new AffineTransform(); - rotation.setToRotation(rotationInRadians); - AffineTransform rotationInverse = rotation - .createInverse(); - Matrix rotationInverseMatrix = new Matrix(); - rotationInverseMatrix - .setFromAffineTransform(rotationInverse); - Matrix rotationMatrix = new Matrix(); - rotationMatrix.setFromAffineTransform(rotation); - - Matrix unrotatedCTM = ctm - .multiply(rotationInverseMatrix); - - float x = unrotatedCTM.getXPosition(); - float yPos = unrotatedCTM.getYPosition(); - float yScale = unrotatedCTM.getYScale(); - float y = yPos + yScale; - float w = unrotatedCTM.getXScale(); - - logger.debug("Page height: {}", page.findCropBox().getHeight()); - logger.debug("Page width: {}", page.findCropBox().getWidth()); - - if(pageRotation == 90) { - y = page.findCropBox().getWidth() - (y * (-1)); - } else if(pageRotation == 180) { - x = page.findCropBox().getWidth() + x; - y = page.findCropBox().getHeight() - (y * (-1)); - } else if(pageRotation == 270) { - x = page.findCropBox().getHeight() + x; - } - - String posString = "p:" + currentPage + ";x:" + x - + ";y:" + y + ";w:" + w; - - logger.debug("Found Placeholder at: {}", posString); - try { - data.setTablePos(new TablePos(posString)); - data.setPlaceholderName(objectName.getName()); - placeholders.add(data); - } catch (PdfAsException e) { - throw new WrappedIOException(e); - } - } - } catch (NoninvertibleTransformException e) { - throw new WrappedIOException(e); - } - } - } else { - super.processOperator(operator, arguments); - } - } - - private Map fonts; - - @Override - public Map getFonts() { - if (fonts == null) - { - // at least an empty map will be returned - // TODO we should return null instead of an empty map - fonts = new HashMap(); - if(this.getResources() != null && this.getResources().getCOSDictionary() != null) { - COSDictionary fontsDictionary = (COSDictionary) this.getResources().getCOSDictionary().getDictionaryObject(COSName.FONT); - if (fontsDictionary == null) - { - // ignore we do not want to set anything, never when creating a signature!!!!! - //fontsDictionary = new COSDictionary(); - //this.getResources().getCOSDictionary().setItem(COSName.FONT, fontsDictionary); - } - else - { - for (COSName fontName : fontsDictionary.keySet()) - { - COSBase font = fontsDictionary.getDictionaryObject(fontName); - // data-000174.pdf contains a font that is a COSArray, looks to be an error in the - // PDF, we will just ignore entries that are not dictionaries. - if (font instanceof COSDictionary) - { - PDFont newFont = null; - try - { - newFont = PDFontFactory.createFont((COSDictionary) font); - } - catch (IOException exception) - { - logger.error("error while creating a font", exception); - } - if (newFont != null) - { - fonts.put(fontName.getName(), newFont); - } - } - } - } - } - } - return fonts; - } - - /** - * Checks an image if it is a placeholder for a signature. - * - * @param image - * @return - * @throws IOException - */ - private SignaturePlaceholderData checkImage(PDXObjectImage image) - throws IOException { - BufferedImage bimg = image.getRGBImage(); - if (bimg == null) { - String type = image.getSuffix(); - if (type != null) { - type = type.toUpperCase() + " images"; - } else { - type = "Image type"; - } - logger.info("Unable to extract image for QRCode analysis. " - + type - + " not supported. Add additional JAI Image filters to your classpath. Refer to https://jai.dev.java.net. Skipping image."); - return null; - } - if (bimg.getHeight() < 10 || bimg.getWidth() < 10) { - logger.debug("Image too small for QRCode. Skipping image."); - return null; - } - - LuminanceSource source = new BufferedImageLuminanceSource(bimg); - BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); - Result result; - long before = System.currentTimeMillis(); - try { - Hashtable hints = new Hashtable(); - Vector formats = new Vector(); - formats.add(BarcodeFormat.QR_CODE); - hints.put(DecodeHintType.POSSIBLE_FORMATS, formats); - result = new MultiFormatReader().decode(bitmap, hints); - - String text = result.getText(); - String profile = null; - String type = null; - String sigKey = null; - String id = null; - if (text != null) { - if (text.startsWith(QR_PLACEHOLDER_IDENTIFIER)) { - String[] data = text.split(";"); - if (data.length > 1) { - for (int i = 1; i < data.length; i++) { - String kvPair = data[i]; - String[] kv = kvPair.split("="); - if (kv.length != 2) { - logger.debug("Invalid parameter in placeholder data: " - + kvPair); - } else { - if (kv[0] - .equalsIgnoreCase(SignaturePlaceholderData.ID_KEY)) { - id = kv[1]; - } else if (kv[0] - .equalsIgnoreCase(SignaturePlaceholderData.PROFILE_KEY)) { - profile = kv[1]; - } else if (kv[0] - .equalsIgnoreCase(SignaturePlaceholderData.SIG_KEY_KEY)) { - sigKey = kv[1]; - } else if (kv[0] - .equalsIgnoreCase(SignaturePlaceholderData.TYPE_KEY)) { - type = kv[1]; - } - } - } - } - return new SignaturePlaceholderData(profile, type, sigKey, - id); - } else { - logger.warn("QR-Code found but does not start with \"" - + QR_PLACEHOLDER_IDENTIFIER - + "\". Ignoring QR placeholder."); - } - } - } catch (ReaderException re) { - if (logger.isDebugEnabled()) { - logger.debug("Could not decode - not a placeholder. needed: " - + (System.currentTimeMillis() - before)); - } - if (!(re instanceof NotFoundException)) { - if (logger.isInfoEnabled()) { - logger.info("Failed to decode image", re); - } - } - } catch (ArrayIndexOutOfBoundsException e) { - if (logger.isInfoEnabled()) { - logger.info("Failed to decode image. Probably a zxing bug", e); - } - } - return null; - } - -} diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox/positioning/Positioning.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox/positioning/Positioning.java deleted file mode 100644 index e2f245a7..00000000 --- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox/positioning/Positioning.java +++ /dev/null @@ -1,308 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -package at.gv.egiz.pdfas.lib.impl.pdfbox.positioning; - -import java.awt.geom.AffineTransform; -import java.awt.geom.Point2D; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.common.PDRectangle; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.gv.egiz.pdfas.common.exceptions.PdfAsException; -import at.gv.egiz.pdfas.lib.impl.pdfbox.utils.PdfBoxUtils; -import at.gv.egiz.pdfas.lib.impl.stamping.IPDFVisualObject; -import at.knowcenter.wag.egov.egiz.pdf.PDFUtilities; -import at.knowcenter.wag.egov.egiz.pdf.PositioningInstruction; -import at.knowcenter.wag.egov.egiz.pdf.TablePos; - -/** - * Created with IntelliJ IDEA. User: afitzek Date: 8/29/13 Time: 4:30 PM To - * change this template use File | Settings | File Templates. - */ -public class Positioning { - - private static final Logger logger = LoggerFactory - .getLogger(Positioning.class); - - /** - * The left/right margin. - */ - public static final float SIGNATURE_MARGIN_HORIZONTAL = 50f; - - /** - * The top/bottom margin. - */ - public static final float SIGNATURE_MARGIN_VERTICAL = 20f; - - /** - * Evalutates absolute positioning and prepares the PositioningInstruction - * for placing the table. - * - * @param pos - * The absolute positioning parameter. If null it is sought in - * the profile definition. - * @param signature_type - * The profile definition of the table to be written. - * @param pdfDataSource - * The pdf. - * @param pdf_table - * The pdf table to be written. - * @return Returns the PositioningInformation. - * @throws PdfAsException - * F.e. - */ - public static PositioningInstruction determineTablePositioning( - TablePos pos, String signature_type, PDDocument pdfDataSource, - IPDFVisualObject pdf_table, boolean legacy32, boolean legacy40) throws PdfAsException { - return adjustSignatureTableandCalculatePosition(pdfDataSource, - pdf_table, pos, legacy32, legacy40); - } - - private static PDRectangle rotateBox(PDRectangle cropBox, int rotation) { - if (rotation != 0) { - Point2D upSrc = new Point2D.Float(); - - upSrc.setLocation(cropBox.getUpperRightX(), - cropBox.getUpperRightY()); - - Point2D llSrc = new Point2D.Float(); - llSrc.setLocation(cropBox.getLowerLeftX(), cropBox.getLowerLeftY()); - AffineTransform transform = new AffineTransform(); - transform.setToIdentity(); - if (rotation % 360 != 0) { - transform.setToRotation(Math.toRadians(rotation * -1), llSrc.getX(), - llSrc.getY()); - } - Point2D upDst = new Point2D.Float(); - transform.transform(upSrc, upDst); - - Point2D llDst = new Point2D.Float(); - transform.transform(llSrc, llDst); - - float y1 = (float) upDst.getY(); - float y2 = (float) llDst.getY(); - - if(y1 > y2) { - float t = y1; - y1 = y2; - y2 = t; - } - - if(y1 < 0) { - y2 = y2 + -1 * y1; - y1 = 0; - } - - float x1 = (float) upDst.getX(); - float x2 = (float) llDst.getX(); - - if(x1 > x2) { - float t = x1; - x1 = x2; - x2 = t; - } - - if(x1 < 0) { - x2 = x2 + -1 * x1; - x1 = 0; - } - - cropBox.setUpperRightX(x2); - cropBox.setUpperRightY(y2); - cropBox.setLowerLeftY(y1); - cropBox.setLowerLeftX(x1); - } - return cropBox; - } - - /** - * Sets the width of the table according to the layout of the document and - * calculates the y position where the PDFPTable should be placed. - * - * @param pdfDataSource - * The PDF document. - * @param pdf_table - * The PDFPTable to be placed. - * @return Returns the position where the PDFPTable should be placed. - * @throws PdfAsException - * F.e. - */ - public static PositioningInstruction adjustSignatureTableandCalculatePosition( - final PDDocument pdfDataSource, IPDFVisualObject pdf_table, - TablePos pos, boolean legacy32, boolean legacy40) throws PdfAsException { - - PdfBoxUtils.checkPDFPermissions(pdfDataSource); - // get pages of currentdocument - - int doc_pages = pdfDataSource.getNumberOfPages(); - int page = doc_pages; - boolean make_new_page = pos.isNewPage(); - if (!(pos.isNewPage() || pos.isPauto())) { - // we should posit signaturtable on this page - - page = pos.getPage(); - // System.out.println("XXXXPAGE="+page+" doc_pages="+doc_pages); - if (page > doc_pages) { - make_new_page = true; - page = doc_pages; - // throw new PDFDocumentException(227, "Page number is to big(=" - // + page+ - // ") cannot be parsed."); - } - } - - PDPage pdPage = (PDPage) pdfDataSource.getDocumentCatalog() - .getAllPages().get(page - 1); - PDRectangle cropBox = pdPage.getCropBox(); - - // fallback to MediaBox if Cropbox not available! - - if (cropBox == null) { - cropBox = pdPage.findCropBox(); - } - - if (cropBox == null) { - cropBox = pdPage.findMediaBox(); - } - - // getPagedimensions - // Rectangle psize = reader.getPageSizeWithRotation(page); - // int page_rotation = reader.getPageRotation(page); - - // Integer rotation = pdPage.getRotation(); - // int page_rotation = rotation.intValue(); - - int rotation = pdPage.findRotation(); - - logger.debug("Original CropBox: " + cropBox.toString()); - - cropBox = rotateBox(cropBox, rotation); - - logger.debug("Rotated CropBox: " + cropBox.toString()); - - float page_width = cropBox.getWidth(); - float page_height = cropBox.getHeight(); - - logger.debug("CropBox width: " + page_width); - logger.debug("CropBox heigth: " + page_height); - - // now we can calculate x-position - float pre_pos_x = SIGNATURE_MARGIN_HORIZONTAL; - if (!pos.isXauto()) { - // we do have absolute x - pre_pos_x = pos.getPosX(); - } - // calculate width - // center - float pre_width = page_width - 2 * pre_pos_x; - if (!pos.isWauto()) { - // we do have absolute width - pre_width = pos.getWidth(); - if (pos.isXauto()) { // center x - pre_pos_x = (page_width - pre_width) / 2; - } - } - final float pos_x = pre_pos_x; - final float width = pre_width; - // Signatur table dimensions are complete - pdf_table.setWidth(width); - pdf_table.fixWidth(); - // pdf_table.setTotalWidth(width); - // pdf_table.setLockedWidth(true); - - final float table_height = pdf_table.getHeight(); - // now check pos_y - float pos_y = pos.getPosY(); - - // in case an absolute y position is already given OR - // if the table is related to an invisible signature - // there is no need for further calculations - // (fixed adding new page in case of invisible signatures) - if (!pos.isYauto() || table_height == 0) { - // we do have y-position too --> all parameters but page ok - if (make_new_page) { - page++; - } - return new PositioningInstruction(make_new_page, page, pos_x, - pos_y, pos.rotation); - } - // pos_y is auto - if (make_new_page) { - // ignore footer in new page - page++; - pos_y = page_height - SIGNATURE_MARGIN_VERTICAL; - return new PositioningInstruction(make_new_page, page, pos_x, - pos_y, pos.rotation); - } - // up to here no checks have to be made if Tablesize and Pagesize are - // fit - // Now we have to getfreespace in page and reguard footerline - float footer_line = pos.getFooterLine(); - - float pre_page_length = PDFUtilities.calculatePageLength(pdfDataSource, - page - 1, page_height - footer_line, /* page_rotation, */ - legacy32, legacy40); - - if (pre_page_length == Float.NEGATIVE_INFINITY) { - // we do have an empty page or nothing in area above footerline - pre_page_length = page_height; - // no text --> SIGNATURE_BORDER - pos_y = page_height - SIGNATURE_MARGIN_VERTICAL; - if (pos_y - footer_line <= table_height) { - make_new_page = true; - if (!pos.isPauto()) { - // we have to correct pagenumber - page = pdfDataSource.getNumberOfPages(); - } - page++; - // no text --> SIGNATURE_BORDER - pos_y = page_height - SIGNATURE_MARGIN_VERTICAL; - } - return new PositioningInstruction(make_new_page, page, pos_x, - pos_y, pos.rotation); - } - final float page_length = pre_page_length; - // we do have text take SIGNATURE_MARGIN - pos_y = page_height - page_length - SIGNATURE_MARGIN_VERTICAL; - if (pos_y - footer_line <= table_height) { - make_new_page = true; - if (!pos.isPauto()) { - // we have to correct pagenumber in case of absolute page and - // not enough - // space - page = pdfDataSource.getNumberOfPages(); - } - page++; - // no text --> SIGNATURE_BORDER - pos_y = page_height - SIGNATURE_MARGIN_VERTICAL; - } - return new PositioningInstruction(make_new_page, page, pos_x, pos_y, - pos.rotation); - - } - -} diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox/utils/PdfBoxUtils.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox/utils/PdfBoxUtils.java deleted file mode 100644 index 01501f97..00000000 --- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox/utils/PdfBoxUtils.java +++ /dev/null @@ -1,73 +0,0 @@ -package at.gv.egiz.pdfas.lib.impl.pdfbox.utils; - -import org.apache.pdfbox.cos.COSArray; -import org.apache.pdfbox.cos.COSDictionary; -import org.apache.pdfbox.cos.COSName; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.encryption.AccessPermission; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.gv.egiz.pdfas.common.exceptions.PdfAsValidationException; - -public class PdfBoxUtils { - private static final Logger logger = LoggerFactory - .getLogger(PdfBoxUtils.class); - - public static void checkPDFPermissions(PDDocument doc) - throws PdfAsValidationException { - - AccessPermission accessPermission = doc.getCurrentAccessPermission(); - if (doc.isEncrypted()) { - throw new PdfAsValidationException("error.pdf.sig.12", null); - } - - if (!accessPermission.isOwnerPermission()) { - throw new PdfAsValidationException("error.pdf.sig.12", null); - } - - } - - public static int countSignatures(PDDocument doc, String sigName) { - int count = 0; - COSDictionary trailer = doc.getDocument().getTrailer(); - COSDictionary root = (COSDictionary) trailer - .getDictionaryObject(COSName.ROOT); - COSDictionary acroForm = (COSDictionary) root - .getDictionaryObject(COSName.ACRO_FORM); - COSArray fields = (COSArray) acroForm - .getDictionaryObject(COSName.FIELDS); - for (int i = 0; i < fields.size(); i++) { - COSDictionary field = (COSDictionary) fields.getObject(i); - String type = field.getNameAsString("FT"); - if ("Sig".equals(type)) { - String name = field.getString(COSName.T); - if (name != null) { - logger.debug("Found Sig: " + name); - try { - if (name.startsWith(sigName)) { - String numberString = name.replace(sigName, ""); - - logger.debug("Found Number: " + numberString); - - int SigIDX = Integer.parseInt(numberString); - if (SigIDX > count) { - count = SigIDX; - } - } - } catch (Throwable e) { - logger.info("Found a different Signature, we do not need to count this."); - } - } - } - - } - - count++; - - logger.debug("Returning sig number: " + count); - - return count; - } - -} diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/PADESPDFBOXSigner.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/PADESPDFBOXSigner.java deleted file mode 100644 index 53eb9f80..00000000 --- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/PADESPDFBOXSigner.java +++ /dev/null @@ -1,855 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -package at.gv.egiz.pdfas.lib.impl.signing.pdfbox; - -import iaik.x509.X509Certificate; - -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.image.BufferedImage; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import org.apache.commons.io.IOUtils; -import org.apache.pdfbox.cos.COSArray; -import org.apache.pdfbox.cos.COSBase; -import org.apache.pdfbox.cos.COSDictionary; -import org.apache.pdfbox.cos.COSDocument; -import org.apache.pdfbox.cos.COSInteger; -import org.apache.pdfbox.cos.COSName; -import org.apache.pdfbox.cos.COSString; -import org.apache.pdfbox.exceptions.COSVisitorException; -import org.apache.pdfbox.exceptions.SignatureException; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDDocumentCatalog; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.PDPageNode; -import org.apache.pdfbox.pdmodel.PDResources; -import org.apache.pdfbox.pdmodel.common.PDNumberTreeNode; -import org.apache.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureElement; -import org.apache.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureTreeRoot; -import org.apache.pdfbox.pdmodel.graphics.color.PDOutputIntent; -import org.apache.pdfbox.pdmodel.graphics.xobject.PDJpeg; -import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature; -import org.apache.pdfbox.pdmodel.interactive.digitalsignature.SignatureOptions; -import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; -import org.apache.pdfbox.pdmodel.interactive.form.PDField; -import org.apache.pdfbox.pdmodel.interactive.form.PDSignatureField; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.gv.egiz.pdfas.common.exceptions.PDFASError; -import at.gv.egiz.pdfas.common.exceptions.PdfAsException; -import at.gv.egiz.pdfas.common.messages.MessageResolver; -import at.gv.egiz.pdfas.common.settings.SignatureProfileSettings; -import at.gv.egiz.pdfas.common.utils.StreamUtils; -import at.gv.egiz.pdfas.common.utils.TempFileHelper; -import at.gv.egiz.pdfas.lib.api.ByteArrayDataSource; -import at.gv.egiz.pdfas.lib.api.IConfigurationConstants; -import at.gv.egiz.pdfas.lib.api.sign.IPlainSigner; -import at.gv.egiz.pdfas.lib.api.sign.SignParameter; -import at.gv.egiz.pdfas.lib.impl.ErrorExtractor; -import at.gv.egiz.pdfas.lib.impl.SignaturePositionImpl; -import at.gv.egiz.pdfas.lib.impl.configuration.SignatureProfileConfiguration; -import at.gv.egiz.pdfas.lib.impl.pdfbox.PDFBOXObject; -import at.gv.egiz.pdfas.lib.impl.pdfbox.positioning.Positioning; -import at.gv.egiz.pdfas.lib.impl.pdfbox.utils.PdfBoxUtils; -import at.gv.egiz.pdfas.lib.impl.placeholder.PlaceholderFilter; -import at.gv.egiz.pdfas.lib.impl.placeholder.SignaturePlaceholderData; -import at.gv.egiz.pdfas.lib.impl.signing.IPdfSigner; -import at.gv.egiz.pdfas.lib.impl.signing.PDFASSignatureExtractor; -import at.gv.egiz.pdfas.lib.impl.signing.PDFASSignatureInterface; -import at.gv.egiz.pdfas.lib.impl.stamping.IPDFStamper; -import at.gv.egiz.pdfas.lib.impl.stamping.IPDFVisualObject; -import at.gv.egiz.pdfas.lib.impl.stamping.TableFactory; -import at.gv.egiz.pdfas.lib.impl.stamping.ValueResolver; -import at.gv.egiz.pdfas.lib.impl.stamping.pdfbox.PDFAsVisualSignatureProperties; -import at.gv.egiz.pdfas.lib.impl.stamping.pdfbox.PdfBoxVisualObject; -import at.gv.egiz.pdfas.lib.impl.stamping.pdfbox.StamperFactory; -import at.gv.egiz.pdfas.lib.impl.status.OperationStatus; -import at.gv.egiz.pdfas.lib.impl.status.PDFObject; -import at.gv.egiz.pdfas.lib.impl.status.RequestedSignature; -import at.knowcenter.wag.egov.egiz.pdf.PositioningInstruction; -import at.knowcenter.wag.egov.egiz.pdf.TablePos; -import at.knowcenter.wag.egov.egiz.table.Table; - -public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { - - private static final Logger logger = LoggerFactory.getLogger(PADESPDFBOXSigner.class); - - public void signPDF(PDFObject genericPdfObject, RequestedSignature requestedSignature, - PDFASSignatureInterface genericSigner) throws PdfAsException { - String fisTmpFile = null; - - PDFAsVisualSignatureProperties properties = null; - - if (!(genericPdfObject instanceof PDFBOXObject)) { - // tODO: - throw new PdfAsException(); - } - - PDFBOXObject pdfObject = (PDFBOXObject) genericPdfObject; - - if (!(genericSigner instanceof PDFASPDFBOXSignatureInterface)) { - // tODO: - throw new PdfAsException(); - } - - PDFASPDFBOXSignatureInterface signer = (PDFASPDFBOXSignatureInterface) genericSigner; - - TempFileHelper helper = pdfObject.getStatus().getTempFileHelper(); - PDDocument doc = null; - SignatureOptions options = new SignatureOptions(); - COSDocument visualSignatureDocumentGuard = null; - try { - fisTmpFile = helper.getStaticFilename(); - - FileOutputStream tmpOutputStream = null; - try { - // write to temporary file - tmpOutputStream = new FileOutputStream(new File(fisTmpFile)); - InputStream tmpis = null; - try { - tmpis = pdfObject.getOriginalDocument().getInputStream(); - IOUtils.copy(tmpis, tmpOutputStream); - tmpis.close(); - } finally { - IOUtils.closeQuietly(tmpis); - } - - doc = pdfObject.getDocument(); - - SignaturePlaceholderData signaturePlaceholderData = PlaceholderFilter - .checkPlaceholderSignatureLocation(pdfObject.getStatus(), pdfObject.getStatus().getSettings(), null); - - TablePos tablePos = null; - - if (signaturePlaceholderData != null) { - // Placeholder found! - logger.info("Placeholder data found."); - if (signaturePlaceholderData.getProfile() != null) { - logger.debug("Placeholder Profile set to: " + signaturePlaceholderData.getProfile()); - requestedSignature.setSignatureProfileID(signaturePlaceholderData.getProfile()); - } - - tablePos = signaturePlaceholderData.getTablePos(); - if (tablePos != null) { - - SignatureProfileConfiguration signatureProfileConfiguration = pdfObject.getStatus() - .getSignatureProfileConfiguration(requestedSignature.getSignatureProfileID()); - - float minWidth = signatureProfileConfiguration.getMinWidth(); - - if(minWidth > 0) { - if (tablePos.getWidth() < minWidth) { - tablePos.width = minWidth; - logger.debug("Correcting placeholder with to minimum width {}", minWidth); - } - } - logger.debug("Placeholder Position set to: " + tablePos.toString()); - } - } - - PDSignature signature = new PDSignature(); - signature.setFilter(COSName.getPDFName(signer.getPDFFilter())); // default - // filter - signature.setSubFilter(COSName.getPDFName(signer.getPDFSubFilter())); - - SignatureProfileSettings signatureProfileSettings = TableFactory - .createProfile(requestedSignature.getSignatureProfileID(), pdfObject.getStatus().getSettings()); - - ValueResolver resolver = new ValueResolver(requestedSignature, pdfObject.getStatus()); - String signerName = resolver.resolve("SIG_SUBJECT", signatureProfileSettings.getValue("SIG_SUBJECT"), - signatureProfileSettings); - - signature.setName(signerName); - signature.setSignDate(Calendar.getInstance()); - String signerReason = signatureProfileSettings.getSigningReason(); - - if (signerReason == null) { - signerReason = "PAdES Signature"; - } - - signature.setReason(signerReason); - logger.debug("Signing reason: " + signerReason); - - logger.debug("Signing @ " + signer.getSigningDate().getTime().toString()); - // the signing date, needed for valid signature - // signature.setSignDate(signer.getSigningDate()); - - signer.setPDSignature(signature); - - int signatureSize = 0x1000; - try { - String reservedSignatureSizeString = signatureProfileSettings.getValue(SIG_RESERVED_SIZE); - if (reservedSignatureSizeString != null) { - signatureSize = Integer.parseInt(reservedSignatureSizeString); - } - logger.debug("Reserving {} bytes for signature", signatureSize); - } catch (NumberFormatException e) { - logger.warn("Invalid configuration value: {} should be a number using 0x1000", SIG_RESERVED_SIZE); - } - options.setPreferedSignatureSize(signatureSize); - - // Is visible Signature - if (requestedSignature.isVisual()) { - logger.info("Creating visual siganture block"); - - SignatureProfileConfiguration signatureProfileConfiguration = pdfObject.getStatus() - .getSignatureProfileConfiguration(requestedSignature.getSignatureProfileID()); - - if (tablePos == null) { - // ================================================================ - // PositioningStage (visual) -> find position or use - // fixed - // position - - String posString = pdfObject.getStatus().getSignParamter().getSignaturePosition(); - - TablePos signaturePos = null; - - String signaturePosString = signatureProfileConfiguration.getDefaultPositioning(); - - if (signaturePosString != null) { - logger.debug("using signature Positioning: " + signaturePos); - signaturePos = new TablePos(signaturePosString); - } - - logger.debug("using Positioning: " + posString); - - if (posString != null) { - // Merge Signature Position - tablePos = new TablePos(posString, signaturePos); - } else { - // Fallback to signature Position! - tablePos = signaturePos; - } - - if (tablePos == null) { - // Last Fallback default position - tablePos = new TablePos(); - } - } - - boolean legacy32Position = signatureProfileConfiguration.getLegacy32Positioning(); - boolean legacy40Position = signatureProfileConfiguration.getLegacy40Positioning(); - - // create Table describtion - Table main = TableFactory.createSigTable(signatureProfileSettings, MAIN, pdfObject.getStatus(), - requestedSignature); - - IPDFStamper stamper = StamperFactory.createDefaultStamper(pdfObject.getStatus().getSettings()); - - IPDFVisualObject visualObject = stamper.createVisualPDFObject(pdfObject, main); - - /* - * PDDocument originalDocument = PDDocument .load(new - * ByteArrayInputStream(pdfObject.getStatus() - * .getPdfObject().getOriginalDocument())); - */ - - PositioningInstruction positioningInstruction = Positioning.determineTablePositioning(tablePos, "", - doc, visualObject, legacy32Position, legacy40Position); - - logger.debug("Positioning: {}", positioningInstruction.toString()); - - if (positioningInstruction.isMakeNewPage()) { - int last = doc.getNumberOfPages() - 1; - PDDocumentCatalog root = doc.getDocumentCatalog(); - PDPageNode rootPages = root.getPages(); - List kids = new ArrayList(); - rootPages.getAllKids(kids); - PDPage lastPage = kids.get(last); - rootPages.getCOSObject().setNeedToBeUpdate(true); - PDPage p = new PDPage(lastPage.findMediaBox()); - p.setResources(new PDResources()); - p.setRotation(lastPage.findRotation()); - doc.addPage(p); - } - - // handle rotated page - PDDocumentCatalog documentCatalog = doc.getDocumentCatalog(); - PDPageNode documentPages = documentCatalog.getPages(); - List documentPagesKids = new ArrayList(); - documentPages.getAllKids(documentPagesKids); - int targetPageNumber = positioningInstruction.getPage(); - logger.debug("Target Page: " + targetPageNumber); - // rootPages.getAllKids(kids); - PDPage targetPage = documentPagesKids.get(targetPageNumber - 1); - int rot = targetPage.findRotation(); - logger.debug("Page rotation: " + rot); - // positioningInstruction.setRotation(positioningInstruction.getRotation() - // + rot); - logger.debug("resulting Sign rotation: " + positioningInstruction.getRotation()); - - SignaturePositionImpl position = new SignaturePositionImpl(); - position.setX(positioningInstruction.getX()); - position.setY(positioningInstruction.getY()); - position.setPage(positioningInstruction.getPage()); - position.setHeight(visualObject.getHeight()); - position.setWidth(visualObject.getWidth()); - - requestedSignature.setSignaturePosition(position); - - properties = new PDFAsVisualSignatureProperties(pdfObject.getStatus().getSettings(), pdfObject, - (PdfBoxVisualObject) visualObject, positioningInstruction, signatureProfileSettings); - - properties.buildSignature(); - - /* - * ByteArrayOutputStream sigbos = new - * ByteArrayOutputStream(); - * sigbos.write(StreamUtils.inputStreamToByteArray - * (properties .getVisibleSignature())); sigbos.close(); - */ - - if (signaturePlaceholderData != null) { - // Placeholder found! - // replace placeholder - InputStream is = null; - try { - is = PADESPDFBOXSigner.class.getResourceAsStream("/placeholder/empty.jpg"); - PDJpeg img = new PDJpeg(doc, is); - - img.getCOSObject().setNeedToBeUpdate(true); - - PDDocumentCatalog root = doc.getDocumentCatalog(); - PDPageNode rootPages = root.getPages(); - List kids = new ArrayList(); - rootPages.getAllKids(kids); - int pageNumber = positioningInstruction.getPage(); - // rootPages.getAllKids(kids); - PDPage page = kids.get(pageNumber - 1); - - logger.info("Placeholder name: " + signaturePlaceholderData.getPlaceholderName()); - COSDictionary xobjectsDictionary = (COSDictionary) page.findResources().getCOSDictionary() - .getDictionaryObject(COSName.XOBJECT); - xobjectsDictionary.setItem(signaturePlaceholderData.getPlaceholderName(), img); - xobjectsDictionary.setNeedToBeUpdate(true); - page.findResources().getCOSObject().setNeedToBeUpdate(true); - logger.info("Placeholder name: " + signaturePlaceholderData.getPlaceholderName()); - } finally { - IOUtils.closeQuietly(is); - } - } - - if (signatureProfileSettings.isPDFA()) { - PDDocumentCatalog root = doc.getDocumentCatalog(); - COSBase base = root.getCOSDictionary().getItem(COSName.OUTPUT_INTENTS); - if (base == null) { - InputStream colorProfile = null; - try { - colorProfile = PDDocumentCatalog.class - .getResourceAsStream("/icm/sRGB Color Space Profile.icm"); - - try { - PDOutputIntent oi = new PDOutputIntent(doc, colorProfile); - oi.setInfo("sRGB IEC61966-2.1"); - oi.setOutputCondition("sRGB IEC61966-2.1"); - oi.setOutputConditionIdentifier("sRGB IEC61966-2.1"); - oi.setRegistryName("http://www.color.org"); - - root.addOutputIntent(oi); - root.getCOSObject().setNeedToBeUpdate(true); - logger.info("added Output Intent"); - } catch (Throwable e) { - e.printStackTrace(); - throw new PdfAsException("Failed to add Output Intent", e); - } - } finally { - IOUtils.closeQuietly(colorProfile); - } - } - } - - options.setPage(positioningInstruction.getPage()); - - options.setVisualSignature(properties.getVisibleSignature()); - } - - visualSignatureDocumentGuard = options.getVisualSignature(); - - doc.addSignature(signature, signer, options); - - // set need to update indirect fields array in acro form - COSDictionary trailer = doc.getDocument().getTrailer(); - COSDictionary troot = (COSDictionary) trailer - .getDictionaryObject(COSName.ROOT); - COSDictionary acroForm = (COSDictionary) troot - .getDictionaryObject(COSName.ACRO_FORM); - COSArray tfields = (COSArray) acroForm - .getDictionaryObject(COSName.FIELDS); - if(!tfields.isDirect()) { - tfields.setNeedToBeUpdate(true); - } - - String sigFieldName = signatureProfileSettings.getSignFieldValue(); - - if (sigFieldName == null) { - sigFieldName = "PDF-AS Signatur"; - } - - int count = PdfBoxUtils.countSignatures(doc, sigFieldName); - - sigFieldName = sigFieldName + count; - - PDAcroForm acroFormm = doc.getDocumentCatalog().getAcroForm(); - - // PDStructureTreeRoot pdstRoot = - // doc.getDocumentCatalog().getStructureTreeRoot(); - // COSDictionary dic = - // doc.getDocumentCatalog().getCOSDictionary(); - // PDStructureElement el = new PDStructureElement("Widget", - // pdstRoot); - - PDSignatureField signatureField = null; - if (acroFormm != null) { - @SuppressWarnings("unchecked") - List fields = acroFormm.getFields(); - - if (fields != null) { - for (PDField pdField : fields) { - if (pdField != null) { - if (pdField instanceof PDSignatureField) { - PDSignatureField tmpSigField = (PDSignatureField) pdField; - - if (tmpSigField.getSignature() != null - && tmpSigField.getSignature().getDictionary() != null) { - if (tmpSigField.getSignature().getDictionary() - .equals(signature.getDictionary())) { - signatureField = (PDSignatureField) pdField; - - } - } - } - } - } - } else { - logger.warn("Failed to name Signature Field! [Cannot find Field list in acroForm!]"); - } - - if (signatureField != null) { - signatureField.setPartialName(sigFieldName); - } - if (properties != null) { - signatureField.setAlternateFieldName(properties.getAlternativeTableCaption()); - } else { - signatureField.setAlternateFieldName(sigFieldName); - } - } else { - logger.warn("Failed to name Signature Field! [Cannot find acroForm!]"); - } - - // PDF-UA - logger.info("Adding pdf/ua content."); - try { - PDDocumentCatalog root = doc.getDocumentCatalog(); - PDStructureTreeRoot structureTreeRoot = root.getStructureTreeRoot(); - if (structureTreeRoot != null) { - logger.info("Tree Root: {}", structureTreeRoot.toString()); - List kids = structureTreeRoot.getKids(); - - if (kids == null) { - logger.info("No kid-elements in structure tree Root, maybe not PDF/UA document"); - } - - PDStructureElement docElement = null; - for (Object k : kids) { - if (k instanceof PDStructureElement) { - docElement = (PDStructureElement) k; - break; - - } - } - - PDStructureElement sigBlock = new PDStructureElement("Form", docElement); - - // create object dictionary and add as child element - COSDictionary objectDic = new COSDictionary(); - objectDic.setName("Type", "OBJR"); - objectDic.setItem("Pg", signatureField.getWidget().getPage()); - objectDic.setItem("Obj", signatureField.getWidget()); - - List l = new ArrayList(); - l.add(objectDic); - sigBlock.setKids(l); - sigBlock.setPage(signatureField.getWidget().getPage()); - - - sigBlock.setTitle("Signature Table"); - sigBlock.setParent(docElement); - docElement.appendKid(sigBlock); - - // Create and add Attribute dictionary to mitigate PAC - // warning - COSDictionary sigBlockDic = (COSDictionary) sigBlock.getCOSObject(); - COSDictionary sub = new COSDictionary(); - - sub.setName("O", "Layout"); - sub.setName("Placement", "Block"); - sigBlockDic.setItem(COSName.A, sub); - sigBlockDic.setNeedToBeUpdate(true); - - // Modify number tree - PDNumberTreeNode ntn = structureTreeRoot.getParentTree(); - int parentTreeNextKey = structureTreeRoot.getParentTreeNextKey(); - if (ntn == null) { - ntn = new PDNumberTreeNode(objectDic, null); - logger.info("No number-tree-node found!"); - } - - COSArray ntnKids = (COSArray) ntn.getCOSDictionary().getDictionaryObject(COSName.KIDS); - COSArray ntnNumbers = (COSArray) ntn.getCOSDictionary().getDictionaryObject(COSName.NUMS); - - if(ntnNumbers == null && ntnKids != null){//no number array, so continue with the kids array - - //create dictionary with limits and nums array - COSDictionary pTreeEntry = new COSDictionary(); - COSArray limitsArray = new COSArray(); - //limits for exact one entry - limitsArray.add(COSInteger.get(parentTreeNextKey)); - limitsArray.add(COSInteger.get(parentTreeNextKey)); - - COSArray numsArray = new COSArray(); - numsArray.add(COSInteger.get(parentTreeNextKey)); - numsArray.add(sigBlock); - - pTreeEntry.setItem(COSName.NUMS, numsArray); - pTreeEntry.setItem(COSName.LIMITS, limitsArray); - - PDNumberTreeNode newKidsElement = new PDNumberTreeNode(pTreeEntry, PDNumberTreeNode.class); - - ntnKids.add(newKidsElement); - ntnKids.setNeedToBeUpdate(true); - - - //working -// List treeRootKids = structureTreeRoot.getParentTree().getKids(); -// PDNumberTreeNode last = (PDNumberTreeNode)treeRootKids.get(treeRootKids.size()-1); -// COSArray lim1 = (COSArray) last.getCOSDictionary().getDictionaryObject(COSName.LIMITS); -// lim1.remove(1); -// lim1.add(1, COSInteger.get(parentTreeNextKey)); -// PDNumberTreeNode verylast = (PDNumberTreeNode)last.getKids().get(last.getKids().size()-1); -// COSArray numa = (COSArray) verylast.getCOSDictionary().getDictionaryObject(COSName.NUMS); -// COSArray lim = (COSArray) verylast.getCOSDictionary().getDictionaryObject(COSName.LIMITS); -// lim.remove(1); -// lim.add(1, COSInteger.get(parentTreeNextKey)); -// -// int size = numa.size(); -// numa.add(size, COSInteger.get(parentTreeNextKey)); -// numa.add(sigBlock); - //working end - - - - }else if(ntnNumbers != null && ntnKids == null){ - - int arrindex = ntnNumbers.size(); - - ntnNumbers.add(arrindex, COSInteger.get(parentTreeNextKey)); - ntnNumbers.add(arrindex + 1, sigBlock.getCOSObject()); - - ntnNumbers.getCOSObject().setNeedToBeUpdate(true); - - structureTreeRoot.setParentTree(ntn); - - }else if(ntnNumbers == null && ntnKids == null){ - //document is not pdfua conform before signature creation - throw new PdfAsException("error.pdf.sig.pdfua.1"); - }else{ - //this is not allowed - throw new PdfAsException("error.pdf.sig.pdfua.1"); - } - - // set StructureParent for signature field annotation - signatureField.getWidget().setStructParent(parentTreeNextKey); - - //Increase the next Key value in the structure tree root - structureTreeRoot.setParentTreeNextKey(parentTreeNextKey+1); - - // add the Tabs /S Element for Tabbing through annots - PDPage p = signatureField.getWidget().getPage(); - p.getCOSDictionary().setName("Tabs", "S"); - p.getCOSObject().setNeedToBeUpdate(true); - - //check alternative signature field name - if (signatureField != null) { - if(signatureField.getAlternateFieldName().equals("")) - signatureField.setAlternateFieldName(sigFieldName); - } - - - ntn.getCOSDictionary().setNeedToBeUpdate(true); - sigBlock.getCOSObject().setNeedToBeUpdate(true); - structureTreeRoot.getCOSObject().setNeedToBeUpdate(true); - objectDic.getCOSObject().setNeedToBeUpdate(true); - docElement.getCOSObject().setNeedToBeUpdate(true); - - } - } catch (Throwable e) { - if (signatureProfileSettings.isPDFUA() == true) { - logger.error("Could not create PDF-UA conform document!"); - throw new PdfAsException("error.pdf.sig.pdfua.1", e); - } else { - logger.info("Could not create PDF-UA conform signature"); - } - } - - if (requestedSignature.isVisual()) { - - // if(requestedSignature.getSignaturePosition().) - /* - * PDAcroForm acroForm = - * doc.getDocumentCatalog().getAcroForm(); if (acroForm != - * null) { - * - * @SuppressWarnings("unchecked") List fields = - * acroForm.getFields(); PDSignatureField signatureField = - * null; - * - * if (fields != null) { for (PDField pdField : fields) { if - * (pdField instanceof PDSignatureField) { if - * (((PDSignatureField) pdField).getSignature() - * .getDictionary() .equals(signature.getDictionary())) { - * signatureField = (PDSignatureField) pdField; } } } } else - * { logger.warn( - * "Failed to apply rotation! [Cannot find Field list in acroForm!]" - * ); } - * - * if (signatureField != null) { if - * (signatureField.getWidget() != null) { if - * (signatureField.getWidget() - * .getAppearanceCharacteristics() == null) { - * PDAppearanceCharacteristicsDictionary dict = new - * PDAppearanceCharacteristicsDictionary( new - * COSDictionary()); signatureField.getWidget() - * .setAppearanceCharacteristics(dict); } - * - * if (signatureField.getWidget() - * .getAppearanceCharacteristics() != null) { - * signatureField.getWidget() - * .getAppearanceCharacteristics() .setRotation(90); } } } - * else { logger.warn( - * "Failed to apply rotation! [Cannot find signature Field!]" - * ); } } else { logger.warn( - * "Failed to apply rotation! [Cannot find acroForm!]" ); } - */ - } - - FileInputStream tmpFileIs = null; - - try { - tmpFileIs = new FileInputStream(new File(fisTmpFile)); - synchronized (doc) { - doc.saveIncremental(tmpFileIs, tmpOutputStream); - } - tmpFileIs.close(); - } finally { - IOUtils.closeQuietly(tmpFileIs); - if (options != null) { - if (options.getVisualSignature() != null) { - options.getVisualSignature().close(); - } - } - } - tmpOutputStream.flush(); - tmpOutputStream.close(); - } finally { - IOUtils.closeQuietly(tmpOutputStream); - } - - FileInputStream readReadyFile = null; - try { - readReadyFile = new FileInputStream(new File(fisTmpFile)); - - // write to resulting output stream - // ByteArrayOutputStream bos = new ByteArrayOutputStream(); - // bos.write(); - // bos.close(); - - pdfObject.setSignedDocument(StreamUtils.inputStreamToByteArray(readReadyFile)); - readReadyFile.close(); - } finally { - IOUtils.closeQuietly(readReadyFile); - } - System.gc(); - } catch (IOException e) { - logger.warn(MessageResolver.resolveMessage("error.pdf.sig.01"), e); - throw new PdfAsException("error.pdf.sig.01", e); - } catch (SignatureException e) { - logger.warn(MessageResolver.resolveMessage("error.pdf.sig.01"), e); - throw new PdfAsException("error.pdf.sig.01", e); - } catch (COSVisitorException e) { - logger.warn(MessageResolver.resolveMessage("error.pdf.sig.01"), e); - throw new PdfAsException("error.pdf.sig.01", e); - } finally { - if (doc != null) { - try { - doc.close(); - } catch (IOException e) { - logger.debug("Failed to close COS Doc!", e); - // Ignore - } - } - - if (fisTmpFile != null) { - helper.deleteFile(fisTmpFile); - } - logger.debug("Signature done!"); - - } - } - - @Override - public PDFObject buildPDFObject(OperationStatus operationStatus) { - return new PDFBOXObject(operationStatus); - } - - @Override - public PDFASSignatureInterface buildSignaturInterface(IPlainSigner signer, SignParameter parameters, - RequestedSignature requestedSignature) { - return new PdfboxSignerWrapper(signer, parameters, requestedSignature); - } - - @Override - public PDFASSignatureExtractor buildBlindSignaturInterface(X509Certificate certificate, String filter, - String subfilter, Calendar date) { - return new SignatureDataExtractor(certificate, filter, subfilter, date); - } - - @Override - public void checkPDFPermissions(PDFObject genericPdfObject) throws PdfAsException { - if (!(genericPdfObject instanceof PDFBOXObject)) { - // tODO: - throw new PdfAsException(); - } - - PDFBOXObject pdfObject = (PDFBOXObject) genericPdfObject; - PdfBoxUtils.checkPDFPermissions(pdfObject.getDocument()); - } - - @Override - public byte[] rewritePlainSignature(byte[] plainSignature) { - String signature = new COSString(plainSignature).getHexString(); - byte[] pdfSignature = signature.getBytes(); - return pdfSignature; - } - - @Override - public Image generateVisibleSignaturePreview(SignParameter parameter, java.security.cert.X509Certificate cert, - int resolution, OperationStatus status, RequestedSignature requestedSignature) throws PDFASError { - try { - PDFBOXObject pdfObject = (PDFBOXObject) status.getPdfObject(); - - PDDocument origDoc = new PDDocument(); - origDoc.addPage(new PDPage(PDPage.PAGE_SIZE_A4)); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - origDoc.save(baos); - baos.close(); - - pdfObject.setOriginalDocument(new ByteArrayDataSource(baos.toByteArray())); - - SignatureProfileSettings signatureProfileSettings = TableFactory - .createProfile(requestedSignature.getSignatureProfileID(), pdfObject.getStatus().getSettings()); - - // create Table describtion - Table main = TableFactory.createSigTable(signatureProfileSettings, MAIN, pdfObject.getStatus(), - requestedSignature); - - IPDFStamper stamper = StamperFactory.createDefaultStamper(pdfObject.getStatus().getSettings()); - - IPDFVisualObject visualObject = stamper.createVisualPDFObject(pdfObject, main); - - SignatureProfileConfiguration signatureProfileConfiguration = pdfObject.getStatus() - .getSignatureProfileConfiguration(requestedSignature.getSignatureProfileID()); - - String signaturePosString = signatureProfileConfiguration.getDefaultPositioning(); - PositioningInstruction positioningInstruction = null; - if (signaturePosString != null) { - positioningInstruction = Positioning.determineTablePositioning(new TablePos(signaturePosString), "", - origDoc, visualObject, false, false); - } else { - positioningInstruction = Positioning.determineTablePositioning(new TablePos(), "", origDoc, - visualObject, false, false); - } - - origDoc.close(); - - SignaturePositionImpl position = new SignaturePositionImpl(); - position.setX(positioningInstruction.getX()); - position.setY(positioningInstruction.getY()); - position.setPage(positioningInstruction.getPage()); - position.setHeight(visualObject.getHeight()); - position.setWidth(visualObject.getWidth()); - - requestedSignature.setSignaturePosition(position); - - PDFAsVisualSignatureProperties properties = new PDFAsVisualSignatureProperties( - pdfObject.getStatus().getSettings(), pdfObject, (PdfBoxVisualObject) visualObject, - positioningInstruction, signatureProfileSettings); - - properties.buildSignature(); - PDDocument visualDoc; - synchronized (PDDocument.class) { - visualDoc = PDDocument.load(properties.getVisibleSignature()); - } - // PDPageable pageable = new PDPageable(visualDoc); - List pages = new ArrayList(); - visualDoc.getDocumentCatalog().getPages().getAllKids(pages); - - PDPage firstPage = pages.get(0); - - float stdRes = 72; - float targetRes = resolution; - float factor = targetRes / stdRes; - - BufferedImage outputImage = firstPage.convertToImage(BufferedImage.TYPE_4BYTE_ABGR, (int) targetRes); - - BufferedImage cutOut = new BufferedImage((int) (position.getWidth() * factor), - (int) (position.getHeight() * factor), BufferedImage.TYPE_4BYTE_ABGR); - - Graphics2D graphics = (Graphics2D) cutOut.getGraphics(); - - graphics.drawImage(outputImage, 0, 0, cutOut.getWidth(), cutOut.getHeight(), (int) (1 * factor), - (int) (outputImage.getHeight() - ((position.getHeight() + 1) * factor)), - (int) ((1 + position.getWidth()) * factor), (int) (outputImage.getHeight() - - ((position.getHeight() + 1) * factor) + (position.getHeight() * factor)), - null); - return cutOut; - } catch (PdfAsException e) { - logger.warn("PDF-AS Exception", e); - throw ErrorExtractor.searchPdfAsError(e, status); - } catch (Throwable e) { - logger.warn("Unexpected Throwable Exception", e); - throw ErrorExtractor.searchPdfAsError(e, status); - } - } -} diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/PDFASPDFBOXExtractorInterface.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/PDFASPDFBOXExtractorInterface.java deleted file mode 100644 index 2a2ac4b1..00000000 --- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/PDFASPDFBOXExtractorInterface.java +++ /dev/null @@ -1,7 +0,0 @@ -package at.gv.egiz.pdfas.lib.impl.signing.pdfbox; - -import at.gv.egiz.pdfas.lib.impl.signing.PDFASSignatureExtractor; - -public interface PDFASPDFBOXExtractorInterface extends PDFASSignatureExtractor, PDFASPDFBOXSignatureInterface { - -} diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/PDFASPDFBOXSignatureInterface.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/PDFASPDFBOXSignatureInterface.java deleted file mode 100644 index 54eaaf54..00000000 --- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/PDFASPDFBOXSignatureInterface.java +++ /dev/null @@ -1,10 +0,0 @@ -package at.gv.egiz.pdfas.lib.impl.signing.pdfbox; - -import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature; -import org.apache.pdfbox.pdmodel.interactive.digitalsignature.SignatureInterface; - -import at.gv.egiz.pdfas.lib.impl.signing.PDFASSignatureInterface; - -public interface PDFASPDFBOXSignatureInterface extends PDFASSignatureInterface, SignatureInterface { - public void setPDSignature(PDSignature signature); -} diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/PdfboxSignerWrapper.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/PdfboxSignerWrapper.java deleted file mode 100644 index 12b24b3f..00000000 --- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/PdfboxSignerWrapper.java +++ /dev/null @@ -1,99 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -package at.gv.egiz.pdfas.lib.impl.signing.pdfbox; - -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.Calendar; - -import org.apache.commons.io.IOUtils; -import org.apache.pdfbox.exceptions.SignatureException; -import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.gv.egiz.pdfas.common.exceptions.PdfAsException; -import at.gv.egiz.pdfas.common.exceptions.PdfAsWrappedIOException; -import at.gv.egiz.pdfas.common.utils.PDFUtils; -import at.gv.egiz.pdfas.common.utils.StreamUtils; -import at.gv.egiz.pdfas.lib.api.sign.IPlainSigner; -import at.gv.egiz.pdfas.lib.api.sign.SignParameter; -import at.gv.egiz.pdfas.lib.impl.status.RequestedSignature; - -public class PdfboxSignerWrapper implements PDFASPDFBOXSignatureInterface { - - private static final Logger logger = LoggerFactory - .getLogger(PdfboxSignerWrapper.class); - - private IPlainSigner signer; - private PDSignature signature; - private int[] byteRange; - private Calendar date; - private SignParameter parameters; - private RequestedSignature requestedSignature; - - public PdfboxSignerWrapper(IPlainSigner signer, SignParameter parameters, RequestedSignature requestedSignature) { - this.signer = signer; - this.date = Calendar.getInstance(); - this.parameters = parameters; - this.requestedSignature = requestedSignature; - } - - public byte[] sign(InputStream inputStream) throws SignatureException, - IOException { - byte[] data = StreamUtils.inputStreamToByteArray(inputStream); - byteRange = PDFUtils.extractSignatureByteRange(data); - int[] byteRange2 = signature.getByteRange(); - logger.debug("Byte Range 2: " + byteRange2); - try { - logger.debug("Signing with Pdfbox Wrapper"); - byte[] signature = signer.sign(data, byteRange, this.parameters, this.requestedSignature); - - return signature; - } catch (PdfAsException e) { - throw new PdfAsWrappedIOException(e); - } - } - - public int[] getByteRange() { - return byteRange; - } - - public String getPDFSubFilter() { - return this.signer.getPDFSubFilter(); - } - - public String getPDFFilter() { - return this.signer.getPDFFilter(); - } - - public void setPDSignature(PDSignature signature) { - this.signature = signature; - } - - public Calendar getSigningDate() { - return this.date; - } -} diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/SignatureDataExtractor.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/SignatureDataExtractor.java deleted file mode 100644 index 5e3d1085..00000000 --- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/SignatureDataExtractor.java +++ /dev/null @@ -1,94 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -package at.gv.egiz.pdfas.lib.impl.signing.pdfbox; - -import iaik.x509.X509Certificate; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Calendar; - -import org.apache.pdfbox.exceptions.SignatureException; -import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature; - -import at.gv.egiz.pdfas.common.utils.StreamUtils; -import at.gv.egiz.pdfas.lib.impl.signing.PDFASSignatureInterface; - -public class SignatureDataExtractor implements PDFASPDFBOXExtractorInterface { - - protected X509Certificate certificate; - protected byte[] signatureData; - - protected String pdfSubFilter; - protected String pdfFilter; - protected PDSignature signature; - protected int[] byteRange; - protected Calendar date; - - public SignatureDataExtractor(X509Certificate certificate, - String filter, String subfilter, Calendar date) { - this.certificate = certificate; - this.pdfFilter = filter; - this.pdfSubFilter = subfilter; - this.date = date; - } - - public X509Certificate getCertificate() { - return certificate; - } - - public String getPDFSubFilter() { - return this.pdfSubFilter; - } - - public String getPDFFilter() { - return this.pdfFilter; - } - - public byte[] getSignatureData() { - return this.signatureData; - } - - public byte[] sign(InputStream content) throws SignatureException, - IOException { - signatureData = StreamUtils.inputStreamToByteArray(content); - byteRange = this.signature.getByteRange(); - return new byte[] { 0 }; - } - - public void setPDSignature(PDSignature signature) { - this.signature = signature; - } - - public int[] getByteRange() { - return byteRange; - } - - public Calendar getSigningDate() { - return this.date; - } - - - -} diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/FontInfoCache.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/FontInfoCache.java deleted file mode 100644 index 3f85e445..00000000 --- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/FontInfoCache.java +++ /dev/null @@ -1,8 +0,0 @@ -package at.gv.egiz.pdfas.lib.impl.stamping.pdfbox; - -public class FontInfoCache { - String filename; - String fontName; - String fontFamily; - String fontPath; -} diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/IDGenerator.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/IDGenerator.java deleted file mode 100644 index cdb7873b..00000000 --- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/IDGenerator.java +++ /dev/null @@ -1,5 +0,0 @@ -package at.gv.egiz.pdfas.lib.impl.stamping.pdfbox; - -public interface IDGenerator { - public String createHashedId(String value); -} diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/ImageObject.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/ImageObject.java deleted file mode 100644 index f8ec2073..00000000 --- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/ImageObject.java +++ /dev/null @@ -1,63 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -package at.gv.egiz.pdfas.lib.impl.stamping.pdfbox; - -import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage; - -public class ImageObject { - private PDXObjectImage image; - private float width; - private float height; - - public ImageObject(PDXObjectImage image, float width, float height) { - this.image = image; - this.width = width; - this.height = height; - } - - public PDXObjectImage getImage() { - return image; - } - - public void setImage(PDXObjectImage image) { - this.image = image; - } - - public float getWidth() { - return width; - } - - public void setWidth(float width) { - this.width = width; - } - - public float getHeight() { - return height; - } - - public void setHeight(float height) { - this.height = height; - } - -} diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsTemplateCreator.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsTemplateCreator.java deleted file mode 100644 index 911e4117..00000000 --- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsTemplateCreator.java +++ /dev/null @@ -1,170 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -package at.gv.egiz.pdfas.lib.impl.stamping.pdfbox; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; - -import org.apache.pdfbox.exceptions.COSVisitorException; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.PDResources; -import org.apache.pdfbox.pdmodel.common.PDRectangle; -import org.apache.pdfbox.pdmodel.common.PDStream; -import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectForm; -import org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDFTemplateCreator; -import org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDFTemplateStructure; -import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; -import org.apache.pdfbox.pdmodel.interactive.form.PDSignatureField; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.gv.egiz.pdfas.common.exceptions.PdfAsException; - -public class PDFAsTemplateCreator extends PDFTemplateCreator { - - PDFAsVisualSignatureBuilder pdfBuilder; - private static final Logger logger = LoggerFactory.getLogger(PDFAsTemplateCreator.class); - - public PDFAsTemplateCreator(PDFAsVisualSignatureBuilder bookBuilder) { - super(bookBuilder); - this.pdfBuilder = bookBuilder; - } - - - public InputStream buildPDF(PDFAsVisualSignatureDesigner properties, PDDocument originalDocument) - throws IOException, PdfAsException { - logger.debug("pdf building has been started"); - PDFTemplateStructure pdfStructure = pdfBuilder.getStructure(); - - // we create array of [Text, ImageB, ImageC, ImageI] - this.pdfBuilder.createProcSetArray(); - - //create page - this.pdfBuilder.createPage(properties); - PDPage page = pdfStructure.getPage(); - - //create template - this.pdfBuilder.createTemplate(page); - PDDocument template = pdfStructure.getTemplate(); - - //create /AcroForm - this.pdfBuilder.createAcroForm(template); - PDAcroForm acroForm = pdfStructure.getAcroForm(); - - // AcroForm contains singature fields - this.pdfBuilder.createSignatureField(acroForm); - PDSignatureField pdSignatureField = pdfStructure.getSignatureField(); - - // create signature - this.pdfBuilder.createSignature(pdSignatureField, page, properties.getSignatureFieldName()); - - // that is /AcroForm/DR entry - this.pdfBuilder.createAcroFormDictionary(acroForm, pdSignatureField); - - // create AffineTransform - this.pdfBuilder.createAffineTransform(properties.getAffineTransformParams()); - //AffineTransform transform = pdfStructure.getAffineTransform(); - - // rectangle, formatter, image. /AcroForm/DR/XObject contains that form - this.pdfBuilder.createSignatureRectangle(pdSignatureField, properties, properties.getRotation() + properties.getPageRotation()); - this.pdfBuilder.createFormaterRectangle(properties.getFormaterRectangleParams()); - PDRectangle formater = pdfStructure.getFormaterRectangle(); - - //this.pdfBuilder.createSignatureImage(template, properties.getImageStream()); - - // create form stream, form and resource. - this.pdfBuilder.createHolderFormStream(template); - PDStream holderFormStream = pdfStructure.getHolderFormStream(); - this.pdfBuilder.createHolderFormResources(); - PDResources holderFormResources = pdfStructure.getHolderFormResources(); - this.pdfBuilder.createHolderForm(holderFormResources, holderFormStream, formater); - - // that is /AP entry the appearance dictionary. - this.pdfBuilder.createAppearanceDictionary(pdfStructure.getHolderForm(), pdSignatureField, - properties.getRotation() + properties.getPageRotation()); - - // inner formstream, form and resource (hlder form containts inner form) - this.pdfBuilder.createInnerFormStreamPdfAs(template, originalDocument); - this.pdfBuilder.createInnerFormResource(); - PDResources innerFormResource = pdfStructure.getInnerFormResources(); - this.pdfBuilder.createInnerForm(innerFormResource, pdfStructure.getInnterFormStream(), formater); - PDXObjectForm innerForm = pdfStructure.getInnerForm(); - - // inner form must be in the holder form as we wrote - this.pdfBuilder.insertInnerFormToHolerResources(innerForm, holderFormResources); - - // Image form is in this structure: /AcroForm/DR/FRM0/Resources/XObject/n0 - //this.pdfBuilder.createImageFormStream(template); - //PDStream imageFormStream = pdfStructure.getImageFormStream(); - //this.pdfBuilder.createImageFormResources(); - //PDResources imageFormResources = pdfStructure.getImageFormResources(); - //this.pdfBuilder.createImageForm(imageFormResources, innerFormResource, imageFormStream, formater, transform, - // pdfStructure.getJpedImage()); - - // now inject procSetArray - /*this.pdfBuilder.injectProcSetArray(innerForm, page, innerFormResource, imageFormResources, holderFormResources, - pdfStructure.getProcSet());*/ - this.pdfBuilder.injectProcSetArray(innerForm, page, innerFormResource, null, holderFormResources, - pdfStructure.getProcSet()); - - - /*String imgFormName = pdfStructure.getImageFormName(); - String imgName = pdfStructure.getImageName();*/ - String innerFormName = pdfStructure.getInnerFormName(); - - // now create Streams of AP - /*this.pdfBuilder.injectAppearanceStreams(holderFormStream, imageFormStream, imageFormStream, imgFormName, - imgName, innerFormName, properties);*/ - this.pdfBuilder.injectAppearanceStreams(holderFormStream, null, null, null, - null, innerFormName, properties); - this.pdfBuilder.createVisualSignature(template); - this.pdfBuilder.createWidgetDictionary(pdSignatureField, holderFormResources); - - ByteArrayInputStream in = null; - try - { - //COSDocument doc = pdfStructure.getVisualSignature(); - //doc. - //in = pdfStructure.getTemplateAppearanceStream(); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - template.save(baos); - baos.close(); - in = new ByteArrayInputStream(baos.toByteArray()); - } - catch (COSVisitorException e) - { - logger.warn("COSVisitorException: can't get apereance stream ", e); - } - logger.debug("stream returning started, size= " + in.available()); - - // we must close the document - this.pdfBuilder.closeTemplate(template); - - // return result of the stream - return in; - } -} diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureBuilder.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureBuilder.java deleted file mode 100644 index cd3d1899..00000000 --- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureBuilder.java +++ /dev/null @@ -1,653 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -package at.gv.egiz.pdfas.lib.impl.stamping.pdfbox; - -import java.awt.geom.AffineTransform; -import java.awt.geom.Point2D; -import java.awt.image.BufferedImage; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.security.MessageDigest; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.commons.codec.binary.Hex; -import org.apache.pdfbox.cos.COSArray; -import org.apache.pdfbox.cos.COSDictionary; -import org.apache.pdfbox.cos.COSName; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.PDResources; -import org.apache.pdfbox.pdmodel.common.PDRectangle; -import org.apache.pdfbox.pdmodel.common.PDStream; -import org.apache.pdfbox.pdmodel.edit.PDPageContentStream; -import org.apache.pdfbox.pdmodel.graphics.xobject.PDJpeg; -import org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap; -import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectForm; -import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage; -import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceDictionary; -import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream; -import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature; -import org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder; -import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; -import org.apache.pdfbox.pdmodel.interactive.form.PDField; -import org.apache.pdfbox.pdmodel.interactive.form.PDSignatureField; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.gv.egiz.pdfas.common.exceptions.PdfAsException; -import at.gv.egiz.pdfas.common.settings.ISettings; -import at.gv.egiz.pdfas.common.utils.ImageUtils; -import at.knowcenter.wag.egov.egiz.table.Entry; - -public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder implements - IDGenerator { - - private static final Logger logger = LoggerFactory - .getLogger(PDFAsVisualSignatureBuilder.class); - - private PDFAsVisualSignatureProperties properties; - private PDFAsVisualSignatureDesigner designer; - private ISettings settings; - private PDResources innerFormResources; - private Map images = new HashMap(); - - public PDFAsVisualSignatureBuilder( - PDFAsVisualSignatureProperties properties, ISettings settings, - PDFAsVisualSignatureDesigner designer) { - this.properties = properties; - this.settings = settings; - this.designer = designer; - } - - @Override - public void createProcSetArray() { - COSArray procSetArr = new COSArray(); - procSetArr.add(COSName.getPDFName("PDF")); - procSetArr.add(COSName.getPDFName("Text")); - procSetArr.add(COSName.getPDFName("ImageC")); - procSetArr.add(COSName.getPDFName("ImageB")); - procSetArr.add(COSName.getPDFName("ImageI")); - getStructure().setProcSet(procSetArr); - logger.debug("ProcSet array has been created"); - } - - public void createMyPage(PDFAsVisualSignatureDesigner properties) { - PDPage page = properties.getSignaturePage(); - if (page == null) { - page = new PDPage(); - page.setMediaBox(new PDRectangle(properties.getPageWidth(), - properties.getPageHeight())); - - } - getStructure().setPage(page); - logger.info("PDF page has been created"); - } - - @Override - public void createTemplate(PDPage page) throws IOException { - PDDocument template = new PDDocument(); - - template.addPage(page); - getStructure().setTemplate(template); - } - - public String createHashedId(String value) { - try { - MessageDigest md = MessageDigest.getInstance("SHA-1"); - md.reset(); - return Hex.encodeHexString(md.digest(value.getBytes("UTF-8"))); - } catch (Throwable e) { - logger.warn("Failed to generate ID for Image using value", e); - return value; - } - } - - private void readTableResources(PDFBoxTable table, PDDocument template) - throws PdfAsException, IOException { - - float[] colsSizes = table.getColsRelativeWith(); - int max_cols = table.getColCount(); - float padding = table.getPadding(); - if (colsSizes == null) { - colsSizes = new float[max_cols]; - // set the column ratio for all columns to 1 - for (int cols_idx = 0; cols_idx < colsSizes.length; cols_idx++) { - colsSizes[cols_idx] = 1; - } - } - - logger.debug("TOTAL Width: " + table.getWidth()); - - float total = 0; - - for (int cols_idx = 0; cols_idx < colsSizes.length; cols_idx++) { - total += colsSizes[cols_idx]; - } - - for (int cols_idx = 0; cols_idx < colsSizes.length; cols_idx++) { - colsSizes[cols_idx] = (colsSizes[cols_idx] / total) - * table.getWidth(); - } - - for (int cols_idx = 0; cols_idx < colsSizes.length; cols_idx++) { - logger.debug("Col: " + cols_idx + " : " + colsSizes[cols_idx]); - } - - /* - * if(!addedFonts.contains(table.getFont().getFont(null))) { PDFont font - * = table.getFont().getFont(template); addedFonts.add(font); - * innerFormResources.addFont(font); } - * - * if(!addedFonts.contains(table.getValueFont().getFont(null))) { PDFont - * font = table.getValueFont().getFont(template); addedFonts.add(font); - * innerFormResources.addFont(font); } - */ - - for (int i = 0; i < table.getRowCount(); i++) { - ArrayList row = table.getRow(i); - for (int j = 0; j < row.size(); j++) { - Entry cell = (Entry) row.get(j); - if (cell.getType() == Entry.TYPE_IMAGE) { - String img_value = (String) cell.getValue(); - String img_ref = createHashedId(img_value); - if (!images.containsKey(img_ref)) { - BufferedImage img = ImageUtils.getImage(img_value, - settings); - - float width = colsSizes[j]; - float height = table.getRowHeights()[i] + padding * 2; - - float iwidth = (int) Math.floor((double) width); - iwidth -= 2 * padding; - - float iheight = (int) Math.floor((double) height); - iheight -= 2 * padding; - - float origWidth = (float) img.getWidth(); - float origHeight = (float) img.getHeight(); - - if (table.style != null) { - if (table.style.getImageScaleToFit() != null) { - iwidth = table.style.getImageScaleToFit() - .getWidth(); - iheight = table.style.getImageScaleToFit() - .getHeight(); - } - } - - float wfactor = iwidth / origWidth; - float hfactor = iheight / origHeight; - float scaleFactor = wfactor; - if (hfactor < wfactor) { - scaleFactor = hfactor; - } - - iwidth = (float) Math - .floor((double) (scaleFactor * origWidth)); - iheight = (float) Math - .floor((double) (scaleFactor * origHeight)); - - logger.debug("Scaling image to: " + iwidth + " x " - + iheight); - - if (this.designer.properties - .getSignatureProfileSettings().isPDFA()) { - img = ImageUtils.removeAlphaChannel(img); - } else { - if (img.getAlphaRaster() == null - && img.getColorModel().hasAlpha()) { - img = ImageUtils.removeAlphaChannel(img); - } - } - // img = ImageUtils.convertRGBAToIndexed(img); - - PDXObjectImage pdImage = new PDPixelMap(template, img); - - ImageObject image = new ImageObject(pdImage, iwidth, - iheight); - images.put(img_ref, image); - innerFormResources.addXObject(pdImage, "Im"); - } - } else if (cell.getType() == Entry.TYPE_TABLE) { - PDFBoxTable tbl_value = (PDFBoxTable) cell.getValue(); - readTableResources(tbl_value, template); - } - } - } - } - - public void createInnerFormStreamPdfAs(PDDocument template, PDDocument origDoc) - throws PdfAsException { - try { - - // Hint we have to create all PDXObjectImages before creating the - // PDPageContentStream - // only PDFbox developers know why ... - // if (getStructure().getPage().getResources() != null) { - // innerFormResources = getStructure().getPage().getResources(); - // } else { - innerFormResources = new PDResources(); - getStructure().getPage().setResources(innerFormResources); - // } - readTableResources(properties.getMainTable(), template); - - PDPageContentStream stream = new PDPageContentStream(template, - getStructure().getPage()); - // stream.setFont(PDType1Font.COURIER, 5); - TableDrawUtils.drawTable(getStructure().getPage(), stream, 1, 1, - designer.getWidth(), designer.getHeight(), - properties.getMainTable(), template, false, - innerFormResources, images, settings, this, properties); - stream.close(); - PDStream innterFormStream = getStructure().getPage().getContents(); - getStructure().setInnterFormStream(innterFormStream); - logger.debug("Strean of another form (inner form - it would be inside holder form) has been created"); - - } catch (Throwable e) { - logger.warn("Failed to create visual signature block", e); - throw new PdfAsException("Failed to create visual signature block", - e); - } - } - - @Override - public void injectProcSetArray(PDXObjectForm innerForm, PDPage page, - PDResources innerFormResources, PDResources imageFormResources, - PDResources holderFormResources, COSArray procSet) { - innerForm.getResources().getCOSDictionary() - .setItem(COSName.PROC_SET, procSet); // - page.getCOSDictionary().setItem(COSName.PROC_SET, procSet); - innerFormResources.getCOSDictionary() - .setItem(COSName.PROC_SET, procSet); - /* - * imageFormResources.getCOSDictionary() .setItem(COSName.PROC_SET, - * procSet); - */ - holderFormResources.getCOSDictionary().setItem(COSName.PROC_SET, - procSet); - logger.debug("inserted ProcSet to PDF"); - } - - public void injectAppearanceStreams(PDStream holderFormStream, - PDStream innterFormStream, PDStream imageFormStream, - String imageObjectName, String imageName, String innerFormName, - PDFAsVisualSignatureDesigner properties) throws IOException { - - // 100 means that document width is 100% via the rectangle. if rectangle - // is 500px, images 100% is 500px. - // String imgFormComment = "q "+imageWidthSize+ " 0 0 50 0 0 cm /" + - // imageName + " Do Q\n" + builder.toString(); - /* - * String imgFormComment = "q " + 100 + " 0 0 50 0 0 cm /" + imageName + - * " Do Q\n"; - */ - double m00 = getStructure().getAffineTransform().getScaleX(); - double m10 = getStructure().getAffineTransform().getShearY(); - double m01 = getStructure().getAffineTransform().getShearX(); - double m11 = getStructure().getAffineTransform().getScaleY(); - double m02 = getStructure().getAffineTransform().getTranslateX(); - double m12 = getStructure().getAffineTransform().getTranslateY(); - - String holderFormComment = "q " + m00 + " " + m10 + " " + m01 + " " - + m11 + " " + m02 + " " + m12 + " cm /" + innerFormName - + " Do Q"; - - logger.debug("Holder Form Stream: " + holderFormComment); - - // String innerFormComment = "q 1 0 0 1 0 0 cm /" + imageObjectName + - // " Do Q\n"; - String innerFormComment = getStructure().getInnterFormStream() - .getInputStreamAsString(); - - // logger.debug("Inner Form Stream: " + innerFormComment); - - // appendRawCommands(getStructure().getInnterFormStream().createOutputStream(), - // getStructure().getInnterFormStream().getInputStreamAsString()); - - appendRawCommands(getStructure().getHolderFormStream() - .createOutputStream(), holderFormComment.trim().replace("\n", "").replace("\r", "")); - appendRawCommands(getStructure().getInnterFormStream() - .createOutputStream(), innerFormComment/*.trim().replace("\n", "").replace("\r", "")*/); - // appendRawCommands(getStructure().getImageFormStream().createOutputStream(), - // imgFormComment); - logger.debug("Injected apereance stream to pdf"); - - } - - public void createPage(PDFAsVisualSignatureDesigner properties) { - PDPage page = new PDPage(); - page.setMediaBox(new PDRectangle(properties.getPageWidth(), properties - .getPageHeight())); - page.setRotation(properties.getPageRotation()); - getStructure().setPage(page); - logger.debug("PDF page has been created"); - } - - public void createAcroForm(PDDocument template) { - PDAcroForm theAcroForm = new PDAcroForm(template); - template.getDocumentCatalog().setAcroForm(theAcroForm); - getStructure().setAcroForm(theAcroForm); - logger.debug("Acro form page has been created"); - } - - public void createSignatureField(PDAcroForm acroForm) throws IOException { - PDSignatureField sf = new PDSignatureField(acroForm); - getStructure().setSignatureField(sf); - logger.debug("Signature field has been created"); - } - - public void createSignature(PDSignatureField pdSignatureField, PDPage page, - String signatureName) throws IOException { - PDSignature pdSignature = new PDSignature(); - pdSignatureField.setSignature(pdSignature); - pdSignatureField.getWidget().setPage(page); - page.getAnnotations().add(pdSignatureField.getWidget()); - pdSignature.setName(signatureName); - pdSignature.setByteRange(new int[] { 0, 0, 0, 0 }); - pdSignature.setContents(new byte[4096]); - getStructure().setPdSignature(pdSignature); - logger.debug("PDSignatur has been created"); - } - - public void createAcroFormDictionary(PDAcroForm acroForm, - PDSignatureField signatureField) throws IOException { - @SuppressWarnings("unchecked") - List acroFormFields = acroForm.getFields(); - COSDictionary acroFormDict = acroForm.getDictionary(); - acroFormDict.setDirect(true); - acroFormDict.setInt(COSName.SIG_FLAGS, 3); - acroFormFields.add(signatureField); - acroFormDict.setString(COSName.DA, "/sylfaen 0 Tf 0 g"); - getStructure().setAcroFormFields(acroFormFields); - getStructure().setAcroFormDictionary(acroFormDict); - logger.debug("AcroForm dictionary has been created"); - } - - public void createSignatureRectangle(PDSignatureField signatureField, - PDFAsVisualSignatureDesigner properties, float degrees) - throws IOException { - - PDRectangle rect = new PDRectangle(); - - Point2D upSrc = new Point2D.Float(); - upSrc.setLocation(properties.getxAxis() + properties.getWidth(), - properties.getPageHeight() - properties.getyAxis()); - - Point2D llSrc = new Point2D.Float(); - llSrc.setLocation(properties.getxAxis(), properties.getPageHeight() - - properties.getyAxis() - properties.getHeight()); - - rect.setUpperRightX((float) upSrc.getX()); - rect.setUpperRightY((float) upSrc.getY()); - rect.setLowerLeftY((float) llSrc.getY()); - rect.setLowerLeftX((float) llSrc.getX()); - logger.debug("orig rectangle of signature has been created: {}", - rect.toString()); - - AffineTransform transform = new AffineTransform(); - transform.setToIdentity(); - if (degrees % 360 != 0) { - transform.setToRotation(Math.toRadians(degrees), llSrc.getX(), - llSrc.getY()); - } - - Point2D upDst = new Point2D.Float(); - transform.transform(upSrc, upDst); - - Point2D llDst = new Point2D.Float(); - transform.transform(llSrc, llDst); - - float xPos = properties.getxAxis(); - float yPos = properties.getPageHeight() - properties.getyAxis(); - logger.debug("POS {} x {}", xPos, yPos); - logger.debug("SIZE {} x {}", properties.getWidth(), - properties.getHeight()); - // translate according to page! rotation - int pageRotation = properties.getPageRotation(); - AffineTransform translate = new AffineTransform(); - switch (pageRotation) { - case 90: - translate.setToTranslation( - properties.getPageHeight() - - (properties.getPageHeight() - properties - .getyAxis()) - properties.getxAxis() - + properties.getHeight(), - properties.getxAxis() - + properties.getHeight() - - (properties.getPageHeight() - properties - .getyAxis())); - break; - case 180: - // translate.setToTranslation(properties.getPageWidth() - - // properties.getxAxis() - properties.getxAxis(), - // properties.getPageHeight() - properties.getyAxis() + - // properties.getHeight()); - translate.setToTranslation( - properties.getPageWidth() - 2 * xPos, - properties.getPageHeight() - 2 - * (yPos - properties.getHeight())); - break; - case 270: - translate.setToTranslation(-properties.getHeight() + yPos - xPos, - properties.getPageWidth() - (yPos - properties.getHeight()) - - xPos); - break; - } - - translate.transform(upDst, upDst); - translate.transform(llDst, llDst); - - rect.setUpperRightX((float) upDst.getX()); - rect.setUpperRightY((float) upDst.getY()); - rect.setLowerLeftY((float) llDst.getY()); - rect.setLowerLeftX((float) llDst.getX()); - logger.debug("rectangle of signature has been created: {}", - rect.toString()); - signatureField.getWidget().setRectangle(rect); - getStructure().setSignatureRectangle(rect); - logger.debug("rectangle of signature has been created"); - } - - public void createAffineTransform(float[] params) { - AffineTransform transform = new AffineTransform(params[0], params[1], - params[2], params[3], params[4], params[5]); - // transform.rotate(90); - getStructure().setAffineTransform(transform); - logger.debug("Matrix has been added"); - } - - public void createSignatureImage(PDDocument template, - InputStream inputStream) throws IOException { - PDJpeg img = new PDJpeg(template, inputStream); - getStructure().setJpedImage(img); - logger.debug("Visible Signature Image has been created"); - // pdfStructure.setTemplate(template); - inputStream.close(); - - } - - public void createFormaterRectangle(float[] params) { - - PDRectangle formrect = new PDRectangle(); - float[] translated = new float[4]; - getStructure().getAffineTransform().transform(params, 0, translated, 0, - 2); - - formrect.setUpperRightX(translated[0]); - formrect.setUpperRightY(translated[1]); - formrect.setLowerLeftX(translated[2]); - formrect.setLowerLeftY(translated[3]); - - getStructure().setFormaterRectangle(formrect); - logger.debug("Formater rectangle has been created"); - - } - - public void createHolderFormStream(PDDocument template) { - PDStream holderForm = new PDStream(template); - getStructure().setHolderFormStream(holderForm); - logger.debug("Holder form Stream has been created"); - } - - public void createHolderFormResources() { - PDResources holderFormResources = new PDResources(); - getStructure().setHolderFormResources(holderFormResources); - logger.debug("Holder form resources have been created"); - - } - - public void createHolderForm(PDResources holderFormResources, - PDStream holderFormStream, PDRectangle formrect) { - - PDXObjectForm holderForm = new PDXObjectForm(holderFormStream); - holderForm.setResources(holderFormResources); - holderForm.setBBox(formrect); - holderForm.setFormType(1); - getStructure().setHolderForm(holderForm); - logger.debug("Holder form has been created"); - - } - - public void createAppearanceDictionary(PDXObjectForm holderForml, - PDSignatureField signatureField, float degrees) throws IOException { - - PDAppearanceDictionary appearance = new PDAppearanceDictionary(); - appearance.getCOSObject().setDirect(true); - - PDAppearanceStream appearanceStream = new PDAppearanceStream( - holderForml.getCOSStream()); - AffineTransform transform = new AffineTransform(); - transform.setToIdentity(); - transform.rotate(Math.toRadians(degrees)); - appearanceStream.setMatrix(transform); - appearance.setNormalAppearance(appearanceStream); - signatureField.getWidget().setAppearance(appearance); - - getStructure().setAppearanceDictionary(appearance); - logger.debug("PDF appereance Dictionary has been created"); - - } - - public void createInnerFormResource() { - getStructure().setInnerFormResources(innerFormResources); - logger.debug("Resources of another form (inner form - it would be inside holder form) have been created"); - } - - public void createInnerForm(PDResources innerFormResources, - PDStream innerFormStream, PDRectangle formrect) { - PDXObjectForm innerForm = new PDXObjectForm(innerFormStream); - innerForm.setResources(innerFormResources); - innerForm.setBBox(formrect); - innerForm.setFormType(1); - getStructure().setInnerForm(innerForm); - logger.debug("Another form (inner form - it would be inside holder form) have been created"); - - } - - public void insertInnerFormToHolerResources(PDXObjectForm innerForm, - PDResources holderFormResources) { - String name = holderFormResources.addXObject(innerForm, "FRM"); - getStructure().setInnerFormName(name); - logger.debug("Alerady inserted inner form inside holder form"); - } - - public void createImageFormStream(PDDocument template) { - PDStream imageFormStream = new PDStream(template); - getStructure().setImageFormStream(imageFormStream); - logger.debug("Created image form Stream"); - } - - public void createImageFormResources() { - PDResources imageFormResources = new PDResources(); - getStructure().setImageFormResources(imageFormResources); - logger.debug("Created image form Resources"); - } - - public void createImageForm(PDResources imageFormResources, - PDResources innerFormResource, PDStream imageFormStream, - PDRectangle formrect, AffineTransform affineTransform, PDJpeg img) - throws IOException { - - /* - * if you need text on the visible signature - * - * PDFont font = PDTrueTypeFont.loadTTF(this.pdfStructure.getTemplate(), - * new File("D:\\arial.ttf")); font.setFontEncoding(new - * WinAnsiEncoding()); - * - * Map fonts = new HashMap(); - * fonts.put("arial", font); - */ - PDXObjectForm imageForm = new PDXObjectForm(imageFormStream); - imageForm.setBBox(formrect); - imageForm.setMatrix(affineTransform); - imageForm.setResources(imageFormResources); - imageForm.setFormType(1); - /* - * imageForm.getResources().addFont(font); - * imageForm.getResources().setFonts(fonts); - */ - - imageFormResources.getCOSObject().setDirect(true); - String imageFormName = innerFormResource.addXObject(imageForm, "n"); - String imageName = imageFormResources.addXObject(img, "img"); - this.getStructure().setImageForm(imageForm); - this.getStructure().setImageFormName(imageFormName); - this.getStructure().setImageName(imageName); - logger.debug("Created image form"); - } - - public void appendRawCommands(OutputStream os, String commands) - throws IOException { - os.write(commands.getBytes("UTF-8")); - os.close(); - } - - public void createVisualSignature(PDDocument template) { - this.getStructure().setVisualSignature(template.getDocument()); - logger.debug("Visible signature has been created"); - - } - - public void createWidgetDictionary(PDSignatureField signatureField, - PDResources holderFormResources) throws IOException { - - COSDictionary widgetDict = signatureField.getWidget().getDictionary(); - widgetDict.setNeedToBeUpdate(true); - widgetDict.setItem(COSName.DR, holderFormResources.getCOSObject()); - - getStructure().setWidgetDictionary(widgetDict); - logger.debug("WidgetDictionary has been crated"); - } - - public void closeTemplate(PDDocument template) throws IOException { - template.close(); - this.getStructure().getTemplate().close(); - } - -} diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureDesigner.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureDesigner.java deleted file mode 100644 index 1a8bd38c..00000000 --- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureDesigner.java +++ /dev/null @@ -1,471 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -package at.gv.egiz.pdfas.lib.impl.stamping.pdfbox; - -import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.List; - -import javax.imageio.ImageIO; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.common.PDRectangle; - -public class PDFAsVisualSignatureDesigner { - -// private static final Logger logger = LoggerFactory.getLogger(PDFAsVisualSignatureDesigner.class); - - private Float sigImgWidth; - private Float sigImgHeight; - private float xAxis; - private float yAxis; - private float pageHeight; - private float pageWidth; - private InputStream imgageStream; - private String signatureFieldName = "sig"; // default - private float[] formaterRectangleParams = { 0, 0, 100, 50 }; // default - //private float[] AffineTransformParams = { 0, 1, -1, 0, 0, 0 }; // default - private float[] AffineTransformParams = { 1, 0, 0, 1, 0, 0 }; // default - private float imageSizeInPercents; - private PDDocument document = null; - private int page = 0; - private int pageRotation = 0; - private boolean newpage = false; - PDFAsVisualSignatureProperties properties; - - /** - * - * @param doc - * - Already created PDDocument of your PDF document - * @param imageStream - * @param page - * @throws IOException - * - If we can't read, flush, or can't close stream - */ - public PDFAsVisualSignatureDesigner(PDDocument doc, int page, - PDFAsVisualSignatureProperties properties, boolean newpage) throws IOException { - this.properties = properties; - calculatePageSize(doc, page, newpage); - document = doc; - this.page = page; - this.newpage = newpage; - } - - /** - * Each page of document can be different sizes. - * - * @param document - * @param page - */ - private void calculatePageSize(PDDocument document, int page, boolean newpage) { - - if (page < 1) { - throw new IllegalArgumentException("First page of pdf is 1, not " - + page); - } - - List pages = document.getDocumentCatalog().getAllPages(); - if(newpage) { - PDPage lastPage = (PDPage) pages.get(pages.size()-1); - PDRectangle mediaBox = lastPage.findMediaBox(); - pageRotation = lastPage.findRotation() % 360; - if(pageRotation == 90 || pageRotation == 270) { - this.pageHeight(mediaBox.getWidth()); - this.pageWidth = mediaBox.getHeight(); - } else { - this.pageHeight(mediaBox.getHeight()); - this.pageWidth = mediaBox.getWidth(); - } - } else { - PDPage firstPage = (PDPage) pages.get(page - 1); - PDRectangle mediaBox = firstPage.findMediaBox(); - pageRotation = firstPage.findRotation() % 360; - if(pageRotation == 90 || pageRotation == 270) { - this.pageHeight(mediaBox.getWidth()); - this.pageWidth = mediaBox.getHeight(); - } else { - this.pageHeight(mediaBox.getHeight()); - this.pageWidth = mediaBox.getWidth(); - } - } - float x = this.pageWidth; - float y = 0; - this.pageWidth = this.pageWidth + y; - float tPercent = (100 * y / (x + y)); - this.imageSizeInPercents = 100 - tPercent; - } - - /** - * - * @param path - * of image location - * @return image Stream - * @throws IOException - */ - public PDFAsVisualSignatureDesigner signatureImage(String path) - throws IOException { - InputStream fin = new FileInputStream(path); - return signatureImageStream(fin); - } - - /** - * zoom signature image with some percent. - * - * @param percent - * - x % increase image with x percent. - * @return Visible Signature Configuration Object - */ - public PDFAsVisualSignatureDesigner zoom(float percent) { - sigImgHeight = sigImgHeight + (sigImgHeight * percent) / 100; - sigImgWidth = sigImgWidth + (sigImgWidth * percent) / 100; - return this; - } - - /** - * - * @param xAxis - * - x coordinate - * @param yAxis - * - y coordinate - * @return Visible Signature Configuration Object - */ - public PDFAsVisualSignatureDesigner coordinates(float x, float y) { - xAxis(x); - yAxis(y); - return this; - } - - /** - * - * @return xAxis - gets x coordinates - */ - public float getxAxis() { - return xAxis; - } - - /** - * - * @param xAxis - * - x coordinate - * @return Visible Signature Configuration Object - */ - public PDFAsVisualSignatureDesigner xAxis(float xAxis) { - this.xAxis = xAxis; - return this; - } - - /** - * - * @return yAxis - */ - public float getyAxis() { - return yAxis; - } - - /** - * - * @param yAxis - * @return Visible Signature Configuration Object - */ - public PDFAsVisualSignatureDesigner yAxis(float yAxis) { - this.yAxis = yAxis; - return this; - } - - /** - * - * @return signature image width - */ - public float getWidth() { - return this.properties.getMainTable().getWidth(); - } - - /** - * - * @param sets - * signature image width - * @return Visible Signature Configuration Object - */ - public PDFAsVisualSignatureDesigner width(float signatureImgWidth) { - this.sigImgWidth = signatureImgWidth; - return this; - } - - /** - * - * @return signature image height - */ - public float getHeight() { - return this.properties.getMainTable().getHeight(); - } - - /** - * - * @param set - * signature image Height - * @return Visible Signature Configuration Object - */ - public PDFAsVisualSignatureDesigner height(float signatureImgHeight) { - this.sigImgHeight = signatureImgHeight; - return this; - } - - /** - * - * @return template height - */ - protected float getTemplateHeight() { - return getPageHeight(); - } - - /** - * - * @param templateHeight - * @return Visible Signature Configuration Object - */ - private PDFAsVisualSignatureDesigner pageHeight(float templateHeight) { - this.pageHeight = templateHeight; - return this; - } - - /** - * - * @return signature field name - */ - public String getSignatureFieldName() { - return signatureFieldName; - } - - /** - * - * @param signatureFieldName - * @return Visible Signature Configuration Object - */ - public PDFAsVisualSignatureDesigner signatureFieldName( - String signatureFieldName) { - this.signatureFieldName = signatureFieldName; - return this; - } - - /** - * - * @return image Stream - */ - public InputStream getImageStream() { - return imgageStream; - } - - /** - * - * @param imgageStream - * - stream of your visible signature image - * @return Visible Signature Configuration Object - * @throws IOException - * - If we can't read, flush, or close stream of image - */ - private PDFAsVisualSignatureDesigner signatureImageStream( - InputStream imageStream) throws IOException { - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - byte[] buffer = new byte[1024]; - int len; - while ((len = imageStream.read(buffer)) > -1) { - baos.write(buffer, 0, len); - } - baos.flush(); - baos.close(); - - byte[] byteArray = baos.toByteArray(); - byte[] byteArraySecond = byteArray.clone(); - - InputStream inputForBufferedImage = new ByteArrayInputStream(byteArray); - InputStream revertInputStream = new ByteArrayInputStream( - byteArraySecond); - - if (sigImgHeight == null || sigImgWidth == null) { - calcualteImageSize(inputForBufferedImage); - } - - this.imgageStream = revertInputStream; - - return this; - } - - /** - * calculates image width and height. sported formats: all - * - * @param fis - * - input stream of image - * @throws IOException - * - if can't read input stream - */ - private void calcualteImageSize(InputStream fis) throws IOException { - - BufferedImage bimg = ImageIO.read(fis); - int width = bimg.getWidth(); - int height = bimg.getHeight(); - - sigImgHeight = (float) height; - sigImgWidth = (float) width; - - } - - /** - * - * @return Affine Transform parameters of for PDF Matrix - */ - public float[] getAffineTransformParams() { - return AffineTransformParams; - } - - /** - * - * @param affineTransformParams - * @return Visible Signature Configuration Object - */ - public PDFAsVisualSignatureDesigner affineTransformParams( - float[] affineTransformParams) { - AffineTransformParams = affineTransformParams; - return this; - } - - /** - * - * @return formatter PDRectanle parameters - */ - public float[] getFormaterRectangleParams() { - return formaterRectangleParams; - } - - /** - * sets formatter PDRectangle; - * - * @param formaterRectangleParams - * @return Visible Signature Configuration Object - */ - public PDFAsVisualSignatureDesigner formaterRectangleParams( - float[] formaterRectangleParams) { - this.formaterRectangleParams = formaterRectangleParams; - return this; - } - - /** - * - * @return page width - */ - public float getPageWidth() { - return pageWidth; - } - - public PDPage getSignaturePage() { - if (page < 1) { - throw new IllegalArgumentException("First page of pdf is 1, not " - + page); - } - PDPage pdPage = null; - List pages = document.getDocumentCatalog().getAllPages(); - if(newpage) { - pdPage = new PDPage(); - } else { - pdPage = (PDPage) pages.get(page - 1); - } - - return pdPage; - } - - /** - * - * @param sets - * pageWidth - * @return Visible Signature Configuration Object - */ - public PDFAsVisualSignatureDesigner pageWidth(float pageWidth) { - this.pageWidth = pageWidth; - return this; - } - - /** - * - * @return page height - */ - public float getPageHeight() { - return pageHeight; - } - - /** - * - * @return page height - */ - public int getPageRotation() { - return pageRotation; - } - - /** - * get image size in percents - * - * @return - */ - public float getImageSizeInPercents() { - return imageSizeInPercents; - } - - /** - * - * @param imageSizeInPercents - */ - public void imageSizeInPercents(float imageSizeInPercents) { - this.imageSizeInPercents = imageSizeInPercents; - } - - /** - * returns visible signature text - * - * @return - */ - public String getSignatureText() { - throw new UnsupportedOperationException( - "That method is not yet implemented"); - } - - /** - * - * @param signatureText - * - adds the text on visible signature - * @return - */ - public PDFAsVisualSignatureDesigner signatureText(String signatureText) { - throw new UnsupportedOperationException( - "That method is not yet implemented"); - } - - public float getRotation() { - return this.properties.getRotation(); - } - -} diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureProperties.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureProperties.java deleted file mode 100644 index 0b00cac1..00000000 --- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureProperties.java +++ /dev/null @@ -1,148 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -package at.gv.egiz.pdfas.lib.impl.stamping.pdfbox; - -import java.io.IOException; -import java.util.List; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigProperties; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.gv.egiz.pdfas.common.exceptions.PdfAsException; -import at.gv.egiz.pdfas.common.exceptions.PdfAsWrappedIOException; -import at.gv.egiz.pdfas.common.settings.ISettings; -import at.gv.egiz.pdfas.common.settings.SignatureProfileSettings; -import at.gv.egiz.pdfas.lib.impl.pdfbox.PDFBOXObject; -import at.knowcenter.wag.egov.egiz.pdf.PositioningInstruction; - -public class PDFAsVisualSignatureProperties extends PDVisibleSigProperties { - - private static final Logger logger = LoggerFactory.getLogger(PDFAsVisualSignatureProperties.class); - - private ISettings settings; - - private PDFBoxTable main; - - private PDFAsVisualSignatureDesigner designer; - - private float rotationAngle = 0; - - private PDDocument origDoc; - - private SignatureProfileSettings signatureProfileSettings; - - private String alternativeTableCaption=""; - - public PDFAsVisualSignatureProperties(ISettings settings, PDFBOXObject object, - PdfBoxVisualObject visObj, PositioningInstruction pos, SignatureProfileSettings signatureProfileSettings) { - this.settings = settings; - this.signatureProfileSettings = signatureProfileSettings; - try { - main = visObj.getTable(); - } catch (Throwable e) { - e.printStackTrace(); - } - this.rotationAngle = pos.getRotation(); - try { - origDoc = object.getDocument(); - - designer = new PDFAsVisualSignatureDesigner(origDoc, pos.getPage(), this, pos.isMakeNewPage()); - List pages = origDoc.getDocumentCatalog().getAllPages(); - PDPage page = null; - if(pos.isMakeNewPage()) { - page = (PDPage) pages.get(pages.size()-1); - } else { - page = (PDPage) pages.get(pos.getPage() - 1); - } - logger.debug("PAGE width {} HEIGHT {}", designer.getPageWidth(), designer.getPageHeight()); - logger.debug("POS X {} Y {}", pos.getX(), pos.getY()); - int rot = page.findRotation(); - float posy = designer.getPageHeight() - pos.getY(); - float posx = pos.getX(); - /*switch (rot) { - case 90: // CW - posx = designer.getPageHeight() - pos.getY(); - posy = designer.getPageWidth() - main.getWidth(); - break; - case 180: - posy = pos.getY(); - posx = designer.getPageWidth() - pos.getX(); - break; - case 270: // CCW - posx = pos.getY(); - posy = designer.getPageWidth() - pos.getX(); - break; - }*/ - logger.debug("ROT {}", rot); - logger.debug("COORD X {} Y {}", posx, posy); - designer.coordinates(posx, posy); - float[] form_rect = new float[] {0,0, main.getWidth() + 2, main.getHeight() + 2}; - logger.debug("AP Rect: {} {} {} {}", form_rect[0], form_rect[1], form_rect[2], form_rect[3]); - designer.formaterRectangleParams(form_rect); - //this.setPdVisibleSignature(designer); - } catch (Throwable e) { - e.printStackTrace(); - } - } - - @Override - public void buildSignature() throws IOException { - PDFAsVisualSignatureBuilder builder = new PDFAsVisualSignatureBuilder(this, this.settings, designer); - PDFAsTemplateCreator creator = new PDFAsTemplateCreator(builder); - try { - setVisibleSignature(creator.buildPDF(designer, this.origDoc)); - } catch (PdfAsException e) { - throw new PdfAsWrappedIOException(e); - } - } - - public PDFBoxTable getMainTable() { - return main; - } - - - public float getRotation() { - return this.rotationAngle; - } - - public PDFAsVisualSignatureDesigner getDesigner() { - return designer; - } - - public SignatureProfileSettings getSignatureProfileSettings() { - return signatureProfileSettings; - } - - public String getAlternativeTableCaption() { - return alternativeTableCaption; - } - - public void setAlternativeTableCaption(String alternativeTableCaption) { - this.alternativeTableCaption = alternativeTableCaption; - } - -} diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFBoxFont.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFBoxFont.java deleted file mode 100644 index 05c7eb2a..00000000 --- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFBoxFont.java +++ /dev/null @@ -1,298 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -package at.gv.egiz.pdfas.lib.impl.stamping.pdfbox; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import org.apache.fontbox.ttf.NameRecord; -import org.apache.fontbox.ttf.NamingTable; -import org.apache.fontbox.ttf.TTFParser; -import org.apache.fontbox.ttf.TrueTypeFont; -import org.apache.pdfbox.cos.COSBase; -import org.apache.pdfbox.cos.COSDictionary; -import org.apache.pdfbox.cos.COSName; -import org.apache.pdfbox.cos.COSObject; -import org.apache.pdfbox.pdmodel.font.PDFont; -import org.apache.pdfbox.pdmodel.font.PDTrueTypeFont; -import org.apache.pdfbox.pdmodel.font.PDType1Font; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.gv.egiz.pdfas.common.settings.ISettings; -import at.gv.egiz.pdfas.lib.impl.pdfbox.PDFBOXObject; - -public class PDFBoxFont { - - private static final Logger logger = LoggerFactory - .getLogger(PDFBoxFont.class); - - private static final String HELVETICA = "HELVETICA"; - private static final String COURIER = "COURIER"; - private static final String TIMES_ROMAN = "TIMES_ROMAN"; - private static final String BOLD = "BOLD"; - private static final String NORMAL = "NORMAL"; - private static final String ITALIC = "ITALIC"; - private static final String SEP = ":"; - - public static PDFont defaultFont = PDType1Font.HELVETICA; - public static float defaultFontSize = 8; - - private static Map fontStyleMap = new HashMap(); - - private static Map fontInfoCache = new HashMap(); - - static { - fontStyleMap.put(HELVETICA + SEP + NORMAL, PDType1Font.HELVETICA); - fontStyleMap.put(HELVETICA + SEP + BOLD, PDType1Font.HELVETICA_BOLD); - - fontStyleMap.put(COURIER + SEP + NORMAL, PDType1Font.COURIER); - fontStyleMap.put(COURIER + SEP + BOLD, PDType1Font.COURIER_BOLD); - - fontStyleMap.put(TIMES_ROMAN + SEP + NORMAL, PDType1Font.TIMES_ROMAN); - fontStyleMap.put(TIMES_ROMAN + SEP + BOLD, PDType1Font.TIMES_BOLD); - fontStyleMap.put(TIMES_ROMAN + SEP + ITALIC, PDType1Font.TIMES_ITALIC); - } - - public static void showBuildinFonts() { - Iterator it = fontStyleMap.keySet().iterator(); - logger.info("Available Fonts:"); - while (it.hasNext()) { - logger.info(it.next()); - } - } - - PDFont font; - PDFont cachedfont = null; - float fontSize; - String fontDesc; - String ttfFontDesc; - ISettings settings; - - private FontInfoCache getFontInfo(String pathName) { - synchronized (fontInfoCache) { - - if (fontInfoCache.containsKey(pathName)) { - return fontInfoCache.get(pathName); - } else { - try { - String fontNameToLoad = null; - String fontFamilyToLoad = null; - InputStream ttfData = new FileInputStream(pathName); - try { - TrueTypeFont ttf = null; - TTFParser parser = new TTFParser(); - ttf = parser.parseTTF(ttfData); - NamingTable naming = ttf.getNaming(); - List records = naming.getNameRecords(); - for (int i = 0; i < records.size(); i++) { - NameRecord nr = records.get(i); - if (nr.getNameId() == NameRecord.NAME_POSTSCRIPT_NAME) { - fontNameToLoad = nr.getString(); - } else if (nr.getNameId() == NameRecord.NAME_FONT_FAMILY_NAME) { - fontFamilyToLoad = nr.getString(); - } - } - } finally { - ttfData.close(); - } - FontInfoCache fontInfo = new FontInfoCache(); - fontInfo.filename = pathName; - fontInfo.fontFamily = fontFamilyToLoad; - fontInfo.fontName = fontNameToLoad; - fontInfo.fontPath = pathName; - fontInfoCache.put(pathName, fontInfo); - return fontInfo; - } catch (Throwable e) { - logger.warn("Failed to generate FontInfo from file: {}", pathName); - } - return null; - } - } - } - - private PDFont findCachedFont(PDFBOXObject pdfObject, FontInfoCache fontInfo) { - try { - if(pdfObject.getFontCache().containsKey(fontInfo.fontPath)) { - return pdfObject.getFontCache().get(fontInfo.fontPath); - } - - List cosObjects = pdfObject.getDocument().getDocument().getObjectsByType( - COSName.FONT); - - //COSName cosFontName = COSName.getPDFName(fontInfo.fontName); - //COSName cosFontFamily = COSName.getPDFName(fontInfo.fontFamily); - - Iterator cosObjectIt = cosObjects.iterator(); - - while (cosObjectIt.hasNext()) { - COSObject cosObject = cosObjectIt.next(); - COSDictionary baseObject = (COSDictionary) cosObject - .getObject(); - if (baseObject instanceof COSDictionary) { - COSDictionary fontDictionary = (COSDictionary) baseObject; - COSBase subType = cosObject.getItem(COSName.SUBTYPE); - COSDictionary fontDescriptor = (COSDictionary)cosObject.getDictionaryObject(COSName.FONT_DESC); - String fontName = fontDescriptor.getNameAsString(COSName.FONT_NAME); - String fontFamily = fontDescriptor.getNameAsString(COSName.FONT_FAMILY); - logger.debug("Checking Font {} - {}", fontFamily, fontName); - if (COSName.TRUE_TYPE.equals(subType)) { - if (fontInfo.fontName != null && fontInfo.fontName.equals(fontName) && - fontInfo.fontFamily != null && fontInfo.fontFamily.equals(fontFamily)) { - // Found it! :) - logger.info("Found Font {}", fontInfo.fontName); - return new PDTrueTypeFont(fontDictionary); - } else { - logger.debug("Font not found: {} is {}", - fontInfo.fontName, fontName); - } - } else { - logger.debug("Font not a TTF"); - } - } else { - logger.debug("Font not a COSDictionary"); - } - } - } catch (Throwable e) { - logger.info("Failed to find existing TTF fonts!", e); - } - return null; - } - - private PDFont generateTTF(String fonttype, PDFBOXObject pdfObject) - throws IOException { - /*boolean cacheNow = true; - if (pdfObject == null) { - if (this.doc == null) { - this.doc = new PDDocument(); - } - doc = this.doc; - } else { - cacheNow = true; - }*/ - ttfFontDesc = fonttype; - String fontName = fonttype.replaceFirst("TTF:", ""); - String fontPath = this.settings.getWorkingDirectory() + File.separator - + "fonts" + File.separator + fontName; - - logger.debug("Font from: \"" + fontPath + "\"."); - - if(fontStyleMap.containsKey(fontPath)) { - return fontStyleMap.get(fontPath); - } - - FontInfoCache fontInfo = getFontInfo(fontPath); - - if(fontInfo != null) { - - PDFont font = findCachedFont(pdfObject, fontInfo); - - if (font != null) { - return font; - } - } - - logger.debug("Instantiating font."); - - //if (cacheNow) { - cachedfont = PDTrueTypeFont.loadTTF(pdfObject.getDocument(), fontPath); - fontStyleMap.put(fontPath, cachedfont); - return cachedfont; - //} else { - // return PDTrueTypeFont.loadTTF(doc, fontPath); - //} - - } - - private PDFont generateFont(String fonttype, String fontder, - PDFBOXObject pdfObject) throws IOException { - if (fonttype.startsWith("TTF:")) { - // Load TTF Font - return generateTTF(fonttype, pdfObject); - } else { - if (fontder == null) { - fontder = NORMAL; - } - - String fontDesc = fonttype + SEP + fontder; - PDFont font = fontStyleMap.get(fontDesc); - if (font == null) { - showBuildinFonts(); - throw new IOException("Invalid font descriptor"); - } - return font; - } - } - - private void setFont(String desc, PDFBOXObject pdfObject) - throws IOException { - String[] fontArr = desc.split(","); - - if (fontArr.length == 3) { - font = generateFont(fontArr[0], fontArr[2], pdfObject); - fontSize = Float.parseFloat(fontArr[1]); - } else if (fontArr.length == 2 && fontArr[0].startsWith("TTF:")) { - font = generateFont(fontArr[0], null, pdfObject); - fontSize = Float.parseFloat(fontArr[1]); - } else { - logger.warn( - "Using default font because: {} is not a valid font descriptor.", - desc); - this.font = defaultFont; - this.fontSize = defaultFontSize; - } - - } - - public PDFBoxFont(String fontDesc, ISettings settings, - PDFBOXObject pdfObject) throws IOException { - this.settings = settings; - this.fontDesc = fontDesc; - logger.debug("Creating Font: " + fontDesc); - this.setFont(fontDesc, pdfObject); - } - - public PDFont getFont(/*PDFBOXObject pdfObject*/) throws IOException { - if (cachedfont != null) { - return cachedfont; - } - return font; - /* - if (font instanceof PDTrueTypeFont && pdfObject != null) { - return generateTTF(ttfFontDesc, pdfObject); - } else { - return font; - }*/ - } - - public float getFontSize() { - return fontSize; - } -} diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFBoxTable.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFBoxTable.java deleted file mode 100644 index 234cf7a2..00000000 --- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFBoxTable.java +++ /dev/null @@ -1,726 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -package at.gv.egiz.pdfas.lib.impl.stamping.pdfbox; - -import java.awt.Color; -import java.awt.Dimension; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.List; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.font.PDFont; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.gv.egiz.pdfas.common.exceptions.PdfAsException; -import at.gv.egiz.pdfas.common.exceptions.PdfAsWrappedIOException; -import at.gv.egiz.pdfas.common.settings.ISettings; -import at.gv.egiz.pdfas.common.utils.ImageUtils; -import at.gv.egiz.pdfas.common.utils.StringUtils; -import at.gv.egiz.pdfas.lib.impl.pdfbox.PDFBOXObject; -import at.knowcenter.wag.egov.egiz.table.Entry; -import at.knowcenter.wag.egov.egiz.table.Style; -import at.knowcenter.wag.egov.egiz.table.Table; - -public class PDFBoxTable { - - private static final Logger logger = LoggerFactory - .getLogger(PDFBoxTable.class); - - Table table; - Style style; - PDFBoxFont font; - PDFBoxFont valueFont; - ISettings settings; - - float padding; - int positionX = 0; - int positionY = 0; - float tableWidth; - float tableHeight; - Color bgColor; - - boolean[] addPadding; - float[] rowHeights; - float[] colWidths; - - PDDocument originalDoc; - - PDFBOXObject pdfBoxObject; - - private void normalizeContent(Table abstractTable) throws PdfAsException { - try { - int rows = abstractTable.getRows().size(); - for (int i = 0; i < rows; i++) { - ArrayList row = this.table.getRows().get(i); - for (int j = 0; j < row.size(); j++) { - Entry cell = (Entry) row.get(j); - - switch (cell.getType()) { - case Entry.TYPE_CAPTION: - case Entry.TYPE_VALUE: - String value = (String) cell.getValue(); - cell.setValue(StringUtils - .convertStringToPDFFormat(value)); - break; - } - } - } - } catch (UnsupportedEncodingException e) { - throw new PdfAsException("Unsupported Encoding", e); - } - } - - private void initializeStyle(Table abstractTable, PDFBoxTable parent, - PDFBOXObject pdfBoxObject) throws IOException { - this.table = abstractTable; - try { - normalizeContent(abstractTable); - } catch (PdfAsException e) { - throw new PdfAsWrappedIOException(e); - } - - if (parent != null) { - style = Style.doInherit(abstractTable.getStyle(), parent.style); - } else { - style = abstractTable.getStyle(); - } - - if (style == null) { - throw new IOException("Failed to determine Table style, for table " - + abstractTable.getName()); - } - - String fontString = style.getFont(); - - String vfontString = style.getValueFont(); - - if (parent != null && style == parent.style) { - font = parent.getFont(); - - valueFont = parent.getValueFont(); - } else { - if (fontString == null && parent != null && parent.style != null) { - fontString = parent.style.getFont(); - } else if (fontString == null) { - throw new IOException( - "Failed to determine Table font style, for table " - + abstractTable.getName()); - } - - font = new PDFBoxFont(fontString, settings, pdfBoxObject); - - if (vfontString == null && parent != null && parent.style != null) { - vfontString = parent.style.getValueFont(); - } else if (fontString == null) { - throw new IOException( - "Failed to determine value Table font style, for table " - + abstractTable.getName()); - } - - valueFont = new PDFBoxFont(vfontString, settings, pdfBoxObject); - } - padding = style.getPadding(); - - bgColor = style.getBgColor(); - } - - public PDFBoxTable(Table abstractTable, PDFBoxTable parent, float fixSize, - ISettings settings, PDFBOXObject pdfBoxObject) throws IOException, - PdfAsException { - this.settings = settings; - this.pdfBoxObject = pdfBoxObject; - this.originalDoc = pdfBoxObject.getDocument(); - initializeStyle(abstractTable, parent, pdfBoxObject); - float[] relativSizes = abstractTable.getColsRelativeWith(); - if (relativSizes != null) { - colWidths = new float[relativSizes.length]; - float totalrel = 0; - - for (int i = 0; i < relativSizes.length; i++) { - totalrel += relativSizes[i]; - } - - float unit = (fixSize / totalrel); - - for (int i = 0; i < relativSizes.length; i++) { - - colWidths[i] = unit * relativSizes[i]; - } - } else { - colWidths = new float[abstractTable.getMaxCols()]; - float totalrel = abstractTable.getMaxCols(); - float unit = (fixSize / totalrel); - for (int i = 0; i < colWidths.length; i++) { - - colWidths[i] = unit; - } - } - calculateHeightsBasedOnWidths(); - - logger.debug("Generating Table with fixed With {} got width {}", - fixSize, getWidth()); - } - - public PDFBoxTable(Table abstractTable, PDFBoxTable parent, - ISettings settings, PDFBOXObject pdfBoxObject) throws IOException, - PdfAsException { - this.settings = settings; - this.pdfBoxObject = pdfBoxObject; - this.originalDoc = pdfBoxObject.getDocument(); - initializeStyle(abstractTable, parent, pdfBoxObject); - this.calculateWidthHeight(); - } - - private void calculateHeightsBasedOnWidths() throws IOException, - PdfAsException { - int rows = this.table.getRows().size(); - rowHeights = new float[rows]; - addPadding = new boolean[rows]; - - for (int i = 0; i < rows; i++) { - rowHeights[i] = 0; - } - - for (int i = 0; i < rows; i++) { - ArrayList row = this.table.getRows().get(i); - for (int j = 0; j < row.size(); j++) { - Entry cell = (Entry) row.get(j); - - float colWidth = 0;// colWidths[j]; - - int colsleft = cell.getColSpan(); - - if (j + colsleft > colWidths.length) { - throw new IOException( - "Configuration is wrong. Cannot determine column width!"); - } - - for (int k = 0; k < colsleft; k++) { - colWidth = colWidth + colWidths[j + k]; - } - - float cellheight = getCellHeight(cell, colWidth); - - if (rowHeights[i] < cellheight) { - rowHeights[i] = cellheight; - } - - logger.debug("ROW: {} COL: {} Width: {} Height: {}", i, j, - colWidth, cellheight); - - int span = cell.getColSpan() - 1; - j += span; - } - } - - calcTotals(); - } - - private void calculateWidthHeight() throws IOException, PdfAsException { - int cols = this.table.getMaxCols(); - colWidths = new float[cols]; - - for (int i = 0; i < cols; i++) { - colWidths[i] = 0; - } - - int rows = this.table.getRows().size(); - rowHeights = new float[rows]; - - for (int i = 0; i < rows; i++) { - rowHeights[i] = 0; - } - - for (int i = 0; i < rows; i++) { - ArrayList row = this.table.getRows().get(i); - for (int j = 0; j < row.size(); j++) { - Entry cell = (Entry) row.get(j); - float cellWidth = getCellWidth(cell); - - if (colWidths[j] < cellWidth) { - colWidths[j] = cellWidth; - } - - float cellheight = getCellHeight(cell); - - if (rowHeights[i] < cellheight) { - rowHeights[i] = cellheight; - } - - logger.debug("ROW: {} COL: {} Width: {} Height: {}", i, j, - cellWidth, cellheight); - - int span = cell.getColSpan() - 1; - j += span; - } - } - - calcTotals(); - } - - private void calcTotals() { - - this.tableHeight = 0; - - for (int i = 0; i < rowHeights.length; i++) { - this.tableHeight += rowHeights[i]; - } - - // Post Process heights for inner Tables ... - for (int i = 0; i < rowHeights.length; i++) { - ArrayList row = this.table.getRows().get(i); - for (int j = 0; j < row.size(); j++) { - Entry cell = (Entry) row.get(j); - if (cell.getType() == Entry.TYPE_TABLE) { - PDFBoxTable tbl = (PDFBoxTable) cell.getValue(); - if (rowHeights[i] != tbl.getHeight()) { - tbl.setHeight(rowHeights[i]); - } - } - } - } - - this.tableWidth = 0; - - for (int i = 0; i < colWidths.length; i++) { - this.tableWidth += colWidths[i]; - } - } - - private float getCellWidth(Entry cell) throws IOException, PdfAsException { - boolean isValue = true; - switch (cell.getType()) { - case Entry.TYPE_CAPTION: - isValue = false; - case Entry.TYPE_VALUE: - PDFont c = null; - float fontSize; - String string = (String) cell.getValue(); - if (isValue) { - c = valueFont.getFont();//null - fontSize = valueFont.getFontSize(); - } else { - c = font.getFont();//null - fontSize = font.getFontSize(); - } - if (string == null) { - string = ""; - cell.setValue(string); - } - if (string.contains("\n")) { - float maxWidth = 0; - String[] lines = string.split("\n"); - for (int i = 0; i < lines.length; i++) { - float w = c.getStringWidth(lines[i]) / 1000 * fontSize; - if (maxWidth < w) { - maxWidth = w; - } - } - return maxWidth; - } else { - return c.getStringWidth(string) / 1000 * fontSize; - } - case Entry.TYPE_IMAGE: - if (style != null && style.getImageScaleToFit() != null) { - return style.getImageScaleToFit().getWidth(); - } - return 80.f; - case Entry.TYPE_TABLE: - PDFBoxTable pdfBoxTable = null; - if (cell.getValue() instanceof Table) { - pdfBoxTable = new PDFBoxTable((Table) cell.getValue(), this, - this.settings, pdfBoxObject); - cell.setValue(pdfBoxTable); - } else if (cell.getValue() instanceof PDFBoxTable) { - pdfBoxTable = (PDFBoxTable) cell.getValue(); - } else { - throw new IOException("Failed to build PDFBox Table"); - } - return pdfBoxTable.getWidth(); - default: - logger.warn("Invalid Cell Entry Type: " + cell.getType()); - } - return 0; - } - - private String concatLines(String[] lines) { - String v = ""; - for (int i = 0; i < lines.length; i++) { - v += lines[i]; - if (i + 1 < lines.length) { - v += "\n"; - } - } - return v; - } - - private String[] breakString(String value, float maxwidth, PDFont font, - float fontSize) throws IOException { - String[] words = value.split(" "); - List lines = new ArrayList(); - String cLineValue = ""; - for (int i = 0; i < words.length; i++) { - String word = words[i]; - String[] lineBreaks = word.split("\n"); - if (lineBreaks.length > 1 || word.contains("\n")) { - for (int j = 0; j < lineBreaks.length; j++) { - String subword = lineBreaks[j]; - // if (cLine + subword.length() > maxline) { - if (j == 0 && word.startsWith("\n")) { - lines.add(cLineValue.trim()); - cLineValue = ""; - } else if (j != 0) { - lines.add(cLineValue.trim()); - cLineValue = ""; - } - // } - String tmpLine = cLineValue + subword; - float size = font.getStringWidth(tmpLine) / 1000.0f - * fontSize; - if (size > maxwidth && cLineValue.length() != 0) { - lines.add(cLineValue.trim()); - cLineValue = ""; - } - cLineValue += subword + " "; - } - if(lineBreaks.length == 1) { - lines.add(cLineValue.trim()); - cLineValue = ""; - } - } else { - String tmpLine = cLineValue + word; - float size = font.getStringWidth(tmpLine) / 1000.0f * fontSize; - if (size > maxwidth && cLineValue.length() != 0) { - lines.add(cLineValue.trim()); - cLineValue = ""; - } - cLineValue += word + " "; - } - } - lines.add(cLineValue.trim()); - return lines.toArray(new String[0]); - } - - private String[] breakString(String value, int maxline) { - String[] words = value.split(" "); - List lines = new ArrayList(); - int cLine = 0; - String cLineValue = ""; - for (int i = 0; i < words.length; i++) { - String word = words[i]; - String[] lineBreaks = word.split("\n"); - if (lineBreaks.length > 1) { - for (int j = 0; j < lineBreaks.length; j++) { - String subword = lineBreaks[j]; - // if (cLine + subword.length() > maxline) { - lines.add(cLineValue.trim()); - cLineValue = ""; - cLine = 0; - // } - cLineValue += subword + " "; - cLine += subword.length(); - } - } else { - if (cLine + word.length() > maxline && cLineValue.length() != 0) { - lines.add(cLineValue.trim()); - cLineValue = ""; - cLine = 0; - } - cLineValue += word + " "; - cLine += word.length(); - } - } - lines.add(cLineValue.trim()); - return lines.toArray(new String[0]); - } - - // private String[] breakString(String value, PDFont f, float maxwidth) - // throws IOException { - // String[] words = value.split(" "); - // List lines = new ArrayList(); - // int cLine = 0; - // String cLineValue = ""; - // for (int i = 0; i < words.length; i++) { - // String word = words[i]; - // String[] lineBreaks = word.split("\n"); - // if (lineBreaks.length > 1) { - // for (int j = 0; j < lineBreaks.length; j++) { - // String subword = lineBreaks[j]; - // // if (cLine + subword.length() > maxline) { - // lines.add(cLineValue.trim()); - // cLineValue = ""; - // cLine = 0; - // // } - // cLineValue += subword + " "; - // cLine += subword.length(); - // } - // } else { - // if (f.getStringWidth(cLineValue + word) > maxwidth && cLineValue.length() - // != 0) { - // lines.add(cLineValue.trim()); - // cLineValue = ""; - // cLine = 0; - // } - // cLineValue += word + " "; - // cLine += word.length(); - // } - // } - // lines.add(cLineValue.trim()); - // return lines.toArray(new String[0]); - // } - - private float[] getStringHeights(String[] lines, PDFont c, float fontSize) { - float[] heights = new float[lines.length]; - for (int i = 0; i < lines.length; i++) { - float maxLineHeight = 0; - try { - byte[] linebytes = StringUtils.applyWinAnsiEncoding(lines[i]); - for (int j = 0; j < linebytes.length; j++) { - float he = c.getFontHeight(linebytes, j, 1) / 1000 - * fontSize; - if (he > maxLineHeight) { - maxLineHeight = he; - } - } - } catch (UnsupportedEncodingException e) { - logger.warn("failed to determine String height", e); - maxLineHeight = c.getFontDescriptor().getCapHeight() / 1000 - * fontSize; - } catch (IOException e) { - logger.warn("failed to determine String height", e); - maxLineHeight = c.getFontDescriptor().getCapHeight() / 1000 - * fontSize; - } - - heights[i] = maxLineHeight; - } - - return heights; - } - - private float getCellHeight(Entry cell, float width) throws IOException, - PdfAsException { - boolean isValue = true; - switch (cell.getType()) { - case Entry.TYPE_CAPTION: - isValue = false; - case Entry.TYPE_VALUE: - PDFont c = null; - float fontSize; - String string = (String) cell.getValue(); - if (isValue) { - c = valueFont.getFont();//null - fontSize = valueFont.getFontSize(); - } else { - c = font.getFont();//null - fontSize = font.getFontSize(); - } - - String[] lines = breakString(string, (width - padding * 2.0f), c, - fontSize); - cell.setValue(concatLines(lines)); - float[] heights = getStringHeights(lines, c, fontSize); - return fontSize * heights.length + padding * 2; - case Entry.TYPE_IMAGE: - String imageFile = (String) cell.getValue(); - if (style != null && style.getImageScaleToFit() != null) { - // if (style.getImageScaleToFit().getHeight() < width) { - return style.getImageScaleToFit().getHeight() + padding * 2; - // } - } - Dimension dim = ImageUtils.getImageDimensions(imageFile, settings); - float wfactor = (float) ((width - padding * 2.0f) / dim.getWidth()); - float scaleFactor = wfactor; - float iheight = (float) Math - .floor((double) (scaleFactor * dim.getHeight())); - //if (dim.getHeight() > 80.0f) { - // return width + padding * 2; - //} - return (float) iheight + padding * 2; - case Entry.TYPE_TABLE: - PDFBoxTable pdfBoxTable = null; - if (cell.getValue() instanceof Table) { - pdfBoxTable = new PDFBoxTable((Table) cell.getValue(), this, - width, this.settings, this.pdfBoxObject); - cell.setValue(pdfBoxTable); - } else if (cell.getValue() instanceof PDFBoxTable) { - // recreate here beacuse of fixed width! - pdfBoxTable = (PDFBoxTable) cell.getValue(); - pdfBoxTable = new PDFBoxTable(pdfBoxTable.table, this, width, - this.settings, this.pdfBoxObject); - cell.setValue(pdfBoxTable); - } else { - throw new IOException("Failed to build PDFBox Table"); - } - return pdfBoxTable.getHeight(); - default: - logger.warn("Invalid Cell Entry Type: " + cell.getType()); - } - return 0; - } - - private float getCellHeight(Entry cell) throws IOException, PdfAsException { - boolean isValue = true; - switch (cell.getType()) { - case Entry.TYPE_CAPTION: - isValue = false; - case Entry.TYPE_VALUE: - PDFont c = null; - float fontSize; - String string = (String) cell.getValue(); - if (isValue) { - c = valueFont.getFont();//null - fontSize = valueFont.getFontSize(); - } else { - c = font.getFont();//null - fontSize = font.getFontSize(); - } - - if (string.contains("\n")) { - String[] lines = string.split("\n"); - - return fontSize * lines.length + padding * 2; - } else { - return fontSize + padding * 2; - } - case Entry.TYPE_IMAGE: - String imageFile = (String) cell.getValue(); - if (style != null && style.getImageScaleToFit() != null) { - return style.getImageScaleToFit().getHeight() + padding * 2; - } - Dimension dim = ImageUtils.getImageDimensions(imageFile, settings); - if (dim.getHeight() > 80.0f) { - return 80.0f + padding * 2; - } - return (float) dim.getHeight() + padding * 2; - - case Entry.TYPE_TABLE: - PDFBoxTable pdfBoxTable = null; - if (cell.getValue() instanceof Table) { - pdfBoxTable = new PDFBoxTable((Table) cell.getValue(), this, - this.settings, pdfBoxObject); - cell.setValue(pdfBoxTable); - } else if (cell.getValue() instanceof PDFBoxTable) { - pdfBoxTable = (PDFBoxTable) cell.getValue(); - } else { - throw new IOException("Failed to build PDFBox Table"); - } - return pdfBoxTable.getHeight(); - default: - logger.warn("Invalid Cell Entry Type: " + cell.getType()); - } - return 0; - } - - public int getX() { - return this.positionX; - } - - public int getY() { - return this.positionY; - } - - public float getWidth() { - return tableWidth; - } - - public float getHeight() { - return tableHeight; - } - - public void setHeight(float height) { - float diff = height - this.getHeight(); - if (diff > 0) { - this.rowHeights[rowHeights.length - 1] += diff; - calcTotals(); - } else { - logger.warn("Table cannot be this small!"); - } - } - - public float[] getRowHeights() { - return rowHeights; - } - - public int getRowCount() { - return this.table.getRows().size(); - } - - public int getColCount() { - return this.table.getMaxCols();// .getColsRelativeWith().length; - } - - public float[] getColsRelativeWith() { - return this.table.getColsRelativeWith(); - } - - public float getPadding() { - return this.padding; - } - - public void dumpTable() { - logger.debug("====================================================================="); - logger.debug("Information about: " + this.table.getName()); - logger.debug("\tDimensions: {} x {} (W x H)", this.tableWidth, - this.tableHeight); - logger.debug("\tPadding: {}", padding); - logger.debug("\t================================"); - logger.debug("\tRow Heights:"); - for (int i = 0; i < rowHeights.length; i++) { - logger.debug("\t[{}] : {}", i, this.rowHeights[i]); - } - logger.debug("\t================================"); - logger.debug("\tCol Widths:"); - for (int i = 0; i < colWidths.length; i++) { - logger.debug("\t[{}] : {}", i, this.colWidths[i]); - } - logger.debug("\t================================"); - logger.debug("\tTable:"); - logger.debug("\t" + this.table.toString()); - logger.debug("====================================================================="); - } - - public Table getOrigTable() { - return this.table; - } - - public ArrayList getRow(int i) { - return this.table.getRows().get(i); - } - - public PDFBoxFont getFont() { - return font; - } - - public PDFBoxFont getValueFont() { - return valueFont; - } - - public Color getBGColor() { - return this.bgColor; - } -} diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PdfBoxStamper.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PdfBoxStamper.java deleted file mode 100644 index 6d1fccff..00000000 --- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PdfBoxStamper.java +++ /dev/null @@ -1,67 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -package at.gv.egiz.pdfas.lib.impl.stamping.pdfbox; - -import java.io.IOException; - -import at.gv.egiz.pdfas.common.exceptions.PdfAsException; -import at.gv.egiz.pdfas.common.exceptions.PdfAsWrappedIOException; -import at.gv.egiz.pdfas.common.settings.ISettings; -import at.gv.egiz.pdfas.lib.impl.pdfbox.PDFBOXObject; -import at.gv.egiz.pdfas.lib.impl.stamping.IPDFStamper; -import at.gv.egiz.pdfas.lib.impl.stamping.IPDFVisualObject; -import at.gv.egiz.pdfas.lib.impl.status.PDFObject; -import at.knowcenter.wag.egov.egiz.pdf.PositioningInstruction; -import at.knowcenter.wag.egov.egiz.table.Table; - -public class PdfBoxStamper implements IPDFStamper { - -// private static final Logger logger = LoggerFactory.getLogger(PdfBoxStamper.class); - -// private PDFTemplateBuilder pdfBuilder; - - public PdfBoxStamper() { -// this.pdfBuilder = new PDVisibleSigBuilder(); - } - - public IPDFVisualObject createVisualPDFObject(PDFObject pdf, Table table) throws IOException { - try { - PDFBOXObject pdfboxObject = (PDFBOXObject)pdf; - return new PdfBoxVisualObject(table, pdf.getStatus().getSettings(), pdfboxObject); - } catch (PdfAsException e) { - throw new PdfAsWrappedIOException(e); - } - } - - public byte[] writeVisualObject(IPDFVisualObject visualObject, - PositioningInstruction positioningInstruction, byte[] pdfData, - String placeholderName) throws PdfAsException { - return null; - } - - public void setSettings(ISettings settings) { - // not needed currently - } - -} diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PdfBoxVisualObject.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PdfBoxVisualObject.java deleted file mode 100644 index feacf3d1..00000000 --- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PdfBoxVisualObject.java +++ /dev/null @@ -1,108 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -package at.gv.egiz.pdfas.lib.impl.stamping.pdfbox; - -import java.io.IOException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.gv.egiz.pdfas.common.exceptions.PdfAsException; -import at.gv.egiz.pdfas.common.settings.ISettings; -import at.gv.egiz.pdfas.lib.impl.pdfbox.PDFBOXObject; -import at.gv.egiz.pdfas.lib.impl.stamping.IPDFVisualObject; -import at.knowcenter.wag.egov.egiz.table.Table; - -public class PdfBoxVisualObject implements IPDFVisualObject { - - private static final Logger logger = LoggerFactory - .getLogger(PdfBoxVisualObject.class); - - private Table abstractTable; - private PDFBoxTable table; - private float width; - private float x; - private float y; - private int page; - private ISettings settings; - private PDFBOXObject pdfBoxObject; - - public PdfBoxVisualObject(Table table, ISettings settings, PDFBOXObject pdfBoxObject) - throws IOException, PdfAsException { - this.abstractTable = table; - this.pdfBoxObject = pdfBoxObject; - this.table = new PDFBoxTable(table, null, settings, pdfBoxObject); - this.settings = settings; - } - - public void setWidth(float width) { - this.width = width; - } - - public void fixWidth() { - try { - table = new PDFBoxTable(abstractTable, null, this.width, settings, this.pdfBoxObject); - } catch (IOException e) { - logger.warn("Failed to fix width of Table!", e); - } catch (PdfAsException e) { - logger.warn("Failed to fix width of Table!", e); - } - } - - public float getHeight() { - return table.getHeight(); - } - - public float getWidth() { - return table.getWidth(); - } - - public void setXPos(float x) { - this.x = x; - } - - public void setYPos(float y) { - this.y = y; - } - - public float getX() { - return x; - } - - public float getY() { - return y; - } - - public int getPage() { - return page; - } - - public void setPage(int page) { - this.page = page; - } - - public PDFBoxTable getTable() { - return this.table; - } -} diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/StamperFactory.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/StamperFactory.java deleted file mode 100644 index d9377d7f..00000000 --- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/StamperFactory.java +++ /dev/null @@ -1,25 +0,0 @@ -package at.gv.egiz.pdfas.lib.impl.stamping.pdfbox; - -import at.gv.egiz.pdfas.common.exceptions.PdfAsException; -import at.gv.egiz.pdfas.common.settings.ISettings; -import at.gv.egiz.pdfas.lib.impl.stamping.IPDFStamper; - -public class StamperFactory { - - //public static final String DEFAULT_STAMPER_CLASS = "at.gv.egiz.pdfas.stmp.itext.ITextStamper"; - public static final String DEFAULT_STAMPER_CLASS = "at.gv.egiz.pdfas.lib.impl.stamping.pdfbox.PdfBoxStamper"; - - public static IPDFStamper createDefaultStamper(ISettings settings) throws PdfAsException { - try { - Class cls = Class.forName(DEFAULT_STAMPER_CLASS); - Object st = cls.newInstance(); - if (!(st instanceof IPDFStamper)) - throw new ClassCastException(); - IPDFStamper stamper = (IPDFStamper) st; - stamper.setSettings(settings); - return stamper; - } catch (Throwable e) { - throw new PdfAsException("error.pdf.stamp.10", e); - } - } -} \ No newline at end of file diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/TableDrawUtils.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/TableDrawUtils.java deleted file mode 100644 index e29766d8..00000000 --- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/TableDrawUtils.java +++ /dev/null @@ -1,605 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -package at.gv.egiz.pdfas.lib.impl.stamping.pdfbox; - -import java.awt.Color; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.Map; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.PDResources; -import org.apache.pdfbox.pdmodel.edit.PDPageContentStream; -import org.apache.pdfbox.pdmodel.font.PDFont; -import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.gv.egiz.pdfas.common.exceptions.PdfAsException; -import at.gv.egiz.pdfas.common.settings.ISettings; -import at.knowcenter.wag.egov.egiz.table.Entry; -import at.knowcenter.wag.egov.egiz.table.Style; - -public class TableDrawUtils { - - private static final Logger logger = LoggerFactory - .getLogger(TableDrawUtils.class); - - public static final String TABLE_DEBUG = "debug.table"; - - public static void drawTable(PDPage page, - PDPageContentStream contentStream, float x, float y, float width, - float height, PDFBoxTable abstractTable, PDDocument doc, - boolean subtable, PDResources formResources, - Map images, ISettings settings, IDGenerator generator, PDFAsVisualSignatureProperties properties) - throws PdfAsException { - - logger.debug("Drawing Table: X {} Y {} WIDTH {} HEIGHT {} \n{}", x, y, - width, height, abstractTable.getOrigTable().toString()); - - abstractTable.getOrigTable().setWidth(width); - - drawTableBackground(page, contentStream, x, y, width, height, - abstractTable, settings); - - drawBorder(page, contentStream, x, y, width, height, abstractTable, - doc, subtable, settings); -//append strings - drawContent(page, contentStream, x, y, width, height, abstractTable, - doc, subtable, formResources, images, settings, generator, properties); - } - - public static void drawContent(PDPage page, - PDPageContentStream contentStream, float x, float y, float width, - float height, PDFBoxTable abstractTable, PDDocument doc, - boolean subtable, PDResources formResources, - Map images, ISettings settings, IDGenerator generator, PDFAsVisualSignatureProperties properties) - throws PdfAsException { - - float contentx = x; - float contenty = y + height; - float padding = abstractTable.getPadding(); - float[] colsSizes = getColSizes(abstractTable); - StringBuilder alternateTableCaption = new StringBuilder(); - for (int i = 0; i < abstractTable.getRowCount(); i++) { - ArrayList row = abstractTable.getRow(i); - for (int j = 0; j < row.size(); j++) { - Entry cell = (Entry) row.get(j); - - // Cell only contains default values so table style is the primary style - Style inherit_style = Style.doInherit(abstractTable.style, cell.getStyle()); - cell.setStyle(inherit_style); - - float colWidth = 0;//colWidths[j]; - - int colsleft = cell.getColSpan(); - - if (j + colsleft > colsSizes.length) { - throw new PdfAsException( - "Configuration is wrong. Cannot determine column width!"); - } - - for (int k = 0; k < colsleft; k++) { - colWidth = colWidth + colsSizes[j + k]; - } - - drawDebugPadding(contentStream, contentx, contenty, padding, - colWidth, abstractTable.getRowHeights()[i], settings); - - switch (cell.getType()) { - case Entry.TYPE_CAPTION: - drawCaption(page, contentStream, contentx, contenty, - colWidth, abstractTable.getRowHeights()[i], - padding, abstractTable, doc, cell, formResources, settings); - addToAlternateTableCaption(cell, alternateTableCaption); - break; - case Entry.TYPE_VALUE: - drawValue(page, contentStream, contentx, contenty, - colWidth, abstractTable.getRowHeights()[i], - padding, abstractTable, doc, cell, formResources, settings); - addToAlternateTableCaption(cell, alternateTableCaption); - break; - case Entry.TYPE_IMAGE: - drawImage(page, contentStream, contentx, contenty, - colWidth, abstractTable.getRowHeights()[i], - padding, abstractTable, doc, cell, formResources, - images, settings, generator); - break; - case Entry.TYPE_TABLE: - - PDFBoxTable tbl_value = (PDFBoxTable) cell.getValue(); - - Style inherit_styletab = Style.doInherit( - abstractTable.style, cell.getStyle()); - tbl_value.table.setStyle(inherit_styletab); - - drawTable(page, contentStream, contentx, contenty - - abstractTable.getRowHeights()[i], colWidth, - abstractTable.getRowHeights()[i], tbl_value, doc, - true, formResources, images, settings, generator,properties); - break; - default: - logger.warn("Unknown Cell entry type: " + cell.getType()); - break; - } - - // Move content pointer - contentx += colWidth; - - int span = cell.getColSpan() - 1; - j += span; - } - - // Move content pointer - contenty -= abstractTable.getRowHeights()[i]; - contentx = x; - } - properties.setAlternativeTableCaption(alternateTableCaption.toString()); - } - - private static void drawString(PDPage page, - PDPageContentStream contentStream, float contentx, float contenty, - float width, float height, float padding, - PDFBoxTable abstractTable, PDDocument doc, Entry cell, - float fontSize, float textHeight, String valign, String halign, - String[] tlines, PDFont textFont, PDResources formResources, - ISettings settings) throws PdfAsException { - try { - float ty = contenty - padding; - float tx = contentx + padding; - float innerHeight = height - (2 * padding); - float innerWidth = width - (2 * padding); - if (Style.BOTTOM.equals(valign)) { - float bottom_offset = innerHeight - textHeight; - ty -= bottom_offset; - } else if (Style.MIDDLE.equals(valign)) { - float bottom_offset = innerHeight - textHeight; - bottom_offset = bottom_offset / 2.0f; - ty -= bottom_offset; - } - - // calculate the max with of the text content - float maxWidth = 0; - for (int k = 0; k < tlines.length; k++) { - float lineWidth; - // if (textFont instanceof PDType1Font) { - lineWidth = textFont.getStringWidth(tlines[k]) / 1000.0f - * fontSize; - /* - * } else { float fwidth = textFont - * .getStringWidth("abcdefghijklmnopqrstuvwxyz ") / 1000.0f * - * fontSize; fwidth = fwidth / (float) - * "abcdefghijklmnopqrstuvwxyz" .length(); lineWidth = - * tlines[k].length() * fwidth; } - */ - if (maxWidth < lineWidth) { - maxWidth = lineWidth; - } - } - - if (Style.CENTER.equals(halign)) { - float offset = innerWidth - maxWidth; - if (offset > 0) { - offset = offset / 2.0f; - tx += offset; - } - } else if (Style.RIGHT.equals(halign)) { - float offset = innerWidth - maxWidth; - if (offset > 0) { - tx += offset; - } - } - float ascent = textFont.getFontDescriptor().getAscent(); - float descent = textFont.getFontDescriptor().getDescent(); - - ascent = ascent / 1000.0f * fontSize; - descent = descent / 1000.0f * fontSize; - - //ty = ty + (descent * (-1)); - - logger.debug("Text tx {} ty {} maxWidth {} textHeight {}", tx, ty, - maxWidth, textHeight); - logger.debug("Text ASCENT {} DESCENT {}", ascent, descent); - - logger.debug("Text TRANSFORMED ASCENT {} DESCENT {}", ascent, descent); - - drawDebugLineString(contentStream, tx, ty, maxWidth, textHeight, descent, settings); - - contentStream.beginText(); - - if (formResources.getFonts().containsValue(textFont)) { - String fontID = getFontID(textFont, formResources); - logger.debug("Using Font: " + fontID); - contentStream.appendRawCommands("/" + fontID + " " + fontSize - + " Tf\n"); - } else { - contentStream.setFont(textFont, fontSize); - } - - logger.debug("Writing: " + tx + " : " + (ty - fontSize + (descent * (-1))) + " as " - + cell.getType()); - contentStream.moveTextPositionByAmount(tx, (ty - fontSize + (descent * (-1)))); - - contentStream.appendRawCommands(fontSize + " TL\n"); - for (int k = 0; k < tlines.length; k++) { - contentStream.drawString(tlines[k]); - if (k < tlines.length - 1) { - contentStream.appendRawCommands("T*\n"); - } - } - - contentStream.endText(); - - } catch (IOException e) { - logger.warn("IO Exception", e); - throw new PdfAsException("Error", e); - } - } - - public static void drawCaption(PDPage page, - PDPageContentStream contentStream, float contentx, float contenty, - float width, float height, float padding, - PDFBoxTable abstractTable, PDDocument doc, Entry cell, - PDResources formResources, ISettings settings) - throws PdfAsException { - - logger.debug("Drawing Caption @ X: {} Y: {}", contentx, contenty); - - try { - float fontSize = PDFBoxFont.defaultFontSize; - PDFont textFont = PDFBoxFont.defaultFont; - - textFont = abstractTable.getFont().getFont();//doc); - fontSize = abstractTable.getFont().getFontSize(); - - // get the cell Text - String text = (String) cell.getValue(); - String[] tlines = text.split("\n"); - float textHeight = fontSize * tlines.length; - - Style cellStyle = cell.getStyle(); - String valign = cellStyle.getVAlign(); - String halign = cellStyle.getHAlign(); - - drawString(page, contentStream, contentx, contenty, width, height, - padding, abstractTable, doc, cell, fontSize, textHeight, - valign, halign, tlines, textFont, formResources, settings); - } catch (IOException e) { - logger.warn("IO Exception", e); - throw new PdfAsException("Error", e); - } - } - - public static void drawValue(PDPage page, - PDPageContentStream contentStream, float contentx, float contenty, - float width, float height, float padding, - PDFBoxTable abstractTable, PDDocument doc, Entry cell, - PDResources formResources, ISettings settings) - throws PdfAsException { - - logger.debug("Drawing Value @ X: {} Y: {}", contentx, contenty); - - try { - float fontSize = PDFBoxFont.defaultFontSize; - PDFont textFont = PDFBoxFont.defaultFont; - - textFont = abstractTable.getValueFont().getFont();//doc); - fontSize = abstractTable.getValueFont().getFontSize(); - - // get the cell Text - String text = (String) cell.getValue(); - String[] tlines = text.split("\n"); - float textHeight = fontSize * tlines.length; - - Style cellStyle = cell.getStyle(); - String valign = cellStyle.getValueVAlign(); - String halign = cellStyle.getValueHAlign(); - - drawString(page, contentStream, contentx, contenty, width, height, - padding, abstractTable, doc, cell, fontSize, textHeight, - valign, halign, tlines, textFont, formResources, settings); - } catch (IOException e) { - logger.warn("IO Exception", e); - throw new PdfAsException("Error", e); - } - } - - public static void drawImage(PDPage page, - PDPageContentStream contentStream, float contentx, float contenty, - float width, float height, float padding, - PDFBoxTable abstractTable, PDDocument doc, Entry cell, - PDResources formResources, Map images, - ISettings settings, IDGenerator generator) throws PdfAsException { - try { - float innerHeight = height; - float innerWidth = width; - - String img_ref = generator.createHashedId((String) cell.getValue()); - if (!images.containsKey(img_ref)) { - logger.warn("Image not prepared! : " + img_ref); - throw new PdfAsException("Image not prepared! : " + img_ref); - } - ImageObject image = images.get(img_ref); - PDXObjectImage pdImage = image.getImage(); - - float imgx = contentx; - float hoffset = innerWidth - image.getWidth(); - if (cell.getStyle().getImageHAlign() != null - && cell.getStyle().getImageHAlign().equals(Style.LEFT)) { - hoffset = hoffset / 2.0f; - imgx += hoffset; - } else if (cell.getStyle().getImageHAlign() != null - && cell.getStyle().getImageHAlign().equals(Style.RIGHT)) { - imgx += hoffset; - } else { - hoffset = hoffset / 2.0f; - imgx += hoffset; - } - - float imgy = contenty; - float voffset = innerHeight - image.getHeight(); - if (cell.getStyle().getImageVAlign() != null - && cell.getStyle().getImageVAlign().equals(Style.MIDDLE)) { - voffset = voffset / 2.0f; - imgy -= voffset; - } else if (cell.getStyle().getImageVAlign() != null - && cell.getStyle().getImageVAlign().equals(Style.BOTTOM)) { - imgy -= voffset; - } - - drawDebugLine(contentStream, imgx, imgy, image.getWidth(), - image.getHeight(), settings); - - // logger.debug("Image: " + imgx + " : " + (imgy - - // image.getHeight())); - contentStream.drawXObject(pdImage, imgx, imgy - image.getHeight(), - image.getWidth(), image.getHeight()); - } catch (IOException e) { - logger.warn("IO Exception", e); - throw new PdfAsException("Error", e); - } - - } - - public static float[] getColSizes(PDFBoxTable abstractTable) { - float[] origcolsSizes = abstractTable.getColsRelativeWith(); - int max_cols = abstractTable.getColCount(); - float[] colsSizes = new float[max_cols]; - if (origcolsSizes == null) { - // set the column ratio for all columns to 1 - for (int cols_idx = 0; cols_idx < colsSizes.length; cols_idx++) { - colsSizes[cols_idx] = 1; - } - } else { - // set the column ratio for all columns to 1 - for (int cols_idx = 0; cols_idx < colsSizes.length; cols_idx++) { - colsSizes[cols_idx] = origcolsSizes[cols_idx]; - } - } - - // adapt - float total = 0; - - for (int cols_idx = 0; cols_idx < colsSizes.length; cols_idx++) { - total += colsSizes[cols_idx]; - } - - for (int cols_idx = 0; cols_idx < colsSizes.length; cols_idx++) { - colsSizes[cols_idx] = (colsSizes[cols_idx] / total) - * abstractTable.getWidth(); - } - - float sum = 0; - - for (int cols_idx = 0; cols_idx < colsSizes.length; cols_idx++) { - sum += colsSizes[cols_idx]; - } - - logger.debug("Table Col Sizes SUM {} Table Width {}", sum, - abstractTable.getWidth()); - logger.debug("Table Table Height {}", abstractTable.getHeight()); - - return colsSizes; - } - - public static void drawBorder(PDPage page, - PDPageContentStream contentStream, float x, float y, float width, - float height, PDFBoxTable abstractTable, PDDocument doc, - boolean subtable, ISettings settings) throws PdfAsException { - try { - - logger.debug("Drawing Table borders for " - + abstractTable.getOrigTable().getName()); - - final int rows = abstractTable.getRowCount(); - float border = abstractTable.style.getBorder(); - float[] colsSizes = getColSizes(abstractTable); - - if (border > 0) { - contentStream.setLineWidth(border); - - float x_from = x; - float x_to = x + width; - float y_from = y + height; - float y_to = y + height; - - // draw first line - logger.debug("ROW LINE: {} {} {} {}", x_from, y_from, x_to, - y_from); - contentStream.drawLine(x, y_from, x_to, y_from); - - // Draw all row borders - for (int i = 0; i < rows; i++) { - y_from -= abstractTable.getRowHeights()[i]; - - // Draw row border! - logger.debug("ROW LINE: {} {} {} {}", x_from, y_from, x_to, - y_from); - contentStream.drawLine(x, y_from, x_to, y_from); - - } - - // reset y for "line feed" - y_from = y + height; - y_to = y_from - abstractTable.getRowHeights()[0]; - - // Draw all column borders - for (int i = 0; i < rows; i++) { - ArrayList row = abstractTable.getRow(i); - - // reset x for "line feed" - x_from = x; - - // draw first line - logger.debug("COL LINE: {} {} {} {}", x_from, y_from, - x_from, y_to); - - contentStream.drawLine(x_from, y_from, x_from, y_to); - - for (int j = 0; j < row.size(); j++) { - Entry cell = (Entry) row.get(j); - - for (int k = 0; k < cell.getColSpan(); k++) { - if (k + j < colsSizes.length) { - x_from += colsSizes[k + j]; - } - } - logger.debug("COL LINE: {} {} {} {}", x_from, y_from, - x_from, y_to); - contentStream.drawLine(x_from, y_from, x_from, y_to); - } - - if (i + 1 < rows) { - y_from = y_to; - y_to = y_from - abstractTable.getRowHeights()[i + 1]; - } - } - - } - } catch (Throwable e) { - logger.warn("drawing table borders", e); - throw new PdfAsException("drawing table borders", e); - } - } - - public static void drawTableBackground(PDPage page, - PDPageContentStream contentStream, float x, float y, float width, - float height, PDFBoxTable abstractTable, ISettings settings) - throws PdfAsException { - try { - if (abstractTable.getBGColor() != null) { - contentStream.setNonStrokingColor(abstractTable.getBGColor()); - contentStream.fillRect(x, y, abstractTable.getWidth(), - abstractTable.getHeight()); - contentStream.setNonStrokingColor(Color.BLACK); - } - } catch (Throwable e) { - logger.warn("drawing table borders", e); - throw new PdfAsException("drawing table borders", e); - } - } - - private static void drawDebugLine(PDPageContentStream contentStream, - float x, float y, float width, float height, ISettings settings) { - if ("true".equals(settings.getValue(TABLE_DEBUG))) { - try { - contentStream.setStrokingColor(Color.RED); - contentStream.drawLine(x, y, x + width, y); - contentStream.setStrokingColor(Color.BLUE); - contentStream.drawLine(x, y, x, y - height); - contentStream.setStrokingColor(Color.GREEN); - contentStream.drawLine(x + width, y, x + width, y - height); - contentStream.setStrokingColor(Color.ORANGE); - contentStream.drawLine(x, y - height, x + width, y - height); - - contentStream.setStrokingColor(Color.BLACK); - } catch (Throwable e) { - e.printStackTrace(); - } - } - } - - private static void drawDebugLineString(PDPageContentStream contentStream, - float x, float y, float width, float height, float descent, ISettings settings) { - if ("true".equals(settings.getValue(TABLE_DEBUG))) { - try { - contentStream.setStrokingColor(Color.RED); - contentStream.drawLine(x, y, x + width, y); - contentStream.setStrokingColor(Color.BLUE); - contentStream.drawLine(x, y, x, y - height); - contentStream.setStrokingColor(Color.GREEN); - contentStream.drawLine(x + width, y, x + width, y - height); - contentStream.setStrokingColor(Color.ORANGE); - contentStream.drawLine(x, y - height, x + width, y - height); - contentStream.setStrokingColor(Color.MAGENTA); - contentStream.drawLine(x, y + (descent * (-1)) - height, x + width, y + (descent * (-1)) - height); - - contentStream.setStrokingColor(Color.BLACK); - } catch (Throwable e) { - e.printStackTrace(); - } - } - } - - private static void drawDebugPadding(PDPageContentStream contentStream, - float x, float y, float padding, float width, float height, - ISettings settings) { - if ("true".equals(settings.getValue(TABLE_DEBUG))) { - try { - contentStream.setStrokingColor(Color.RED); - contentStream.drawLine(x, y, x + padding, y - padding); - contentStream.drawLine(x + width, y, x + width - padding, y - - padding); - contentStream.drawLine(x + width, y - height, x + width - - padding, y - height + padding); - contentStream.drawLine(x, y - height, x + padding, y - height - + padding); - contentStream.setStrokingColor(Color.BLACK); - } catch (Throwable e) { - e.printStackTrace(); - } - } - } - - private static String getFontID(PDFont font, PDResources resources) { - Iterator> it = resources.getFonts() - .entrySet().iterator(); - while (it.hasNext()) { - java.util.Map.Entry entry = it.next(); - if (entry.getValue().equals(font)) { - return entry.getKey(); - } - } - return ""; - } - - private static void addToAlternateTableCaption(Entry cell, StringBuilder alternateTableCaption){ - alternateTableCaption.append(cell.getValue()); - alternateTableCaption.append("\n");//better for screen reader - } - - -} diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/verify/pdfbox/PDFBOXVerifier.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/verify/pdfbox/PDFBOXVerifier.java deleted file mode 100644 index baec6398..00000000 --- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/verify/pdfbox/PDFBOXVerifier.java +++ /dev/null @@ -1,158 +0,0 @@ -package at.gv.egiz.pdfas.lib.impl.verify.pdfbox; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.io.IOUtils; -import org.apache.pdfbox.cos.COSArray; -import org.apache.pdfbox.cos.COSBase; -import org.apache.pdfbox.cos.COSDictionary; -import org.apache.pdfbox.cos.COSName; -import org.apache.pdfbox.cos.COSString; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.gv.egiz.pdfas.common.exceptions.PDFASError; -import at.gv.egiz.pdfas.common.exceptions.PdfAsException; -import at.gv.egiz.pdfas.common.settings.ISettings; -import at.gv.egiz.pdfas.lib.api.verify.VerifyParameter; -import at.gv.egiz.pdfas.lib.api.verify.VerifyResult; -import at.gv.egiz.pdfas.lib.impl.ErrorExtractor; -import at.gv.egiz.pdfas.lib.impl.verify.IVerifier; -import at.gv.egiz.pdfas.lib.impl.verify.IVerifyFilter; -import at.gv.egiz.pdfas.lib.impl.verify.VerifierDispatcher; -import at.gv.egiz.pdfas.lib.impl.verify.VerifyBackend; - -public class PDFBOXVerifier implements VerifyBackend { - - private static final Logger logger = LoggerFactory.getLogger(PDFBOXVerifier.class); - - @Override - public List verify(VerifyParameter parameter) throws PDFASError { - int signatureToVerify = parameter.getWhichSignature(); - int currentSignature = 0; - PDDocument doc = null; - try { - List result = new ArrayList(); - ISettings settings = (ISettings) parameter.getConfiguration(); - VerifierDispatcher verifier = new VerifierDispatcher(settings); - doc = PDDocument.load(parameter.getDataSource().getInputStream()); - - COSDictionary trailer = doc.getDocument().getTrailer(); - if (trailer == null) { - // No signatures ... - return result; - } - COSDictionary root = (COSDictionary) trailer.getDictionaryObject(COSName.ROOT); - if (root == null) { - // No signatures ... - return result; - } - COSDictionary acroForm = (COSDictionary) root.getDictionaryObject(COSName.ACRO_FORM); - if (acroForm == null) { - // No signatures ... - return result; - } - COSArray fields = (COSArray) acroForm.getDictionaryObject(COSName.FIELDS); - if (fields == null) { - // No signatures ... - return result; - } - - int lastSig = -1; - for (int i = 0; i < fields.size(); i++) { - COSDictionary field = (COSDictionary) fields.getObject(i); - String type = field.getNameAsString("FT"); - if ("Sig".equals(type)) { - lastSig = i; - } - } - - byte[] inputData = IOUtils.toByteArray(parameter.getDataSource().getInputStream()); - - for (int i = 0; i < fields.size(); i++) { - COSDictionary field = (COSDictionary) fields.getObject(i); - String type = field.getNameAsString("FT"); - if ("Sig".equals(type)) { - boolean verifyThis = true; - - if (signatureToVerify >= 0) { - // verify only specific siganture! - verifyThis = signatureToVerify == currentSignature; - } - - if (signatureToVerify == -2) { - verifyThis = i == lastSig; - } - - if (verifyThis) { - logger.trace("Found Signature: "); - COSBase base = field.getDictionaryObject("V"); - COSDictionary dict = (COSDictionary) base; - - logger.debug("Signer: " + dict.getNameAsString("Name")); - logger.debug("SubFilter: " + dict.getNameAsString("SubFilter")); - logger.debug("Filter: " + dict.getNameAsString("Filter")); - logger.debug("Modified: " + dict.getNameAsString("M")); - COSArray byteRange = (COSArray) dict.getDictionaryObject("ByteRange"); - - StringBuilder sb = new StringBuilder(); - int[] bytes = new int[byteRange.size()]; - for (int j = 0; j < byteRange.size(); j++) { - bytes[j] = byteRange.getInt(j); - sb.append(" " + bytes[j]); - } - - logger.trace("ByteRange" + sb.toString()); - - COSString content = (COSString) dict.getDictionaryObject("Contents"); - - ByteArrayOutputStream contentData = new ByteArrayOutputStream(); - for (int j = 0; j < bytes.length; j = j + 2) { - int offset = bytes[j]; - int length = bytes[j + 1]; - - contentData.write(inputData, offset, length); - } - contentData.close(); - - IVerifyFilter verifyFilter = verifier.getVerifier(dict.getNameAsString("Filter"), - dict.getNameAsString("SubFilter")); - - IVerifier lvlVerifier = verifier.getVerifierByLevel(parameter.getSignatureVerificationLevel()); - synchronized (lvlVerifier) { - lvlVerifier.setConfiguration(parameter.getConfiguration()); - if (verifyFilter != null) { - List results = verifyFilter.verify(contentData.toByteArray(), - content.getBytes(), parameter.getVerificationTime(), bytes, lvlVerifier); - if (results != null && !results.isEmpty()) { - result.addAll(results); - } - } - } - } - currentSignature++; - } - } - return result; - } catch (IOException e) { - logger.warn("Failed to verify document", e); - throw ErrorExtractor.searchPdfAsError(e, null); - } catch (PdfAsException e) { - logger.warn("Failed to verify document", e); - throw ErrorExtractor.searchPdfAsError(e, null); - } finally { - if (doc != null) { - try { - doc.close(); - } catch (IOException e) { - logger.info("Failed to close doc"); - } - } - } - } - -} diff --git a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFPage.java b/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFPage.java deleted file mode 100644 index d02f23b0..00000000 --- a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFPage.java +++ /dev/null @@ -1,661 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -/** - * Copyright 2006 by Know-Center, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - * - * $Id: PDFPage.java,v 1.5 2006/10/31 08:09:33 wprinz Exp $ - */ -package at.knowcenter.wag.egov.egiz.pdf; - -import java.awt.Rectangle; -import java.awt.geom.GeneralPath; -import java.io.IOException; -import java.util.List; -import java.util.Map; - -import org.apache.commons.lang3.math.NumberUtils; -import org.apache.pdfbox.cos.COSBase; -import org.apache.pdfbox.cos.COSName; -import org.apache.pdfbox.cos.COSStream; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.PDResources; -import org.apache.pdfbox.pdmodel.common.PDRectangle; -import org.apache.pdfbox.pdmodel.common.PDStream; -import org.apache.pdfbox.pdmodel.font.PDFont; -import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObject; -import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectForm; -import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation; -import org.apache.pdfbox.util.Matrix; -import org.apache.pdfbox.util.PDFOperator; -import org.apache.pdfbox.util.PDFTextStripper; -import org.apache.pdfbox.util.TextPosition; -import org.apache.pdfbox.util.operator.OperatorProcessor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.knowcenter.wag.egov.egiz.pdf.operator.path.construction.ClosePath; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.construction.CurveTo; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.construction.CurveToReplicateFinalPoint; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.construction.CurveToReplicateInitialPoint; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.construction.LineTo; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.construction.MoveTo; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.painting.CloseAndStrokePath; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.painting.CloseFillEvenOddAndStrokePath; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.painting.CloseFillNonZeroAndStrokePath; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.painting.EndPath; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.painting.FillEvenOddAndStrokePath; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.painting.FillNonZeroAndStrokePath; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.painting.FillPathEvenOddRule; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.painting.FillPathNonZeroWindingNumberRule; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.painting.StrokePath; - -/** - * PDFPage is an inner class that is used to calculate the page length of a PDF - * Document page. It extends the PDFTextStripper class and implement one - * interested method: - * {@link at.knowcenter.wag.egov.egiz.pdf.PDFPage#showCharacter(TextPosition)}
- * This method is called when processing the FileStream. By calling the method - * {@link org.apache.pdfbox.util.PDFStreamEngine#processStream(org.apache.pdfbox.pdmodel.PDPage, org.apache.pdfbox.pdmodel.PDResources, org.pdfbox.cos.COSStream)} - * the implemented method showCharacter is called. - * - * @author wlackner - * @see PDFTextStripper - */ -public class PDFPage extends PDFTextStripper { - /** - * The logger definition. - */ - private static final Logger logger = LoggerFactory.getLogger(PDFPage.class); - - /** - * The maximum (lowest) y position of a character. - */ - protected float max_character_ypos = Float.NEGATIVE_INFINITY; - - /** - * The maximum (lowest y position of an image. - */ - protected float max_image_ypos = Float.NEGATIVE_INFINITY; - - /** - * The effective page height. - */ - protected float effectivePageHeight; - - /** - * The path currently being constructed. - */ - private GeneralPath currentPath = new GeneralPath(); - - private boolean legacy40; - - /** - * The lowest position of a drawn path (originating from top). - */ - private float maxPathRelatedYPositionFromTop = Float.NEGATIVE_INFINITY; - - /** - * Constructor. - * - * @param effectivePageHeight - * The height of the page to be evaluated. PDF elements outside - * this height will not be considered. - * - * @throws java.io.IOException - */ - public PDFPage(float effectivePageHeight, boolean legacy32, boolean legacy40) - throws IOException { - super(); - - this.legacy40 = legacy40; - - this.effectivePageHeight = effectivePageHeight; - - OperatorProcessor newInvoke = new MyInvoke(this); - newInvoke.setContext(this); - this.registerOperatorProcessor("Do", newInvoke); - - if (!legacy32) { - registerCustomPathOperators(); - } - } - - /** - * Registers operators responsible for path construction and painting in - * order to fix auto positioning on pages with path elements. - * - * @author Datentechnik Innovation GmbH - */ - private void registerCustomPathOperators() { - - // *** path construction - - this.registerOperatorProcessor("m", new MoveTo(this)); - this.registerOperatorProcessor("l", new LineTo(this)); - this.registerOperatorProcessor("c", new CurveTo(this)); - this.registerOperatorProcessor("y", - new CurveToReplicateFinalPoint(this)); - this.registerOperatorProcessor("v", new CurveToReplicateInitialPoint( - this)); - this.registerOperatorProcessor("h", new ClosePath(this)); - - // *** path painting - - // "S": stroke path - this.registerOperatorProcessor("S", new StrokePath(this)); - this.registerOperatorProcessor("s", new CloseAndStrokePath(this)); - this.registerOperatorProcessor("f", - new FillPathNonZeroWindingNumberRule(this)); - this.registerOperatorProcessor("F", - new FillPathNonZeroWindingNumberRule(this)); - this.registerOperatorProcessor("f*", new FillPathEvenOddRule(this)); - this.registerOperatorProcessor("b", new CloseFillNonZeroAndStrokePath( - this)); - this.registerOperatorProcessor("B", new FillNonZeroAndStrokePath(this)); - this.registerOperatorProcessor("b*", new CloseFillEvenOddAndStrokePath( - this)); - this.registerOperatorProcessor("B*", new FillEvenOddAndStrokePath(this)); - this.registerOperatorProcessor("n", new EndPath(this)); - - // Note: The graphic context - // (org.pdfbox.pdmodel.graphics.PDGraphicsState) of the underlying - // pdfbox library does - // not yet support clipping. This prevents feasible usage of clipping - // operators (W, W*). - // operators.put("W", new ...(this)); - // operators.put("W*", new ...(this)); - - } - - /** - * Returns the path currently being constructed. - * - * @return The path currently being constructed. - */ - public GeneralPath getCurrentPath() { - return currentPath; - } - - /** - * Sets the current path. - * - * @param currentPath - * The new current path. - */ - public void setCurrentPath(GeneralPath currentPath) { - this.currentPath = currentPath; - } - - /** - * Registers a rectangle that bounds the path currently being drawn. - * - * @param bounds - * A rectangle depicting the bounds (coordinates originating from - * bottom left). - * @author Datentechnik Innovation GmbH - */ - public void registerPathBounds(Rectangle bounds) { - if (!bounds.isEmpty()) { - logger.debug("Registering path bounds: " + bounds); - - // vertical start of rectangle (counting from top of page) - float upperBoundYPositionFromTop; - - // vertical end of rectangle (counting from top of page) - // this depicts the current end of path-related page content - float lowerBoundYPositionFromTop; - - PDRectangle boundaryBox = this.getCurrentPage().findCropBox(); - - if (boundaryBox == null) { - boundaryBox = this.getCurrentPage().findMediaBox(); - } - - float pageHeight; - - switch (this.getCurrentPage().findRotation()) { - case 90: // CW - pageHeight = boundaryBox.getWidth(); - upperBoundYPositionFromTop = (float) bounds.getMinX(); - lowerBoundYPositionFromTop = (float) bounds.getMaxX(); - break; - case 180: - pageHeight = boundaryBox.getHeight(); - upperBoundYPositionFromTop = (float) bounds.getMinY(); - lowerBoundYPositionFromTop = (float) bounds.getMaxY(); - break; - case 270: // CCW - pageHeight = boundaryBox.getWidth(); - upperBoundYPositionFromTop = pageHeight - - (float) bounds.getMaxX(); - lowerBoundYPositionFromTop = pageHeight - - (float) bounds.getMinX(); - break; - default: - pageHeight = boundaryBox.getHeight(); - upperBoundYPositionFromTop = pageHeight - - (float) bounds.getMaxY(); - lowerBoundYPositionFromTop = pageHeight - - (float) bounds.getMinY(); - break; - } - - // new maximum ? - if (lowerBoundYPositionFromTop > maxPathRelatedYPositionFromTop) { - // Is the rectangle (at least partly) located above the footer - // line? - // (effective page height := page height - footer line) - if (upperBoundYPositionFromTop <= effectivePageHeight) { - // yes: update current end of path-related page content - maxPathRelatedYPositionFromTop = lowerBoundYPositionFromTop; - logger.trace("New max path related y position (from top): " - + maxPathRelatedYPositionFromTop); - } else { - // no: rectangle is fully located below the footer line -> - // ignore - logger.trace("Ignoring path bound below the footer line."); - } - } - } - } - - protected void processOperator(PDFOperator operator, List arguments) - throws IOException { - logger.trace("operator = " + operator); - super.processOperator(operator, arguments); - } - - @Override - protected void processTextPosition(TextPosition text) { - showCharacter(text); - } - - // exthex - /** - * A method provided as an event interface to allow a subclass to perform - * some specific functionality when a character needs to be displayed. This - * method is used to calculate the latest position of a text in the page. - * Sorry for this missinterpretation of the method, but it is the only way - * to do this (provided by PDFBox)!!! - * - * @param text - * the character to be displayed -> calculate there y position. - */ - protected void showCharacter(TextPosition text) { - float current_y = text.getY(); - final String character = text.getCharacter(); - - if (at.gv.egiz.pdfas.common.utils.StringUtils.whiteSpaceTrim(character) - .isEmpty()) { - return; - } - - int pageRotation = this.getCurrentPage().findRotation(); - // logger_.debug("PageRotation = " + pageRotation); - /*if (pageRotation == 0) { - current_y = text.getY(); - } - if (pageRotation == 90) { - current_y = text.getY(); - } - if (pageRotation == 180) { - current_y = text.getY(); - } - if (pageRotation == 270) { - current_y = text.getY(); - } - - if (current_y > this.effectivePageHeight) { - this.max_character_ypos = this.effectivePageHeight; - return; - } - - // store ypos of the char if it is not empty - if (current_y > this.max_character_ypos) { - this.max_character_ypos = current_y; - }*/ - - if (pageRotation == 0) { - current_y = text.getY(); - } - if (pageRotation == 90) { - current_y = text.getX(); - } - if (pageRotation == 180) { - float page_height = this.getCurrentPage().findMediaBox().getHeight(); - current_y = page_height - text.getY(); - } - if (pageRotation == 270) { - float page_height = this.getCurrentPage().findMediaBox().getHeight(); - current_y = page_height - text.getX(); - } - - if (current_y > this.effectivePageHeight) { - // logger_.debug("character is below footer_line. footer_line = " + - // this.footer_line + ", text.character=" + character + ", y=" + - // current_y); - return; - } - - // store ypos of the char if it is not empty - if (current_y > this.max_character_ypos) { - this.max_character_ypos = current_y; - } - } - - // use this funtion getting an unsorted text output - // public void showString(byte[] string) { - // logger_.debug(new String(string)); - // } - - /** - * Returns the calculated page length. - * - * @return the max page length value - */ - public float getMaxPageLength() { - if (logger.isDebugEnabled()) { - logger.debug("Determining page content length: text=" - + max_character_ypos + ", image=" + max_image_ypos - + ", path=" + maxPathRelatedYPositionFromTop); - } - return NumberUtils.max(max_character_ypos, max_image_ypos, - maxPathRelatedYPositionFromTop); - } - - @Override - public Map getFonts() { - - COSBase fontObj = null; - - if (getCurrentPage().getResources() != null - && getCurrentPage().getResources().getCOSDictionary() != null - && getCurrentPage().getResources().getCOSDictionary() - .getDictionaryObject(COSName.FONT) != null) { - fontObj = getCurrentPage().getResources().getCOSDictionary() - .getDictionaryObject(COSName.FONT); - } - - Map fontMap = getCurrentPage().findResources() - .getFonts(); - - if (fontObj != null) { - getCurrentPage().getResources().getCOSDictionary() - .setItem(COSName.FONT, fontObj); - } - - return fontMap; - } - - public class MyInvoke extends OperatorProcessor { - - private PDFPage mypage; - - public MyInvoke(PDFPage page) { - this.mypage = page; - } - - public void process(PDFOperator operator, List arguments) - throws IOException { - COSName name = (COSName) arguments.get(0); - - // PDResources res = context.getResources(); - - Map xobjects = context.getXObjects(); - PDXObject xobject = xobjects.get(name.getName()); - - PDStream stream = xobject.getPDStream(); - COSStream cos_stream = stream.getStream(); - - COSName subtype = (COSName) cos_stream - .getDictionaryObject(COSName.SUBTYPE); - if (subtype.equals(COSName.IMAGE)) { - logger.debug("XObject Image"); - - Matrix ctm = context.getGraphicsState() - .getCurrentTransformationMatrix(); - logger.debug("ctm = " + ctm); - - Pos[] coordinates = new Pos[] { new Pos(0, 0, 1), - new Pos(1, 0, 1), new Pos(0, 1, 1), new Pos(1, 1, 1) }; - - Pos[] transformed_coordinates = transtormCoordinates( - coordinates, ctm); - - /********************************************************** - * pdf-as fix: calculating min and max point of an image to look - * where the signature should be placed fix solves problems with - * footer and images and placement of the signature in an image - * only pdf document - **********************************************************/ - - float actual_lowest_point = Float.NaN; - float actual_starting_point = Float.NaN; - - int pageRotation = this.mypage.getCurrentPage().findRotation(); - logger.debug("PageRotation = " + pageRotation); - if (pageRotation == 0) { - float min_y = findMinY(transformed_coordinates); - logger.debug("min_y = " + min_y); - float page_height = this.mypage.getCurrentPage() - .findMediaBox().getHeight(); - logger.debug("page_height = " + page_height); - - actual_lowest_point = page_height - min_y; - actual_starting_point = page_height - - findMaxY(transformed_coordinates); - } - if (pageRotation == 90) { - float max_x = findMaxX(transformed_coordinates); - logger.debug("max_x = " + max_x); - float page_width = this.mypage.getCurrentPage() - .findMediaBox().getWidth(); - logger.debug("page_width = " + page_width); - - actual_lowest_point = max_x; - actual_starting_point = findMinX(transformed_coordinates); - } - if (pageRotation == 180) { - float min_y = findMinY(transformed_coordinates); - logger.debug("min_y = " + min_y); - actual_lowest_point = findMaxY(transformed_coordinates); - actual_starting_point = actual_lowest_point + min_y; - } - if (pageRotation == 270) { - float min_x = findMinX(transformed_coordinates); - logger.debug("min_x = " + min_x); - - float page_width = this.mypage.getCurrentPage() - .findMediaBox().getWidth(); - logger.debug("page_width = " + page_width); - - actual_lowest_point = page_width - min_x; - actual_starting_point = page_width - - findMaxX(transformed_coordinates); - } - - logger.debug("actual_lowest_point = " + actual_lowest_point); - - if (actual_lowest_point > PDFPage.this.effectivePageHeight - && actual_starting_point > PDFPage.this.effectivePageHeight) { - logger.debug("image is below footer_line"); - return; - } - - if (actual_lowest_point > PDFPage.this.max_image_ypos) { - PDFPage.this.max_image_ypos = actual_lowest_point; - } - - return; - } - - if (xobject instanceof PDXObjectForm) { - PDXObjectForm form = (PDXObjectForm) xobject; - COSStream invoke = (COSStream) form.getCOSObject(); - PDResources pdResources = form.getResources(); - PDPage page = context.getCurrentPage(); - if (pdResources == null) { - pdResources = page.findResources(); - } - - getContext().processSubStream(page, pdResources, invoke); - } - } - } - - public static Pos[] transtormCoordinates(Pos[] coordinates, Matrix m) { - Pos[] transformed = new Pos[coordinates.length]; - for (int i = 0; i < coordinates.length; i++) { - transformed[i] = transtormCoordinate(coordinates[i], m); - } - return transformed; - } - - public static Pos transtormCoordinate(Pos pos, Matrix m) { - Pos transformed = new Pos(); - transformed.x = pos.x * m.getValue(0, 0) + pos.y * m.getValue(1, 0) - + pos.z * m.getValue(2, 0); - transformed.y = pos.x * m.getValue(0, 1) + pos.y * m.getValue(1, 1) - + pos.z * m.getValue(2, 1); - transformed.z = pos.x * m.getValue(0, 2) + pos.y * m.getValue(1, 2) - + pos.z * m.getValue(2, 2); - - logger.debug(" transformed " + pos + " --> " + transformed); - return transformed; - } - - public static float findMinY(Pos[] coordinates) { - float min = Float.POSITIVE_INFINITY; - for (int i = 0; i < coordinates.length; i++) { - if (coordinates[i].y < min) { - min = coordinates[i].y; - } - } - return min; - } - - public static float findMaxY(Pos[] coordinates) { - float max = 0; - for (int i = 0; i < coordinates.length; i++) { - if (coordinates[i].y > max) { - max = coordinates[i].y; - } - } - return max; - } - - public static float findMaxX(Pos[] coordinates) { - float max = Float.NEGATIVE_INFINITY; - for (int i = 0; i < coordinates.length; i++) { - if (coordinates[i].x > max) { - max = coordinates[i].x; - } - } - return max; - } - - public static float findMinX(Pos[] coordinates) { - float min = Float.POSITIVE_INFINITY; - for (int i = 0; i < coordinates.length; i++) { - if (coordinates[i].x < min) { - min = coordinates[i].x; - } - } - return min; - } - - public void processAnnotation(PDAnnotation anno) { - float current_y = anno.getRectangle().getLowerLeftY(); - float upper_y = 0; - PDPage page = anno.getPage(); - - if (page == null) { - page = getCurrentPage(); - } - - if (page == null) { - logger.warn("Annotation without page! The position might not be correct!"); - return; - } - - int pageRotation = page.findRotation(); - // logger_.debug("PageRotation = " + pageRotation); - if (pageRotation == 0) { - float page_height = page.findMediaBox().getHeight(); - current_y = page_height - anno.getRectangle().getLowerLeftY(); - upper_y = page_height - anno.getRectangle().getUpperRightY(); - } - if (pageRotation == 90) { - current_y = anno.getRectangle().getUpperRightX(); - upper_y = anno.getRectangle().getLowerLeftX(); - } - if (pageRotation == 180) { - current_y = anno.getRectangle().getUpperRightY(); - upper_y = anno.getRectangle().getLowerLeftY(); - } - if (pageRotation == 270) { - float page_width = page.findMediaBox().getWidth(); - current_y = page_width - anno.getRectangle().getLowerLeftX(); - upper_y = page_width - anno.getRectangle().getUpperRightX(); - } - - - - if (current_y > this.effectivePageHeight) { - if(!this.legacy40 && upper_y < this.effectivePageHeight) { - // Bottom of annotation is below footer line, - // but top of annotation is above footer line! - // so no place left on this page! - this.max_character_ypos = this.effectivePageHeight; - } - return; - } - - // store ypos of the char if it is not empty - if (current_y > this.max_character_ypos) { - this.max_character_ypos = current_y; - } - } - -} diff --git a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFUtilities.java b/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFUtilities.java deleted file mode 100644 index cf53025b..00000000 --- a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFUtilities.java +++ /dev/null @@ -1,110 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -/** - * Copyright 2006 by Know-Center, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - * - * $Id: PDFUtilities.java,v 1.3 2006/10/31 08:09:33 wprinz Exp $ - */ -package at.knowcenter.wag.egov.egiz.pdf; - -import java.io.IOException; -import java.util.Iterator; -import java.util.List; - -import org.apache.pdfbox.cos.COSStream; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.PDResources; -import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation; - -import at.gv.egiz.pdfas.common.exceptions.PDFIOException; - -/** - * Contains useful helpers for accessing PDF documents. - * - * @author wprinz - * @author mruhmer - */ -public abstract class PDFUtilities { - public static float calculatePageLength(PDDocument document, int page, - float effectivePageHeight, /* int pagerotation, */boolean legacy32, boolean legacy40) - throws PDFIOException { - // int last_page_id = document.getNumberOfPages(); - List allPages = document.getDocumentCatalog().getAllPages(); - PDPage pdpage = (PDPage) allPages.get(page); - // pdpage.setRotation(pagerotation); - return calculatePageLength(pdpage, effectivePageHeight, legacy32, legacy40); - } - - public static float calculatePageLength(PDPage page, - float effectivePageHeight, boolean legacy32, boolean legacy40) throws PDFIOException { - try { - PDFPage my_page = new PDFPage(effectivePageHeight, legacy32, legacy40); - PDResources resources = page.findResources(); - if (page.getContents() != null) { - COSStream stream = page.getContents().getStream(); - // List articles = page.getThreadBeads(); - // my_page.processMyPage(page); - my_page.processStream(page, resources, stream); - } - if (!legacy32) { - if (page.getAnnotations() != null) { - Iterator annotationsIt = page - .getAnnotations().iterator(); - - while (annotationsIt.hasNext()) { - PDAnnotation annotation = annotationsIt.next(); - if (!annotation.isInvisible()) { - my_page.processAnnotation(annotation); - } - } - } - } - return my_page.getMaxPageLength(); - } catch (IOException e) { - throw new PDFIOException("error.pdf.stamp.11", e); - } - } - -} diff --git a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/PathConstructionOperatorProcessor.java b/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/PathConstructionOperatorProcessor.java deleted file mode 100644 index 2e16c117..00000000 --- a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/PathConstructionOperatorProcessor.java +++ /dev/null @@ -1,84 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -/** - * Copyright 2006 by Know-Center, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - */ -package at.knowcenter.wag.egov.egiz.pdf.operator.path; - -import at.knowcenter.wag.egov.egiz.pdf.PDFPage; -import org.apache.pdfbox.util.operator.OperatorProcessor; - -import java.awt.geom.Point2D; - -/** - * Provides functions for path construction operators. - * - * @see "PDF 1.7 specification, Section 8.5.2 'Path Construction Operators'" - * @author Datentechnik Innovation GmbH - * - */ -public abstract class PathConstructionOperatorProcessor extends OperatorProcessor { - - public PathConstructionOperatorProcessor(PDFPage context) { - setContext(context); - } - - /** - * Transforms the given point from user space coordinates to device space coordinates based on the current - * transition matrix. - * - * @param x - * The x axis value of the user space coordinates. - * @param y - * The y axis value of the user space coordinates. - * @return The transformed point. - */ - public Point2D transform(double x, double y) { - double[] position = { x, y }; - context.getGraphicsState().getCurrentTransformationMatrix().createAffineTransform() - .transform(position, 0, position, 0, 1); - return new Point2D.Double(position[0], position[1]); - } - -} diff --git a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/PathPaintingOperatorProcessor.java b/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/PathPaintingOperatorProcessor.java deleted file mode 100644 index bc34d562..00000000 --- a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/PathPaintingOperatorProcessor.java +++ /dev/null @@ -1,65 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -/** - * Copyright 2006 by Know-Center, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - */ -package at.knowcenter.wag.egov.egiz.pdf.operator.path; - -import at.knowcenter.wag.egov.egiz.pdf.PDFPage; -import org.apache.pdfbox.util.operator.OperatorProcessor; - -/** - * Provides functions for path painting operators. - * - * @see "PDF 1.7 specification, Section 8.5.2 'Path Construction Operators'" - * @author Datentechnik Innovation GmbH - * - */ -public abstract class PathPaintingOperatorProcessor extends OperatorProcessor { - - public PathPaintingOperatorProcessor(PDFPage context) { - setContext(context); - } - -} diff --git a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/construction/ClosePath.java b/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/construction/ClosePath.java deleted file mode 100644 index 8bb76fb5..00000000 --- a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/construction/ClosePath.java +++ /dev/null @@ -1,91 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -/** - * Copyright 2006 by Know-Center, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - */ -package at.knowcenter.wag.egov.egiz.pdf.operator.path.construction; - -import at.knowcenter.wag.egov.egiz.pdf.PDFPage; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.PathConstructionOperatorProcessor; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.pdfbox.cos.COSBase; -import org.apache.pdfbox.util.PDFOperator; - -import java.io.IOException; -import java.util.List; - -/** - * Close the current subpath by appending a straight line segment from the current point to the starting point of the - * subpath. If the current subpath is already closed, h shall donothing. This operator terminates the current subpath. - * Appending another segment to the current path shall begin a new subpath, even if the new segment begins at the - * endpoint reached by the h operation. - * - * @see "PDF 1.7 specification, Section 8.5.2 'Path Construction Operators'" - * @author PdfBox, modified by Datentechnik Innovation GmbH - */ -public class ClosePath extends PathConstructionOperatorProcessor { - - private Log log = LogFactory.getLog(getClass()); - - public ClosePath(PDFPage context) { - super(context); - } - - @Override - public void process(PDFOperator operator, List operands) throws IOException { - try { - PDFPage pdfPage = (PDFPage) context; - - pdfPage.getCurrentPath().closePath(); - - if (log.isTraceEnabled()) { - log.trace("Closing current path."); - } - } catch (Exception e) { - log.warn("Error processing operator 'h'.", e); - } - } - -} diff --git a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/construction/CurveTo.java b/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/construction/CurveTo.java deleted file mode 100644 index 0eb10a52..00000000 --- a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/construction/CurveTo.java +++ /dev/null @@ -1,108 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -/** - * Copyright 2006 by Know-Center, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - */ -package at.knowcenter.wag.egov.egiz.pdf.operator.path.construction; - -import at.knowcenter.wag.egov.egiz.pdf.PDFPage; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.PathConstructionOperatorProcessor; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.pdfbox.cos.COSBase; -import org.apache.pdfbox.cos.COSNumber; -import org.apache.pdfbox.util.PDFOperator; - -import java.awt.geom.Point2D; -import java.io.IOException; -import java.util.List; - -/** - * Append a cubic Bezier curve to the current path. The curve shall extend from the current point to the point (x3, y3), - * using (x1, y1) and (x2, y2) as the Bezier control points (see 8.5.2.2, "Cubic Bezier Curves"). The new current point - * shall be (x3, y3). - * - * @see "PDF 1.7 specification, Section 8.5.2 'Path Construction Operators'" - * @author PdfBox, modified by Datentechnik Innovation GmbH - */ -public class CurveTo extends PathConstructionOperatorProcessor { - - private Log log = LogFactory.getLog(getClass()); - - public CurveTo(PDFPage context) { - super(context); - } - - @Override - public void process(PDFOperator operator, List operands) throws IOException { - try { - PDFPage pdfPage = (PDFPage) context; - - COSNumber x1 = (COSNumber) operands.get(0); - COSNumber y1 = (COSNumber) operands.get(1); - COSNumber x2 = (COSNumber) operands.get(2); - COSNumber y2 = (COSNumber) operands.get(3); - COSNumber x3 = (COSNumber) operands.get(4); - COSNumber y3 = (COSNumber) operands.get(5); - - Point2D p1 = transform(x1.doubleValue(), y1.doubleValue()); - Point2D p2 = transform(x2.doubleValue(), y2.doubleValue()); - Point2D p3 = transform(x3.doubleValue(), y3.doubleValue()); - - pdfPage.getCurrentPath().curveTo( - (float) p1.getX(), (float) p1.getY(), - (float) p2.getX(), (float) p2.getY(), - (float) p3.getX(), (float) p3.getY() - ); - - if (log.isTraceEnabled()) { - log.trace("Appending cubic Bezier curve with x1:" + p1.getX() + ",y1:" + p1.getY() + ", x2:" - + p2.getX() + ",y2:" + p2.getY() + ", x3:" + p3.getX() + ",y3:" + p3.getY()); - } - } catch (Exception e) { - log.warn("Error processing operator 'c'.", e); - } - } - -} diff --git a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/construction/CurveToReplicateFinalPoint.java b/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/construction/CurveToReplicateFinalPoint.java deleted file mode 100644 index 1020842e..00000000 --- a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/construction/CurveToReplicateFinalPoint.java +++ /dev/null @@ -1,105 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -/** - * Copyright 2006 by Know-Center, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - */ -package at.knowcenter.wag.egov.egiz.pdf.operator.path.construction; - -import at.knowcenter.wag.egov.egiz.pdf.PDFPage; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.PathConstructionOperatorProcessor; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.pdfbox.cos.COSBase; -import org.apache.pdfbox.cos.COSNumber; -import org.apache.pdfbox.util.PDFOperator; - -import java.awt.geom.Point2D; -import java.io.IOException; -import java.util.List; - -/** - * Append a cubic Bezier curve to the current path. The curve shall extend from the current point to the point (x3, y3), - * using (x1, y1) and (x3, y3) as the Bezier control points (see 8.5.2.2, "Cubic Bezier Curves"). The new current point - * shall be (x3, y3). - * - * @see "PDF 1.7 specification, Section 8.5.2 'Path Construction Operators'" - * @author PdfBox, modified by Datentechnik Innovation GmbH - */ -public class CurveToReplicateFinalPoint extends PathConstructionOperatorProcessor { - - private Log log = LogFactory.getLog(getClass()); - - public CurveToReplicateFinalPoint(PDFPage context) { - super(context); - } - - @Override - public void process(PDFOperator operator, List operands) throws IOException { - try { - PDFPage pdfPage = (PDFPage) context; - - COSNumber x1 = (COSNumber) operands.get(0); - COSNumber y1 = (COSNumber) operands.get(1); - COSNumber x3 = (COSNumber) operands.get(2); - COSNumber y3 = (COSNumber) operands.get(3); - - Point2D p1 = transform(x1.doubleValue(), y1.doubleValue()); - Point2D p3 = transform(x3.doubleValue(), y3.doubleValue()); - - pdfPage.getCurrentPath().curveTo( - (float) p1.getX(), (float) p1.getY(), - (float) p3.getX(), (float) p3.getY(), - (float) p3.getX(), (float) p3.getY() - ); - - if (log.isTraceEnabled()) { - log.trace("Appending cubic Bezier curve with x1:" + p1.getX() + ",y1:" + p1.getY() + ", x3:" - + p3.getX() + ",y3:" + p3.getY()); - } - } catch (Exception e) { - log.warn("Error processing operator 'y'.", e); - } - } - -} diff --git a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/construction/CurveToReplicateInitialPoint.java b/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/construction/CurveToReplicateInitialPoint.java deleted file mode 100644 index 42a52033..00000000 --- a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/construction/CurveToReplicateInitialPoint.java +++ /dev/null @@ -1,107 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -/** - * Copyright 2006 by Know-Center, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - */ -package at.knowcenter.wag.egov.egiz.pdf.operator.path.construction; - -import at.knowcenter.wag.egov.egiz.pdf.PDFPage; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.PathConstructionOperatorProcessor; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.pdfbox.cos.COSBase; -import org.apache.pdfbox.cos.COSNumber; -import org.apache.pdfbox.util.PDFOperator; - -import java.awt.geom.Point2D; -import java.io.IOException; -import java.util.List; - -/** - * Append a cubic Bezier curve to the current path. The curve shall extend from the current point to the point (x3, y3), - * using the current point and (x2, y2) as the Bezier control points (see 8.5.2.2, "Cubic Bezier Curves"). The new - * current point shall be (x3, y3). - * - * @see "PDF 1.7 specification, Section 8.5.2 'Path Construction Operators'" - * @author PdfBox, modified by Datentechnik Innovation GmbH - */ -public class CurveToReplicateInitialPoint extends PathConstructionOperatorProcessor { - - private Log log = LogFactory.getLog(getClass()); - - public CurveToReplicateInitialPoint(PDFPage context) { - super(context); - } - - @Override - public void process(PDFOperator operator, List operands) throws IOException { - try { - PDFPage pdfPage = (PDFPage) context; - - COSNumber x2 = (COSNumber) operands.get(0); - COSNumber y2 = (COSNumber) operands.get(1); - COSNumber x3 = (COSNumber) operands.get(2); - COSNumber y3 = (COSNumber) operands.get(3); - - Point2D currentPoint = pdfPage.getCurrentPath().getCurrentPoint(); - Point2D p2 = transform(x2.doubleValue(), y2.doubleValue()); - Point2D p3 = transform(x3.doubleValue(), y3.doubleValue()); - - pdfPage.getCurrentPath().curveTo( - (float)currentPoint.getX(), (float)currentPoint.getY(), - (float) p2.getX(), (float) p2.getY(), - (float) p3.getX(), (float) p3.getY() - ); - - if (log.isTraceEnabled()) { - log.trace("Appending cubic Bezier curve with x2:" + p2.getX() + ",y2:" + p2.getY() + ", x3:" - + p3.getX() + ",y3:" + p3.getY() + ", using current point x:" + currentPoint.getX() + ",y:" - + currentPoint.getY()); - } - } catch (Exception e) { - log.warn("Error processing operator 'v'.", e); - } - } - -} diff --git a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/construction/LineTo.java b/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/construction/LineTo.java deleted file mode 100644 index a47d3fe6..00000000 --- a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/construction/LineTo.java +++ /dev/null @@ -1,94 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -/** - * Copyright 2006 by Know-Center, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - */ -package at.knowcenter.wag.egov.egiz.pdf.operator.path.construction; - -import at.knowcenter.wag.egov.egiz.pdf.PDFPage; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.PathConstructionOperatorProcessor; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.pdfbox.cos.COSBase; -import org.apache.pdfbox.cos.COSNumber; -import org.apache.pdfbox.util.PDFOperator; - -import java.awt.geom.Point2D; -import java.io.IOException; -import java.util.List; - -/** - * Append a straight line segment from the current point to the point (x, y). The new current point shall be (x, y). - * - * @see "PDF 1.7 specification, Section 8.5.2 'Path Construction Operators'" - * @author PdfBox, modified by Datentechnik Innovation GmbH - */ -public class LineTo extends PathConstructionOperatorProcessor { - - private Log log = LogFactory.getLog(getClass()); - - public LineTo(PDFPage context) { - super(context); - } - - @Override - public void process(PDFOperator operator, List operands) throws IOException { - try { - PDFPage pdfPage = (PDFPage) context; - - COSNumber x = (COSNumber) operands.get(0); - COSNumber y = (COSNumber) operands.get(1); - Point2D p = transform(x.doubleValue(), y.doubleValue()); - - pdfPage.getCurrentPath().lineTo((float) p.getX(), (float) p.getY()); - - if (log.isTraceEnabled()) { - log.trace("Adding line to x:" + p.getX() + ",y:" + p.getY()); - } - } catch (Exception e) { - log.warn("Error processing operator 'l'.", e); - } - } - -} diff --git a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/construction/MoveTo.java b/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/construction/MoveTo.java deleted file mode 100644 index 49d92761..00000000 --- a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/construction/MoveTo.java +++ /dev/null @@ -1,96 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -/** - * Copyright 2006 by Know-Center, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - */ -package at.knowcenter.wag.egov.egiz.pdf.operator.path.construction; - -import at.knowcenter.wag.egov.egiz.pdf.PDFPage; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.PathConstructionOperatorProcessor; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.pdfbox.cos.COSBase; -import org.apache.pdfbox.cos.COSNumber; -import org.apache.pdfbox.util.PDFOperator; - -import java.awt.geom.Point2D; -import java.io.IOException; -import java.util.List; - -/** - * Begin a new subpath by moving the current point to coordinates (x, y), omitting any connecting line segment. If the - * previous path construction operator in the current path was also m, the new m overrides it; no vestige of the - * previous m operation remains in the path. - * - * @see "PDF 1.7 specification, Section 8.5.2 'Path Construction Operators'" - * @author PdfBox, modified by Datentechnik Innovation GmbH - */ -public class MoveTo extends PathConstructionOperatorProcessor { - - private Log log = LogFactory.getLog(getClass()); - - public MoveTo(PDFPage context) { - super(context); - } - - @Override - public void process(PDFOperator operator, List operands) throws IOException { - try { - PDFPage pdfPage = (PDFPage) context; - - COSNumber x = (COSNumber) operands.get(0); - COSNumber y = (COSNumber) operands.get(1); - Point2D p = transform(x.doubleValue(), y.doubleValue()); - - pdfPage.getCurrentPath().moveTo((float) p.getX(), (float) p.getY()); - - if (log.isTraceEnabled()) { - log.trace("Moving current path to x:" + p.getX() + ",y:" + p.getY()); - } - } catch (Exception e) { - log.warn("Error processing operator 'm'.", e); - } - } - -} diff --git a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/CloseAndStrokePath.java b/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/CloseAndStrokePath.java deleted file mode 100644 index 552a033c..00000000 --- a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/CloseAndStrokePath.java +++ /dev/null @@ -1,82 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -/** - * Copyright 2006 by Know-Center, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - */ -package at.knowcenter.wag.egov.egiz.pdf.operator.path.painting; - -import at.knowcenter.wag.egov.egiz.pdf.PDFPage; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.PathPaintingOperatorProcessor; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.pdfbox.cos.COSBase; -import org.apache.pdfbox.util.PDFOperator; - -import java.io.IOException; -import java.util.List; - -/** - * Close and stroke the path. This operator shall have the same effect as the sequence h S. - * - * @see "PDF 1.7 specification, Section 8.5.3 'Path-Painting Operators'" - * @author PdfBox, modified by Datentechnik Innovation GmbH - */ -public class CloseAndStrokePath extends PathPaintingOperatorProcessor { - - private Log log = LogFactory.getLog(getClass()); - - public CloseAndStrokePath(PDFPage context) { - super(context); - } - - @Override - public void process(PDFOperator operator, List operands) throws IOException { - if (log.isTraceEnabled()) { - log.trace("Closing and stroking path."); - } - context.processOperator("h", operands); - context.processOperator("S", operands); - } - -} diff --git a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/CloseFillEvenOddAndStrokePath.java b/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/CloseFillEvenOddAndStrokePath.java deleted file mode 100644 index 718fe362..00000000 --- a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/CloseFillEvenOddAndStrokePath.java +++ /dev/null @@ -1,83 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -/** - * Copyright 2006 by Know-Center, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - */ -package at.knowcenter.wag.egov.egiz.pdf.operator.path.painting; - -import at.knowcenter.wag.egov.egiz.pdf.PDFPage; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.PathPaintingOperatorProcessor; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.pdfbox.cos.COSBase; -import org.apache.pdfbox.util.PDFOperator; - -import java.io.IOException; -import java.util.List; - -/** - * Close, fill, and then stroke the path, using the even-odd rule to determine the region to fill. This operator shall - * have the same effect as the sequence h B*. - * - * @see "PDF 1.7 specification, Section 8.5.3 'Path-Painting Operators'" - * @author PdfBox, modified by Datentechnik Innovation GmbH - */ -public class CloseFillEvenOddAndStrokePath extends PathPaintingOperatorProcessor { - - private Log log = LogFactory.getLog(getClass()); - - public CloseFillEvenOddAndStrokePath(PDFPage context) { - super(context); - } - - @Override - public void process(PDFOperator operator, List operands) throws IOException { - if (log.isTraceEnabled()) { - log.trace("Closing, filling (even odd rule) and stroking path."); - } - context.processOperator("h", operands); - context.processOperator("B*", operands); - } - -} diff --git a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/CloseFillNonZeroAndStrokePath.java b/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/CloseFillNonZeroAndStrokePath.java deleted file mode 100644 index 523f6681..00000000 --- a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/CloseFillNonZeroAndStrokePath.java +++ /dev/null @@ -1,83 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -/** - * Copyright 2006 by Know-Center, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - */ -package at.knowcenter.wag.egov.egiz.pdf.operator.path.painting; - -import at.knowcenter.wag.egov.egiz.pdf.PDFPage; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.PathPaintingOperatorProcessor; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.pdfbox.cos.COSBase; -import org.apache.pdfbox.util.PDFOperator; - -import java.io.IOException; -import java.util.List; - -/** - * Close, fill, and then stroke the path, using the nonzero winding number rule to determine the region to fill. This - * operator shall have the same effect as the sequence h B. - * - * @see "PDF 1.7 specification, Section 8.5.3 'Path-Painting Operators'" - * @author PdfBox, modified by Datentechnik Innovation GmbH - */ -public class CloseFillNonZeroAndStrokePath extends PathPaintingOperatorProcessor { - - private Log log = LogFactory.getLog(getClass()); - - public CloseFillNonZeroAndStrokePath(PDFPage context) { - super(context); - } - - @Override - public void process(PDFOperator operator, List operands) throws IOException { - if (log.isTraceEnabled()) { - log.trace("Closing, filling (non zero rule) and stroking path."); - } - context.processOperator("h", operands); - context.processOperator("B", operands); - } - -} diff --git a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/EndPath.java b/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/EndPath.java deleted file mode 100644 index 5134ed2f..00000000 --- a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/EndPath.java +++ /dev/null @@ -1,91 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -/** - * Copyright 2006 by Know-Center, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - */ -package at.knowcenter.wag.egov.egiz.pdf.operator.path.painting; - -import at.knowcenter.wag.egov.egiz.pdf.PDFPage; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.PathPaintingOperatorProcessor; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.pdfbox.cos.COSBase; -import org.apache.pdfbox.util.PDFOperator; - -import java.io.IOException; -import java.util.List; - -/** - * End the path object without filling or stroking it. This operator shall be a path-painting no-op, used primarily for - * the side effect of changing the current clipping path. - * - * @see "PDF 1.7 specification, Section 8.5.3 'Path-Painting Operators'" - * @author PdfBox, modified by Datentechnik Innovation GmbH - */ -public class EndPath extends PathPaintingOperatorProcessor { - - private Log log = LogFactory.getLog(getClass()); - - public EndPath(PDFPage context) { - super(context); - } - - @Override - public void process(PDFOperator operator, List operands) throws IOException { - try { - PDFPage pdfPage = (PDFPage) context; - - log.debug("Ending path " + pdfPage.getCurrentPath()); - pdfPage.getCurrentPath().reset(); - - if (log.isTraceEnabled()) { - log.trace("End path without filling or stroking."); - } - - } catch (Exception e) { - log.warn("Error processing operator 'n'.", e); - } - } - -} diff --git a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/FillEvenOddAndStrokePath.java b/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/FillEvenOddAndStrokePath.java deleted file mode 100644 index 13623648..00000000 --- a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/FillEvenOddAndStrokePath.java +++ /dev/null @@ -1,95 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -/** - * Copyright 2006 by Know-Center, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - */ -package at.knowcenter.wag.egov.egiz.pdf.operator.path.painting; - -import at.knowcenter.wag.egov.egiz.pdf.PDFPage; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.PathPaintingOperatorProcessor; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.pdfbox.cos.COSBase; -import org.apache.pdfbox.util.PDFOperator; - -import java.awt.geom.GeneralPath; -import java.io.IOException; -import java.util.List; - -/** - * Fill and then stroke the path, using the even-odd rule to determine the region to fill. This operator shall produce - * the same result as B, except that the path is filled as if with f* instead of - * f. - * - * @see "PDF 1.7 specification, Section 8.5.3 'Path-Painting Operators'" - * @author PdfBox, modified by Datentechnik Innovation GmbH - */ -public class FillEvenOddAndStrokePath extends PathPaintingOperatorProcessor { - - private Log log = LogFactory.getLog(getClass()); - - public FillEvenOddAndStrokePath(PDFPage context) { - super(context); - } - - @Override - public void process(PDFOperator operator, List operands) throws IOException { - try { - PDFPage pdfPage = (PDFPage) context; - - if (log.isTraceEnabled()) { - log.trace("Filling (even odd rule) and stroking path."); - } - - GeneralPath currentPath = (GeneralPath) pdfPage.getCurrentPath().clone(); - context.processOperator("f*", operands); - pdfPage.setCurrentPath(currentPath); - context.processOperator("S", operands); - - } catch (Exception e) { - log.warn("Error processing operator 'B*'.", e); - } - } - -} diff --git a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/FillNonZeroAndStrokePath.java b/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/FillNonZeroAndStrokePath.java deleted file mode 100644 index 485411a8..00000000 --- a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/FillNonZeroAndStrokePath.java +++ /dev/null @@ -1,95 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -/** - * Copyright 2006 by Know-Center, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - */ -package at.knowcenter.wag.egov.egiz.pdf.operator.path.painting; - -import at.knowcenter.wag.egov.egiz.pdf.PDFPage; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.PathPaintingOperatorProcessor; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.pdfbox.cos.COSBase; -import org.apache.pdfbox.util.PDFOperator; - -import java.awt.geom.GeneralPath; -import java.io.IOException; -import java.util.List; - -/** - * Fill and then stroke the path, using the nonzero winding number rule to determine the region to fill. This operator - * shall produce the same result as constructing two identical path objects, painting the first with f and - * the second with S. - * - * @see "PDF 1.7 specification, Section 8.5.3 'Path-Painting Operators'" - * @author PdfBox, modified by Datentechnik Innovation GmbH - */ -public class FillNonZeroAndStrokePath extends PathPaintingOperatorProcessor { - - private Log log = LogFactory.getLog(getClass()); - - public FillNonZeroAndStrokePath(PDFPage context) { - super(context); - } - - @Override - public void process(PDFOperator operator, List operands) throws IOException { - try { - PDFPage pdfPage = (PDFPage) context; - - if (log.isTraceEnabled()) { - log.trace("Filling (non zero rule) and stroking path."); - } - - GeneralPath currentPath = (GeneralPath) pdfPage.getCurrentPath().clone(); - context.processOperator("f", operands); - pdfPage.setCurrentPath(currentPath); - context.processOperator("S", operands); - - } catch (Exception e) { - log.warn("Error processing operator 'B'.", e); - } - } - -} diff --git a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/FillPathEvenOddRule.java b/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/FillPathEvenOddRule.java deleted file mode 100644 index bb3d3411..00000000 --- a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/FillPathEvenOddRule.java +++ /dev/null @@ -1,94 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -/** - * Copyright 2006 by Know-Center, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - */ -package at.knowcenter.wag.egov.egiz.pdf.operator.path.painting; - -import at.knowcenter.wag.egov.egiz.pdf.PDFPage; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.PathPaintingOperatorProcessor; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.pdfbox.cos.COSBase; -import org.apache.pdfbox.util.PDFOperator; - -import java.awt.*; -import java.io.IOException; -import java.util.List; - -/** - * Fill the path, using the even-odd rule to determine the region to fill. - * - * @see "PDF 1.7 specification, Section 8.5.3 'Path-Painting Operators'" - * @author PdfBox, modified by Datentechnik Innovation GmbH - */ -public class FillPathEvenOddRule extends PathPaintingOperatorProcessor { - - private Log log = LogFactory.getLog(getClass()); - - public FillPathEvenOddRule(PDFPage context) { - super(context); - } - - @Override - public void process(PDFOperator operator, List operands) throws IOException { - try { - PDFPage pdfPage = (PDFPage) context; - - pdfPage.getCurrentPath().setWindingRule(java.awt.geom.GeneralPath.WIND_EVEN_ODD); - Rectangle bounds = pdfPage.getCurrentPath().getBounds(); - pdfPage.getCurrentPath().reset(); - - if (log.isTraceEnabled()) { - log.trace("Filling path, using even-odd rule."); - } - - pdfPage.registerPathBounds(bounds); - - } catch (Exception e) { - log.warn("Error processing operator 'f*'.", e); - } - } - -} diff --git a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/FillPathNonZeroWindingNumberRule.java b/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/FillPathNonZeroWindingNumberRule.java deleted file mode 100644 index 6196c466..00000000 --- a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/FillPathNonZeroWindingNumberRule.java +++ /dev/null @@ -1,95 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -/** - * Copyright 2006 by Know-Center, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - */ -package at.knowcenter.wag.egov.egiz.pdf.operator.path.painting; - -import at.knowcenter.wag.egov.egiz.pdf.PDFPage; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.PathPaintingOperatorProcessor; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.pdfbox.cos.COSBase; -import org.apache.pdfbox.util.PDFOperator; - -import java.awt.*; -import java.io.IOException; -import java.util.List; - -/** - * Fill the path, using the nonzero winding number rule to determine the region to fill. Any subpaths that are open - * shall be implicitly closed before being filled. - * - * @see "PDF 1.7 specification, Section 8.5.3 'Path-Painting Operators'" - * @author PdfBox, modified by Datentechnik Innovation GmbH - */ -public class FillPathNonZeroWindingNumberRule extends PathPaintingOperatorProcessor { - - private Log log = LogFactory.getLog(getClass()); - - public FillPathNonZeroWindingNumberRule(PDFPage context) { - super(context); - } - - @Override - public void process(PDFOperator operator, List operands) throws IOException { - try { - PDFPage pdfPage = (PDFPage) context; - - pdfPage.getCurrentPath().setWindingRule(java.awt.geom.GeneralPath.WIND_NON_ZERO); - Rectangle bounds = pdfPage.getCurrentPath().getBounds(); - pdfPage.getCurrentPath().reset(); - - if (log.isTraceEnabled()) { - log.trace("Filling path, using nonzero winding number rule."); - } - - pdfPage.registerPathBounds(bounds); - - } catch (Exception e) { - log.warn("Error processing operator 'f/F'.", e); - } - } - -} diff --git a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/StrokePath.java b/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/StrokePath.java deleted file mode 100644 index b114b60b..00000000 --- a/pdf-as-pdfbox/src/main/java/at/knowcenter/wag/egov/egiz/pdf/operator/path/painting/StrokePath.java +++ /dev/null @@ -1,93 +0,0 @@ -/******************************************************************************* - * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - ******************************************************************************/ -/** - * Copyright 2006 by Know-Center, Graz, Austria - * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a - * joint initiative of the Federal Chancellery Austria and Graz University of - * Technology. - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://www.osor.eu/eupl/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - */ -package at.knowcenter.wag.egov.egiz.pdf.operator.path.painting; - -import at.knowcenter.wag.egov.egiz.pdf.PDFPage; -import at.knowcenter.wag.egov.egiz.pdf.operator.path.PathPaintingOperatorProcessor; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.pdfbox.cos.COSBase; -import org.apache.pdfbox.util.PDFOperator; - -import java.awt.*; -import java.io.IOException; -import java.util.List; - -/** - * Strokes the path. - * - * @see "PDF 1.7 specification, Section 8.5.3 'Path-Painting Operators'" - * @author PdfBox, modified by Datentechnik Innovation GmbH - */ -public class StrokePath extends PathPaintingOperatorProcessor { - - private Log log = LogFactory.getLog(getClass()); - - public StrokePath(PDFPage context) { - super(context); - } - - @Override - public void process(PDFOperator operator, List operands) throws IOException { - try { - PDFPage pdfPage = (PDFPage) context; - - Rectangle bounds = pdfPage.getCurrentPath().getBounds(); - pdfPage.getCurrentPath().reset(); - - if (log.isTraceEnabled()) { - log.trace("Stroking path."); - } - - pdfPage.registerPathBounds(bounds); - - } catch (Exception e) { - log.warn("Error processing operator 'S'.", e); - } - } - -} diff --git a/pdf-as-pdfbox/src/main/resources/META-INF/services/at.gv.egiz.pdfas.lib.backend.PDFASBackend b/pdf-as-pdfbox/src/main/resources/META-INF/services/at.gv.egiz.pdfas.lib.backend.PDFASBackend deleted file mode 100644 index 5dcf72c2..00000000 --- a/pdf-as-pdfbox/src/main/resources/META-INF/services/at.gv.egiz.pdfas.lib.backend.PDFASBackend +++ /dev/null @@ -1 +0,0 @@ -at.gv.egiz.pdfas.lib.impl.pdfbox.PDFBOXBackend \ No newline at end of file diff --git a/pdf-as-pdfbox/src/test/java/at/gv/egiz/pdfas/lib/testpdfbox/TTFFontTest.java b/pdf-as-pdfbox/src/test/java/at/gv/egiz/pdfas/lib/testpdfbox/TTFFontTest.java deleted file mode 100644 index fdc59ab8..00000000 --- a/pdf-as-pdfbox/src/test/java/at/gv/egiz/pdfas/lib/testpdfbox/TTFFontTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package at.gv.egiz.pdfas.lib.testpdfbox; - -import java.io.File; -import java.util.Iterator; -import java.util.List; - -import org.apache.pdfbox.cos.COSBase; -import org.apache.pdfbox.cos.COSName; -import org.apache.pdfbox.cos.COSObject; -import org.apache.pdfbox.pdmodel.PDDocument; - -public class TTFFontTest { - - public static void main(String[] args) { - try { - PDDocument doc = PDDocument.load(new File("/home/afitzek/Downloads/pdf_groesse/willenserklaerung_signedByUser.pdf")); - - List cosObjects = doc.getDocument().getObjectsByType(COSName.FONT); - - Iterator cosObjectIt = cosObjects.iterator(); - - while(cosObjectIt.hasNext()) { - COSObject cosObject = cosObjectIt.next(); - COSBase subType = cosObject.getItem(COSName.SUBTYPE); - COSBase baseFont = cosObject.getItem(COSName.BASE_FONT); - COSBase aTest = cosObject.getItem(COSName.A); - - System.out.println(aTest); - - if(subType.equals(COSName.TRUE_TYPE)) { - System.out.println("Object Number: " + cosObject.getObjectNumber().intValue() + - subType.toString()); - System.out.println(" BaseFont: " + baseFont.toString()); - } - - - } - - - } catch(Throwable e) { - e.printStackTrace(); - } - } - -} diff --git a/pdf-as-tests/build.gradle b/pdf-as-tests/build.gradle index 57dd84ab..d1822d73 100644 --- a/pdf-as-tests/build.gradle +++ b/pdf-as-tests/build.gradle @@ -7,48 +7,42 @@ jar { } } -repositories { +repositories { mavenLocal() mavenCentral() + maven { url "https://repository.jboss.org/maven2/" } maven { url "http://anonsvn.icesoft.org/repo/maven2/releases/" } maven { url "https://repository.jboss.org/nexus/content/repositories/thirdparty-releases/" } + } configurations{ pdfBox2Compile - pdfBox1Compile } sourceSets{ pdfBox2{ compileClasspath = configurations.pdfBox2Compile } - pdfBox1{ - compileClasspath = configurations.pdfBox1Compile - } } dependencies { - compile project (':pdf-as-lib') - testCompile project (':pdf-as-moa') + implementation project (':pdf-as-lib') + testImplementation project (':pdf-as-moa') - compile project (':signature-standards:sigs-pkcs7detached') - compile project (':signature-standards:sigs-pades') + implementation project (':signature-standards:sigs-pkcs7detached') + implementation project (':signature-standards:sigs-pades') - compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.7' - compile group: 'javax.activation', name: 'activation', version: '1.1.1' + implementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.7' + implementation group: 'javax.activation', name: 'activation', version: '1.1.1' - testCompile group: 'junit', name: 'junit', version: '4.+' - testCompile group: 'org.icepdf', name: 'icepdf-core', version: '5.0.7' + testImplementation group: 'junit', name: 'junit', version: '4.12' + testImplementation group: 'org.icepdf.os', name: 'icepdf-core', version: '6.1.1' - pdfBox1Compile project (':pdf-as-pdfbox') - pdfBox1Compile group: 'org.apache.pdfbox', name: 'preflight', version: '1.8.16' - pdfBox1Compile group: 'org.apache.pdfbox', name: 'pdfbox', version: '1.8.16' - - pdfBox2Compile project (':pdf-as-pdfbox-2') - pdfBox2Compile group: 'org.apache.pdfbox', name: 'preflight', version: '2.0.21' - pdfBox2Compile group: 'org.apache.pdfbox', name: 'pdfbox', version: '2.0.21' - pdfBox2Compile group: 'org.apache.pdfbox', name: 'pdfbox-tools', version: '2.0.21' + implementation project (':pdf-as-pdfbox-2') + //compile group: 'org.apache.pdfbox', name: 'preflight', version: '2.0.21' + //compile group: 'org.apache.pdfbox', name: 'pdfbox', version: '2.0.21' + //compile group: 'org.apache.pdfbox', name: 'pdfbox-tools', version: '2.0.21' } @@ -58,7 +52,7 @@ def suiteDir = new File(projectDir, "src/test/test-suites") logger.info("Searching: " + suiteDir.absolutePath) //Eclipse UI shows an error because source set dependencies are not recognized, so we add the dependencies manually -eclipse.classpath.plusConfigurations+=[configurations.pdfBox1Compile] +//eclipse.classpath.plusConfigurations+=[configurations.pdfBox1Compile] suiteDir.eachDir { File subDir -> def dirname = subDir.name @@ -69,11 +63,6 @@ suiteDir.eachDir { File subDir -> description "runs tests from Test Suite: " + dirname systemProperties 'test.dir': subDir.absolutePath - //based on executed testsuit we setup the classpath - if(dirname =="public_pdfbox1"){ - classpath += sourceSets.pdfBox1.compileClasspath - compileTestJava.classpath += sourceSets.pdfBox1.compileClasspath - } if(dirname =="public_pdfbox2"){ classpath += sourceSets.pdfBox2.compileClasspath compileTestJava.classpath += sourceSets.pdfBox2.compileClasspath diff --git a/pdf-as-tests/src/test/java/at/gv/egiz/param_tests/SignaturePositionTest.java b/pdf-as-tests/src/test/java/at/gv/egiz/param_tests/SignaturePositionTest.java index baaf646c..cb06b669 100644 --- a/pdf-as-tests/src/test/java/at/gv/egiz/param_tests/SignaturePositionTest.java +++ b/pdf-as-tests/src/test/java/at/gv/egiz/param_tests/SignaturePositionTest.java @@ -163,9 +163,10 @@ public class SignaturePositionTest extends SignatureTest { * reference image, as well as the location of the reference * image with ignored areas * @throws IOException + * @throws InterruptedException */ private void captureReferenceImage(SignaturePositionTestInfo testInfo) - throws IOException { + throws IOException, InterruptedException { String pdfName = baseTestData.getOutputFile(); String referenceOutputFile = refImageFileName; int pageNumber = sigPageNumber; @@ -193,11 +194,12 @@ public class SignaturePositionTest extends SignatureTest { * @throws IndexOutOfBoundsException * @throws PrinterException * @throws PDFASError + * @throws InterruptedException */ @Test public void signaturePositionTest() throws FileNotFoundException, CertificateException, IOException, PdfAsException, - IndexOutOfBoundsException, PrinterException, PDFASError { + IndexOutOfBoundsException, PrinterException, PDFASError, InterruptedException { SignaturePositionTestInfo testInfo = SerializiationManager .getInstance().createTestInfo(SignaturePositionTestInfo.class, baseTestData); @@ -309,8 +311,9 @@ public class SignaturePositionTest extends SignatureTest { * @param pageNumber * the page number which should be captured * @return the captured image + * @throws InterruptedException */ - private BufferedImage captureImage(String fileName, int pageNumber) { + private BufferedImage captureImage(String fileName, int pageNumber) throws InterruptedException { Document document = new Document(); try { document.setFile(fileName); diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_DE/TestGhostscriptPdfA.pdf b/pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_DE/TestGhostscriptPdfA.pdf deleted file mode 100644 index 7357c46d..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_DE/TestGhostscriptPdfA.pdf and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_DE/config.properties b/pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_DE/config.properties deleted file mode 100644 index 59811375..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_DE/config.properties +++ /dev/null @@ -1,5 +0,0 @@ -test.type=pdfa -test.name=PDFA_SIGNATURBLOCK_DE -input.file=TestGhostscriptPdfA.pdf -profile.id=SIGNATURBLOCK_DE_PDFA -output.file=foobar.pdf \ No newline at end of file diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_DE_NOTE/TestGhostscriptPdfA.pdf b/pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_DE_NOTE/TestGhostscriptPdfA.pdf deleted file mode 100644 index 7357c46d..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_DE_NOTE/TestGhostscriptPdfA.pdf and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_DE_NOTE/config.properties b/pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_DE_NOTE/config.properties deleted file mode 100644 index 33b9bef0..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_DE_NOTE/config.properties +++ /dev/null @@ -1,5 +0,0 @@ -test.type=pdfa -test.name=PDFA_SIGNATURBLOCK_DE_NOTE -input.file=TestGhostscriptPdfA.pdf -profile.id=SIGNATURBLOCK_DE_PDFA_NOTE -output.file=foobar.pdf \ No newline at end of file diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_EN/TestGhostscriptPdfA.pdf b/pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_EN/TestGhostscriptPdfA.pdf deleted file mode 100644 index 7357c46d..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_EN/TestGhostscriptPdfA.pdf and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_EN/config.properties b/pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_EN/config.properties deleted file mode 100644 index 2e2d3a37..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_EN/config.properties +++ /dev/null @@ -1,5 +0,0 @@ -test.type=pdfa -test.name=PDFA_SIGNATURBLOCK_EN -input.file=TestGhostscriptPdfA.pdf -profile.id=SIGNATURBLOCK_EN_PDFA -output.file=foobar.pdf \ No newline at end of file diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_EN_NOTE/TestGhostscriptPdfA.pdf b/pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_EN_NOTE/TestGhostscriptPdfA.pdf deleted file mode 100644 index 7357c46d..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_EN_NOTE/TestGhostscriptPdfA.pdf and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_EN_NOTE/config.properties b/pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_EN_NOTE/config.properties deleted file mode 100644 index 88e7e2c1..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/PDFA_SIGNATURBLOCK_EN_NOTE/config.properties +++ /dev/null @@ -1,5 +0,0 @@ -test.type=pdfa -test.name=PDFA_SIGNATURBLOCK_EN_NOTE -input.file=TestGhostscriptPdfA.pdf -profile.id=SIGNATURBLOCK_EN_PDFA_NOTE -output.file=foobar.pdf \ No newline at end of file diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_DE/config.properties b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_DE/config.properties deleted file mode 100644 index c612cba8..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_DE/config.properties +++ /dev/null @@ -1,5 +0,0 @@ -test.type=position -test.name=POS_AMTSSIGNATURBLOCK_DE -profile.id=AMTSSIGNATURBLOCK_DE -parent=../auto_pos_example.properties -position.ignored_areas=215,683,142,9 diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_DE/example.pdf b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_DE/example.pdf deleted file mode 100644 index 867f68db..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_DE/example.pdf and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_DE/example_ref.png b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_DE/example_ref.png deleted file mode 100644 index de1cf14a..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_DE/example_ref.png and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_DE_SMALL/config.properties b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_DE_SMALL/config.properties deleted file mode 100644 index a2558440..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_DE_SMALL/config.properties +++ /dev/null @@ -1,5 +0,0 @@ -test.type=position -test.name=POS_AMTSSIGNATURBLOCK_DE_SMALL -profile.id=AMTSSIGNATURBLOCK_DE_SMALL -parent=../auto_pos_example.properties -position.ignored_areas=285,693,90,6 diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_DE_SMALL/example.pdf b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_DE_SMALL/example.pdf deleted file mode 100644 index 867f68db..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_DE_SMALL/example.pdf and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_DE_SMALL/example_ref.png b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_DE_SMALL/example_ref.png deleted file mode 100644 index c95b3299..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_DE_SMALL/example_ref.png and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_EN/config.properties b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_EN/config.properties deleted file mode 100644 index 4bb4b426..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_EN/config.properties +++ /dev/null @@ -1,5 +0,0 @@ -test.type=position -test.name=POS_AMTSSIGNATURBLOCK_EN -profile.id=AMTSSIGNATURBLOCK_EN -parent=../auto_pos_example.properties -position.ignored_areas=215,683,142,9 diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_EN/example.pdf b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_EN/example.pdf deleted file mode 100644 index 867f68db..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_EN/example.pdf and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_EN/example_ref.png b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_EN/example_ref.png deleted file mode 100644 index ea3bca00..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_EN/example_ref.png and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_EN_SMALL/config.properties b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_EN_SMALL/config.properties deleted file mode 100644 index 64459d91..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_EN_SMALL/config.properties +++ /dev/null @@ -1,5 +0,0 @@ -test.type=position -test.name=POS_AMTSSIGNATURBLOCK_EN_SMALL -profile.id=AMTSSIGNATURBLOCK_EN_SMALL -parent=../auto_pos_example.properties -position.ignored_areas=285,693,90,6 diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_EN_SMALL/example.pdf b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_EN_SMALL/example.pdf deleted file mode 100644 index 867f68db..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_EN_SMALL/example.pdf and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_EN_SMALL/example_ref.png b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_EN_SMALL/example_ref.png deleted file mode 100644 index f5f9cf73..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AMTSSIGNATURBLOCK_EN_SMALL/example_ref.png and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AUTO/config.properties b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AUTO/config.properties deleted file mode 100644 index e8b47027..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AUTO/config.properties +++ /dev/null @@ -1,5 +0,0 @@ -test.type=position -test.name=POS_AUTO -profile.id=SIGNATURBLOCK_DE -parent=../auto_pos_example.properties -position.ignored_areas=208,451,142,9 diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AUTO/example.pdf b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AUTO/example.pdf deleted file mode 100644 index c760770a..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AUTO/example.pdf and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AUTO/example_ref.png b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AUTO/example_ref.png deleted file mode 100644 index b7ede494..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_AUTO/example_ref.png and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE/config.properties b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE/config.properties deleted file mode 100644 index bac0aba0..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE/config.properties +++ /dev/null @@ -1,5 +0,0 @@ -test.type=position -test.name=POS_SIGNATURBLOCK_DE -profile.id=SIGNATURBLOCK_DE -parent=../auto_pos_example.properties -position.ignored_areas=215,683,142,9 diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE/example.pdf b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE/example.pdf deleted file mode 100644 index 867f68db..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE/example.pdf and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE/example_ref.png b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE/example_ref.png deleted file mode 100644 index c19a939f..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE/example_ref.png and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_MINIMAL/config.properties b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_MINIMAL/config.properties deleted file mode 100644 index 6e617d9e..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_MINIMAL/config.properties +++ /dev/null @@ -1,5 +0,0 @@ -test.type=position -test.name=POS_SIGNATURBLOCK_DE_MINIMAL -profile.id=SIGNATURBLOCK_MINIMAL_DE -parent=../auto_pos_example.properties -#position.ignored_areas=290,690,90,6 diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_MINIMAL/example.pdf b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_MINIMAL/example.pdf deleted file mode 100644 index 867f68db..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_MINIMAL/example.pdf and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_MINIMAL/example_ref.png b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_MINIMAL/example_ref.png deleted file mode 100644 index 4b5efe29..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_MINIMAL/example_ref.png and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_NOTE/config.properties b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_NOTE/config.properties deleted file mode 100644 index 9f0cad3d..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_NOTE/config.properties +++ /dev/null @@ -1,5 +0,0 @@ -test.type=position -test.name=POS_SIGNATURBLOCK_DE_NOTE -profile.id=SIGNATURBLOCK_DE_NOTE -parent=../auto_pos_example.properties -position.ignored_areas=200,682,160,9 diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_NOTE/example.pdf b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_NOTE/example.pdf deleted file mode 100644 index 867f68db..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_NOTE/example.pdf and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_NOTE/example_ref.png b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_NOTE/example_ref.png deleted file mode 100644 index 8729ebf6..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_NOTE/example_ref.png and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_PDFA/config.properties b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_PDFA/config.properties deleted file mode 100644 index 2519069e..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_PDFA/config.properties +++ /dev/null @@ -1,5 +0,0 @@ -test.type=position -test.name=POS_SIGNATURBLOCK_DE_PDFA -profile.id=SIGNATURBLOCK_DE_PDFA -parent=../auto_pos_example.properties -position.ignored_areas=229,685,146,9 diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_PDFA/example.pdf b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_PDFA/example.pdf deleted file mode 100644 index 867f68db..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_PDFA/example.pdf and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_PDFA/example_ref.png b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_PDFA/example_ref.png deleted file mode 100644 index 49aadc4f..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_PDFA/example_ref.png and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_PDFA_NOTE/config.properties b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_PDFA_NOTE/config.properties deleted file mode 100644 index da997c01..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_PDFA_NOTE/config.properties +++ /dev/null @@ -1,5 +0,0 @@ -test.type=position -test.name=POS_SIGNATURBLOCK_DE_PDFA_NOTE -profile.id=SIGNATURBLOCK_DE_PDFA_NOTE -parent=../auto_pos_example.properties -position.ignored_areas=229,685,150,9 \ No newline at end of file diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_PDFA_NOTE/example.pdf b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_PDFA_NOTE/example.pdf deleted file mode 100644 index 867f68db..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_PDFA_NOTE/example.pdf and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_PDFA_NOTE/example_ref.png b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_PDFA_NOTE/example_ref.png deleted file mode 100644 index 7c80b8c9..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_PDFA_NOTE/example_ref.png and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_SMALL/config.properties b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_SMALL/config.properties deleted file mode 100644 index f34b339e..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_SMALL/config.properties +++ /dev/null @@ -1,5 +0,0 @@ -test.type=position -test.name=POS_SIGNATURBLOCK_DE_SMALL -profile.id=SIGNATURBLOCK_SMALL_DE -parent=../auto_pos_example.properties -position.ignored_areas=287,686,90,6 diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_SMALL/example.pdf b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_SMALL/example.pdf deleted file mode 100644 index 867f68db..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_SMALL/example.pdf and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_SMALL/example_ref.png b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_SMALL/example_ref.png deleted file mode 100644 index be46bc2c..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_SMALL/example_ref.png and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_SMALL_NOTE/config.properties b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_SMALL_NOTE/config.properties deleted file mode 100644 index 059c859f..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_SMALL_NOTE/config.properties +++ /dev/null @@ -1,5 +0,0 @@ -test.type=position -test.name=POS_SIGNATURBLOCK_DE_SMALL_NOTE -profile.id=SIGNATURBLOCK_SMALL_DE_NOTE -parent=../auto_pos_example.properties -position.ignored_areas=287,686,90,6 diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_SMALL_NOTE/example.pdf b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_SMALL_NOTE/example.pdf deleted file mode 100644 index 867f68db..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_SMALL_NOTE/example.pdf and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_SMALL_NOTE/example_ref.png b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_SMALL_NOTE/example_ref.png deleted file mode 100644 index a2649bb7..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_DE_SMALL_NOTE/example_ref.png and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN/config.properties b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN/config.properties deleted file mode 100644 index 2ae8636a..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN/config.properties +++ /dev/null @@ -1,5 +0,0 @@ -test.type=position -test.name=POS_SIGNATURBLOCK_EN -profile.id=SIGNATURBLOCK_EN -parent=../auto_pos_example.properties -position.ignored_areas=215,683,142,9 diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN/example.pdf b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN/example.pdf deleted file mode 100644 index 867f68db..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN/example.pdf and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN/example_ref.png b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN/example_ref.png deleted file mode 100644 index 69fdbb07..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN/example_ref.png and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_MINIMAL/config.properties b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_MINIMAL/config.properties deleted file mode 100644 index 03ca9a45..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_MINIMAL/config.properties +++ /dev/null @@ -1,5 +0,0 @@ -test.type=position -test.name=POS_SIGNATURBLOCK_EN_MINIMAL -profile.id=SIGNATURBLOCK_MINIMAL_EN -parent=../auto_pos_example.properties -#position.ignored_areas=290,690,90,6 diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_MINIMAL/example.pdf b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_MINIMAL/example.pdf deleted file mode 100644 index 867f68db..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_MINIMAL/example.pdf and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_MINIMAL/example_ref.png b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_MINIMAL/example_ref.png deleted file mode 100644 index 895d415b..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_MINIMAL/example_ref.png and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_NOTE/config.properties b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_NOTE/config.properties deleted file mode 100644 index e2acb791..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_NOTE/config.properties +++ /dev/null @@ -1,5 +0,0 @@ -test.type=position -test.name=POS_SIGNATURBLOCK_EN_NOTE -profile.id=SIGNATURBLOCK_EN_NOTE -parent=../auto_pos_example.properties -position.ignored_areas=200,683,160,9 diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_NOTE/example.pdf b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_NOTE/example.pdf deleted file mode 100644 index 867f68db..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_NOTE/example.pdf and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_NOTE/example_ref.png b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_NOTE/example_ref.png deleted file mode 100644 index 175c4ac3..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_NOTE/example_ref.png and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_PDFA/config.properties b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_PDFA/config.properties deleted file mode 100644 index f7a7c5fd..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_PDFA/config.properties +++ /dev/null @@ -1,5 +0,0 @@ -test.type=position -test.name=POS_SIGNATURBLOCK_EN_PDFA -profile.id=SIGNATURBLOCK_EN_PDFA -parent=../auto_pos_example.properties -position.ignored_areas=212,685,146,9 diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_PDFA/example.pdf b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_PDFA/example.pdf deleted file mode 100644 index 867f68db..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_PDFA/example.pdf and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_PDFA/example_ref.png b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_PDFA/example_ref.png deleted file mode 100644 index 76dcfdf3..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_PDFA/example_ref.png and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_PDFA_NOTE/config.properties b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_PDFA_NOTE/config.properties deleted file mode 100644 index e0b5f0c1..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_PDFA_NOTE/config.properties +++ /dev/null @@ -1,5 +0,0 @@ -test.type=position -test.name=POS_SIGNATURBLOCK_EN_PDFA_NOTE -profile.id=SIGNATURBLOCK_EN_PDFA_NOTE -parent=../auto_pos_example.properties -position.ignored_areas=210,685,146,9 diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_PDFA_NOTE/example.pdf b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_PDFA_NOTE/example.pdf deleted file mode 100644 index 867f68db..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_PDFA_NOTE/example.pdf and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_PDFA_NOTE/example_ref.png b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_PDFA_NOTE/example_ref.png deleted file mode 100644 index df963307..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_PDFA_NOTE/example_ref.png and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_SMALL/config.properties b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_SMALL/config.properties deleted file mode 100644 index fb3eee6c..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_SMALL/config.properties +++ /dev/null @@ -1,5 +0,0 @@ -test.type=position -test.name=POS_SIGNATURBLOCK_EN_SMALL -profile.id=SIGNATURBLOCK_SMALL_EN -parent=../auto_pos_example.properties -position.ignored_areas=287,686,90,6 diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_SMALL/example.pdf b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_SMALL/example.pdf deleted file mode 100644 index 867f68db..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_SMALL/example.pdf and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_SMALL/example_ref.png b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_SMALL/example_ref.png deleted file mode 100644 index ccda0b54..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_SMALL/example_ref.png and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_SMALL_NOTE/config.properties b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_SMALL_NOTE/config.properties deleted file mode 100644 index dbc36c13..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_SMALL_NOTE/config.properties +++ /dev/null @@ -1,5 +0,0 @@ -test.type=position -test.name=POS_SIGNATURBLOCK_EN_SMALL_NOTE -profile.id=SIGNATURBLOCK_SMALL_EN_NOTE -parent=../auto_pos_example.properties -position.ignored_areas=282,686,90,6 diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_SMALL_NOTE/example.pdf b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_SMALL_NOTE/example.pdf deleted file mode 100644 index 867f68db..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_SMALL_NOTE/example.pdf and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_SMALL_NOTE/example_ref.png b/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_SMALL_NOTE/example_ref.png deleted file mode 100644 index 8375192b..00000000 Binary files a/pdf-as-tests/src/test/test-suites/public_pdfbox1/POS_SIGNATURBLOCK_EN_SMALL_NOTE/example_ref.png and /dev/null differ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/auto_pos_example.properties b/pdf-as-tests/src/test/test-suites/public_pdfbox1/auto_pos_example.properties deleted file mode 100644 index 15c779b1..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/auto_pos_example.properties +++ /dev/null @@ -1,6 +0,0 @@ -input.file=example.pdf -position.positioning_string=x:auto;y:auto -position.page_number=1 -position.reference_image=example_ref.png -position.mode=test -#position.mode=capture_reference diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/config.properties b/pdf-as-tests/src/test/test-suites/public_pdfbox1/config.properties deleted file mode 100644 index e4735236..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/config.properties +++ /dev/null @@ -1,9 +0,0 @@ -config.file=../pdf-as-lib/src/configuration/ -connector=ks -ks.filename=src/test/test-suites/public_pdfbox1/test.p12 -ks.type=PKCS12 -ks.pass=123456 -ks.keypass=123456 -ks.alias=ecc_test -# For RSA Signature -#ks.alias=pdf \ No newline at end of file diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/css/bootstrap-theme.css b/pdf-as-tests/src/test/test-suites/public_pdfbox1/css/bootstrap-theme.css deleted file mode 100644 index f860bbc0..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/css/bootstrap-theme.css +++ /dev/null @@ -1,442 +0,0 @@ -/*! - * Bootstrap v3.2.0 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -.btn-default, -.btn-primary, -.btn-success, -.btn-info, -.btn-warning, -.btn-danger { - text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); -} -.btn-default:active, -.btn-primary:active, -.btn-success:active, -.btn-info:active, -.btn-warning:active, -.btn-danger:active, -.btn-default.active, -.btn-primary.active, -.btn-success.active, -.btn-info.active, -.btn-warning.active, -.btn-danger.active { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn:active, -.btn.active { - background-image: none; -} -.btn-default { - text-shadow: 0 1px 0 #fff; - background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); - background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); - background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #dbdbdb; - border-color: #ccc; -} -.btn-default:hover, -.btn-default:focus { - background-color: #e0e0e0; - background-position: 0 -15px; -} -.btn-default:active, -.btn-default.active { - background-color: #e0e0e0; - border-color: #dbdbdb; -} -.btn-default:disabled, -.btn-default[disabled] { - background-color: #e0e0e0; - background-image: none; -} -.btn-primary { - background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%); - background-image: -o-linear-gradient(top, #428bca 0%, #2d6ca2 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#2d6ca2)); - background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #2b669a; -} -.btn-primary:hover, -.btn-primary:focus { - background-color: #2d6ca2; - background-position: 0 -15px; -} -.btn-primary:active, -.btn-primary.active { - background-color: #2d6ca2; - border-color: #2b669a; -} -.btn-primary:disabled, -.btn-primary[disabled] { - background-color: #2d6ca2; - background-image: none; -} -.btn-success { - background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); - background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); - background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #3e8f3e; -} -.btn-success:hover, -.btn-success:focus { - background-color: #419641; - background-position: 0 -15px; -} -.btn-success:active, -.btn-success.active { - background-color: #419641; - border-color: #3e8f3e; -} -.btn-success:disabled, -.btn-success[disabled] { - background-color: #419641; - background-image: none; -} -.btn-info { - background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); - background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); - background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #28a4c9; -} -.btn-info:hover, -.btn-info:focus { - background-color: #2aabd2; - background-position: 0 -15px; -} -.btn-info:active, -.btn-info.active { - background-color: #2aabd2; - border-color: #28a4c9; -} -.btn-info:disabled, -.btn-info[disabled] { - background-color: #2aabd2; - background-image: none; -} -.btn-warning { - background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); - background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #e38d13; -} -.btn-warning:hover, -.btn-warning:focus { - background-color: #eb9316; - background-position: 0 -15px; -} -.btn-warning:active, -.btn-warning.active { - background-color: #eb9316; - border-color: #e38d13; -} -.btn-warning:disabled, -.btn-warning[disabled] { - background-color: #eb9316; - background-image: none; -} -.btn-danger { - background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); - background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); - background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #b92c28; -} -.btn-danger:hover, -.btn-danger:focus { - background-color: #c12e2a; - background-position: 0 -15px; -} -.btn-danger:active, -.btn-danger.active { - background-color: #c12e2a; - border-color: #b92c28; -} -.btn-danger:disabled, -.btn-danger[disabled] { - background-color: #c12e2a; - background-image: none; -} -.thumbnail, -.img-thumbnail { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); - box-shadow: 0 1px 2px rgba(0, 0, 0, .075); -} -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - background-color: #e8e8e8; - background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); - background-repeat: repeat-x; -} -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - background-color: #357ebd; - background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd)); - background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); - background-repeat: repeat-x; -} -.navbar-default { - background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); - background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); - background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); -} -.navbar-default .navbar-nav > .active > a { - background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); - background-image: -o-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f3f3f3)); - background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0); - background-repeat: repeat-x; - -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); - box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); -} -.navbar-brand, -.navbar-nav > li > a { - text-shadow: 0 1px 0 rgba(255, 255, 255, .25); -} -.navbar-inverse { - background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); - background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); - background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; -} -.navbar-inverse .navbar-nav > .active > a { - background-image: -webkit-linear-gradient(top, #222 0%, #282828 100%); - background-image: -o-linear-gradient(top, #222 0%, #282828 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#222), to(#282828)); - background-image: linear-gradient(to bottom, #222 0%, #282828 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0); - background-repeat: repeat-x; - -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); - box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); -} -.navbar-inverse .navbar-brand, -.navbar-inverse .navbar-nav > li > a { - text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); -} -.navbar-static-top, -.navbar-fixed-top, -.navbar-fixed-bottom { - border-radius: 0; -} -.alert { - text-shadow: 0 1px 0 rgba(255, 255, 255, .2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); -} -.alert-success { - background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); - background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); - background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); - background-repeat: repeat-x; - border-color: #b2dba1; -} -.alert-info { - background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); - background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); - background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); - background-repeat: repeat-x; - border-color: #9acfea; -} -.alert-warning { - background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); - background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); - background-repeat: repeat-x; - border-color: #f5e79e; -} -.alert-danger { - background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); - background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); - background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); - background-repeat: repeat-x; - border-color: #dca7a7; -} -.progress { - background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); - background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); - background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar { - background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%); - background-image: -o-linear-gradient(top, #428bca 0%, #3071a9 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3071a9)); - background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-success { - background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); - background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); - background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-info { - background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); - background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); - background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-warning { - background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); - background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-danger { - background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); - background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); - background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-striped { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.list-group { - border-radius: 4px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); - box-shadow: 0 1px 2px rgba(0, 0, 0, .075); -} -.list-group-item.active, -.list-group-item.active:hover, -.list-group-item.active:focus { - text-shadow: 0 -1px 0 #3071a9; - background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%); - background-image: -o-linear-gradient(top, #428bca 0%, #3278b3 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3278b3)); - background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); - background-repeat: repeat-x; - border-color: #3278b3; -} -.panel { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); - box-shadow: 0 1px 2px rgba(0, 0, 0, .05); -} -.panel-default > .panel-heading { - background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); - background-repeat: repeat-x; -} -.panel-primary > .panel-heading { - background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd)); - background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); - background-repeat: repeat-x; -} -.panel-success > .panel-heading { - background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); - background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); - background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); - background-repeat: repeat-x; -} -.panel-info > .panel-heading { - background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); - background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); - background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); - background-repeat: repeat-x; -} -.panel-warning > .panel-heading { - background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); - background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); - background-repeat: repeat-x; -} -.panel-danger > .panel-heading { - background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); - background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); - background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); - background-repeat: repeat-x; -} -.well { - background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); - background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); - background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); - background-repeat: repeat-x; - border-color: #dcdcdc; - -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); -} -/*# sourceMappingURL=bootstrap-theme.css.map */ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/css/bootstrap-theme.css.map b/pdf-as-tests/src/test/test-suites/public_pdfbox1/css/bootstrap-theme.css.map deleted file mode 100644 index 4cc41ab0..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/css/bootstrap-theme.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"bootstrap-theme.css","sources":["less/theme.less","less/mixins/vendor-prefixes.less","bootstrap-theme.css","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"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","sourcesContent":["\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &:disabled,\n &[disabled] {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-bg, 5%); @end-color: darken(@navbar-default-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-bg; @end-color: lighten(@navbar-inverse-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n}\n\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n &::-moz-placeholder { color: @color; // Firefox\n opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n",null,"// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/css/bootstrap-theme.min.css b/pdf-as-tests/src/test/test-suites/public_pdfbox1/css/bootstrap-theme.min.css deleted file mode 100644 index 2e97597c..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/css/bootstrap-theme.min.css +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Bootstrap v3.2.0 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default:disabled,.btn-default[disabled]{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-o-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#2d6ca2));background-image:linear-gradient(to bottom,#428bca 0,#2d6ca2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#2b669a}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-primary:disabled,.btn-primary[disabled]{background-color:#2d6ca2;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-success:disabled,.btn-success[disabled]{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.btn-info:disabled,.btn-info[disabled]{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-warning:disabled,.btn-warning[disabled]{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-danger:disabled,.btn-danger[disabled]{background-color:#c12e2a;background-image:none}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f3f3f3));background-image:linear-gradient(to bottom,#ebebeb 0,#f3f3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#222 0,#282828 100%);background-image:-o-linear-gradient(top,#222 0,#282828 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#222),to(#282828));background-image:linear-gradient(to bottom,#222 0,#282828 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-o-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3071a9));background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-o-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3278b3));background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);background-repeat:repeat-x;border-color:#3278b3}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} \ No newline at end of file diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/css/bootstrap.css b/pdf-as-tests/src/test/test-suites/public_pdfbox1/css/bootstrap.css deleted file mode 100644 index 037dd056..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/css/bootstrap.css +++ /dev/null @@ -1,6203 +0,0 @@ -/*! - * Bootstrap v3.2.0 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -/*! normalize.css v3.0.1 | MIT License | git.io/normalize */ -html { - font-family: sans-serif; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} -body { - margin: 0; -} -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -nav, -section, -summary { - display: block; -} -audio, -canvas, -progress, -video { - display: inline-block; - vertical-align: baseline; -} -audio:not([controls]) { - display: none; - height: 0; -} -[hidden], -template { - display: none; -} -a { - background: transparent; -} -a:active, -a:hover { - outline: 0; -} -abbr[title] { - border-bottom: 1px dotted; -} -b, -strong { - font-weight: bold; -} -dfn { - font-style: italic; -} -h1 { - margin: .67em 0; - font-size: 2em; -} -mark { - color: #000; - background: #ff0; -} -small { - font-size: 80%; -} -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} -sup { - top: -.5em; -} -sub { - bottom: -.25em; -} -img { - border: 0; -} -svg:not(:root) { - overflow: hidden; -} -figure { - margin: 1em 40px; -} -hr { - height: 0; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; -} -pre { - overflow: auto; -} -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; -} -button, -input, -optgroup, -select, -textarea { - margin: 0; - font: inherit; - color: inherit; -} -button { - overflow: visible; -} -button, -select { - text-transform: none; -} -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - cursor: pointer; -} -button[disabled], -html input[disabled] { - cursor: default; -} -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} -input { - line-height: normal; -} -input[type="checkbox"], -input[type="radio"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 0; -} -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; -} -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} -fieldset { - padding: .35em .625em .75em; - margin: 0 2px; - border: 1px solid #c0c0c0; -} -legend { - padding: 0; - border: 0; -} -textarea { - overflow: auto; -} -optgroup { - font-weight: bold; -} -table { - border-spacing: 0; - border-collapse: collapse; -} -td, -th { - padding: 0; -} -@media print { - * { - color: #000 !important; - text-shadow: none !important; - background: transparent !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; - } - a, - a:visited { - text-decoration: underline; - } - a[href]:after { - content: " (" attr(href) ")"; - } - abbr[title]:after { - content: " (" attr(title) ")"; - } - a[href^="javascript:"]:after, - a[href^="#"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } - select { - background: #fff !important; - } - .navbar { - display: none; - } - .table td, - .table th { - background-color: #fff !important; - } - .btn > .caret, - .dropup > .btn > .caret { - border-top-color: #000 !important; - } - .label { - border: 1px solid #000; - } - .table { - border-collapse: collapse !important; - } - .table-bordered th, - .table-bordered td { - border: 1px solid #ddd !important; - } -} -@font-face { - font-family: 'Glyphicons Halflings'; - - src: url('../fonts/glyphicons-halflings-regular.eot'); - src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); -} -.glyphicon { - position: relative; - top: 1px; - display: inline-block; - font-family: 'Glyphicons Halflings'; - font-style: normal; - font-weight: normal; - line-height: 1; - - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -.glyphicon-asterisk:before { - content: "\2a"; -} -.glyphicon-plus:before { - content: "\2b"; -} -.glyphicon-euro:before { - content: "\20ac"; -} -.glyphicon-minus:before { - content: "\2212"; -} -.glyphicon-cloud:before { - content: "\2601"; -} -.glyphicon-envelope:before { - content: "\2709"; -} -.glyphicon-pencil:before { - content: "\270f"; -} -.glyphicon-glass:before { - content: "\e001"; -} -.glyphicon-music:before { - content: "\e002"; -} -.glyphicon-search:before { - content: "\e003"; -} -.glyphicon-heart:before { - content: "\e005"; -} -.glyphicon-star:before { - content: "\e006"; -} -.glyphicon-star-empty:before { - content: "\e007"; -} -.glyphicon-user:before { - content: "\e008"; -} -.glyphicon-film:before { - content: "\e009"; -} -.glyphicon-th-large:before { - content: "\e010"; -} -.glyphicon-th:before { - content: "\e011"; -} -.glyphicon-th-list:before { - content: "\e012"; -} -.glyphicon-ok:before { - content: "\e013"; -} -.glyphicon-remove:before { - content: "\e014"; -} -.glyphicon-zoom-in:before { - content: "\e015"; -} -.glyphicon-zoom-out:before { - content: "\e016"; -} -.glyphicon-off:before { - content: "\e017"; -} -.glyphicon-signal:before { - content: "\e018"; -} -.glyphicon-cog:before { - content: "\e019"; -} -.glyphicon-trash:before { - content: "\e020"; -} -.glyphicon-home:before { - content: "\e021"; -} -.glyphicon-file:before { - content: "\e022"; -} -.glyphicon-time:before { - content: "\e023"; -} -.glyphicon-road:before { - content: "\e024"; -} -.glyphicon-download-alt:before { - content: "\e025"; -} -.glyphicon-download:before { - content: "\e026"; -} -.glyphicon-upload:before { - content: "\e027"; -} -.glyphicon-inbox:before { - content: "\e028"; -} -.glyphicon-play-circle:before { - content: "\e029"; -} -.glyphicon-repeat:before { - content: "\e030"; -} -.glyphicon-refresh:before { - content: "\e031"; -} -.glyphicon-list-alt:before { - content: "\e032"; -} -.glyphicon-lock:before { - content: "\e033"; -} -.glyphicon-flag:before { - content: "\e034"; -} -.glyphicon-headphones:before { - content: "\e035"; -} -.glyphicon-volume-off:before { - content: "\e036"; -} -.glyphicon-volume-down:before { - content: "\e037"; -} -.glyphicon-volume-up:before { - content: "\e038"; -} -.glyphicon-qrcode:before { - content: "\e039"; -} -.glyphicon-barcode:before { - content: "\e040"; -} -.glyphicon-tag:before { - content: "\e041"; -} -.glyphicon-tags:before { - content: "\e042"; -} -.glyphicon-book:before { - content: "\e043"; -} -.glyphicon-bookmark:before { - content: "\e044"; -} -.glyphicon-print:before { - content: "\e045"; -} -.glyphicon-camera:before { - content: "\e046"; -} -.glyphicon-font:before { - content: "\e047"; -} -.glyphicon-bold:before { - content: "\e048"; -} -.glyphicon-italic:before { - content: "\e049"; -} -.glyphicon-text-height:before { - content: "\e050"; -} -.glyphicon-text-width:before { - content: "\e051"; -} -.glyphicon-align-left:before { - content: "\e052"; -} -.glyphicon-align-center:before { - content: "\e053"; -} -.glyphicon-align-right:before { - content: "\e054"; -} -.glyphicon-align-justify:before { - content: "\e055"; -} -.glyphicon-list:before { - content: "\e056"; -} -.glyphicon-indent-left:before { - content: "\e057"; -} -.glyphicon-indent-right:before { - content: "\e058"; -} -.glyphicon-facetime-video:before { - content: "\e059"; -} -.glyphicon-picture:before { - content: "\e060"; -} -.glyphicon-map-marker:before { - content: "\e062"; -} -.glyphicon-adjust:before { - content: "\e063"; -} -.glyphicon-tint:before { - content: "\e064"; -} -.glyphicon-edit:before { - content: "\e065"; -} -.glyphicon-share:before { - content: "\e066"; -} -.glyphicon-check:before { - content: "\e067"; -} -.glyphicon-move:before { - content: "\e068"; -} -.glyphicon-step-backward:before { - content: "\e069"; -} -.glyphicon-fast-backward:before { - content: "\e070"; -} -.glyphicon-backward:before { - content: "\e071"; -} -.glyphicon-play:before { - content: "\e072"; -} -.glyphicon-pause:before { - content: "\e073"; -} -.glyphicon-stop:before { - content: "\e074"; -} -.glyphicon-forward:before { - content: "\e075"; -} -.glyphicon-fast-forward:before { - content: "\e076"; -} -.glyphicon-step-forward:before { - content: "\e077"; -} -.glyphicon-eject:before { - content: "\e078"; -} -.glyphicon-chevron-left:before { - content: "\e079"; -} -.glyphicon-chevron-right:before { - content: "\e080"; -} -.glyphicon-plus-sign:before { - content: "\e081"; -} -.glyphicon-minus-sign:before { - content: "\e082"; -} -.glyphicon-remove-sign:before { - content: "\e083"; -} -.glyphicon-ok-sign:before { - content: "\e084"; -} -.glyphicon-question-sign:before { - content: "\e085"; -} -.glyphicon-info-sign:before { - content: "\e086"; -} -.glyphicon-screenshot:before { - content: "\e087"; -} -.glyphicon-remove-circle:before { - content: "\e088"; -} -.glyphicon-ok-circle:before { - content: "\e089"; -} -.glyphicon-ban-circle:before { - content: "\e090"; -} -.glyphicon-arrow-left:before { - content: "\e091"; -} -.glyphicon-arrow-right:before { - content: "\e092"; -} -.glyphicon-arrow-up:before { - content: "\e093"; -} -.glyphicon-arrow-down:before { - content: "\e094"; -} -.glyphicon-share-alt:before { - content: "\e095"; -} -.glyphicon-resize-full:before { - content: "\e096"; -} -.glyphicon-resize-small:before { - content: "\e097"; -} -.glyphicon-exclamation-sign:before { - content: "\e101"; -} -.glyphicon-gift:before { - content: "\e102"; -} -.glyphicon-leaf:before { - content: "\e103"; -} -.glyphicon-fire:before { - content: "\e104"; -} -.glyphicon-eye-open:before { - content: "\e105"; -} -.glyphicon-eye-close:before { - content: "\e106"; -} -.glyphicon-warning-sign:before { - content: "\e107"; -} -.glyphicon-plane:before { - content: "\e108"; -} -.glyphicon-calendar:before { - content: "\e109"; -} -.glyphicon-random:before { - content: "\e110"; -} -.glyphicon-comment:before { - content: "\e111"; -} -.glyphicon-magnet:before { - content: "\e112"; -} -.glyphicon-chevron-up:before { - content: "\e113"; -} -.glyphicon-chevron-down:before { - content: "\e114"; -} -.glyphicon-retweet:before { - content: "\e115"; -} -.glyphicon-shopping-cart:before { - content: "\e116"; -} -.glyphicon-folder-close:before { - content: "\e117"; -} -.glyphicon-folder-open:before { - content: "\e118"; -} -.glyphicon-resize-vertical:before { - content: "\e119"; -} -.glyphicon-resize-horizontal:before { - content: "\e120"; -} -.glyphicon-hdd:before { - content: "\e121"; -} -.glyphicon-bullhorn:before { - content: "\e122"; -} -.glyphicon-bell:before { - content: "\e123"; -} -.glyphicon-certificate:before { - content: "\e124"; -} -.glyphicon-thumbs-up:before { - content: "\e125"; -} -.glyphicon-thumbs-down:before { - content: "\e126"; -} -.glyphicon-hand-right:before { - content: "\e127"; -} -.glyphicon-hand-left:before { - content: "\e128"; -} -.glyphicon-hand-up:before { - content: "\e129"; -} -.glyphicon-hand-down:before { - content: "\e130"; -} -.glyphicon-circle-arrow-right:before { - content: "\e131"; -} -.glyphicon-circle-arrow-left:before { - content: "\e132"; -} -.glyphicon-circle-arrow-up:before { - content: "\e133"; -} -.glyphicon-circle-arrow-down:before { - content: "\e134"; -} -.glyphicon-globe:before { - content: "\e135"; -} -.glyphicon-wrench:before { - content: "\e136"; -} -.glyphicon-tasks:before { - content: "\e137"; -} -.glyphicon-filter:before { - content: "\e138"; -} -.glyphicon-briefcase:before { - content: "\e139"; -} -.glyphicon-fullscreen:before { - content: "\e140"; -} -.glyphicon-dashboard:before { - content: "\e141"; -} -.glyphicon-paperclip:before { - content: "\e142"; -} -.glyphicon-heart-empty:before { - content: "\e143"; -} -.glyphicon-link:before { - content: "\e144"; -} -.glyphicon-phone:before { - content: "\e145"; -} -.glyphicon-pushpin:before { - content: "\e146"; -} -.glyphicon-usd:before { - content: "\e148"; -} -.glyphicon-gbp:before { - content: "\e149"; -} -.glyphicon-sort:before { - content: "\e150"; -} -.glyphicon-sort-by-alphabet:before { - content: "\e151"; -} -.glyphicon-sort-by-alphabet-alt:before { - content: "\e152"; -} -.glyphicon-sort-by-order:before { - content: "\e153"; -} -.glyphicon-sort-by-order-alt:before { - content: "\e154"; -} -.glyphicon-sort-by-attributes:before { - content: "\e155"; -} -.glyphicon-sort-by-attributes-alt:before { - content: "\e156"; -} -.glyphicon-unchecked:before { - content: "\e157"; -} -.glyphicon-expand:before { - content: "\e158"; -} -.glyphicon-collapse-down:before { - content: "\e159"; -} -.glyphicon-collapse-up:before { - content: "\e160"; -} -.glyphicon-log-in:before { - content: "\e161"; -} -.glyphicon-flash:before { - content: "\e162"; -} -.glyphicon-log-out:before { - content: "\e163"; -} -.glyphicon-new-window:before { - content: "\e164"; -} -.glyphicon-record:before { - content: "\e165"; -} -.glyphicon-save:before { - content: "\e166"; -} -.glyphicon-open:before { - content: "\e167"; -} -.glyphicon-saved:before { - content: "\e168"; -} -.glyphicon-import:before { - content: "\e169"; -} -.glyphicon-export:before { - content: "\e170"; -} -.glyphicon-send:before { - content: "\e171"; -} -.glyphicon-floppy-disk:before { - content: "\e172"; -} -.glyphicon-floppy-saved:before { - content: "\e173"; -} -.glyphicon-floppy-remove:before { - content: "\e174"; -} -.glyphicon-floppy-save:before { - content: "\e175"; -} -.glyphicon-floppy-open:before { - content: "\e176"; -} -.glyphicon-credit-card:before { - content: "\e177"; -} -.glyphicon-transfer:before { - content: "\e178"; -} -.glyphicon-cutlery:before { - content: "\e179"; -} -.glyphicon-header:before { - content: "\e180"; -} -.glyphicon-compressed:before { - content: "\e181"; -} -.glyphicon-earphone:before { - content: "\e182"; -} -.glyphicon-phone-alt:before { - content: "\e183"; -} -.glyphicon-tower:before { - content: "\e184"; -} -.glyphicon-stats:before { - content: "\e185"; -} -.glyphicon-sd-video:before { - content: "\e186"; -} -.glyphicon-hd-video:before { - content: "\e187"; -} -.glyphicon-subtitles:before { - content: "\e188"; -} -.glyphicon-sound-stereo:before { - content: "\e189"; -} -.glyphicon-sound-dolby:before { - content: "\e190"; -} -.glyphicon-sound-5-1:before { - content: "\e191"; -} -.glyphicon-sound-6-1:before { - content: "\e192"; -} -.glyphicon-sound-7-1:before { - content: "\e193"; -} -.glyphicon-copyright-mark:before { - content: "\e194"; -} -.glyphicon-registration-mark:before { - content: "\e195"; -} -.glyphicon-cloud-download:before { - content: "\e197"; -} -.glyphicon-cloud-upload:before { - content: "\e198"; -} -.glyphicon-tree-conifer:before { - content: "\e199"; -} -.glyphicon-tree-deciduous:before { - content: "\e200"; -} -* { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -*:before, -*:after { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -html { - font-size: 10px; - - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} -body { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.42857143; - color: #333; - background-color: #fff; -} -input, -button, -select, -textarea { - font-family: inherit; - font-size: inherit; - line-height: inherit; -} -a { - color: #428bca; - text-decoration: none; -} -a:hover, -a:focus { - color: #2a6496; - text-decoration: underline; -} -a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -figure { - margin: 0; -} -img { - vertical-align: middle; -} -.img-responsive, -.thumbnail > img, -.thumbnail a > img, -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - width: 100% \9; - max-width: 100%; - height: auto; -} -.img-rounded { - border-radius: 6px; -} -.img-thumbnail { - display: inline-block; - width: 100% \9; - max-width: 100%; - height: auto; - padding: 4px; - line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; - -webkit-transition: all .2s ease-in-out; - -o-transition: all .2s ease-in-out; - transition: all .2s ease-in-out; -} -.img-circle { - border-radius: 50%; -} -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eee; -} -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; -} -.sr-only-focusable:active, -.sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; -} -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: inherit; - font-weight: 500; - line-height: 1.1; - color: inherit; -} -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small, -.h1 small, -.h2 small, -.h3 small, -.h4 small, -.h5 small, -.h6 small, -h1 .small, -h2 .small, -h3 .small, -h4 .small, -h5 .small, -h6 .small, -.h1 .small, -.h2 .small, -.h3 .small, -.h4 .small, -.h5 .small, -.h6 .small { - font-weight: normal; - line-height: 1; - color: #777; -} -h1, -.h1, -h2, -.h2, -h3, -.h3 { - margin-top: 20px; - margin-bottom: 10px; -} -h1 small, -.h1 small, -h2 small, -.h2 small, -h3 small, -.h3 small, -h1 .small, -.h1 .small, -h2 .small, -.h2 .small, -h3 .small, -.h3 .small { - font-size: 65%; -} -h4, -.h4, -h5, -.h5, -h6, -.h6 { - margin-top: 10px; - margin-bottom: 10px; -} -h4 small, -.h4 small, -h5 small, -.h5 small, -h6 small, -.h6 small, -h4 .small, -.h4 .small, -h5 .small, -.h5 .small, -h6 .small, -.h6 .small { - font-size: 75%; -} -h1, -.h1 { - font-size: 36px; -} -h2, -.h2 { - font-size: 30px; -} -h3, -.h3 { - font-size: 24px; -} -h4, -.h4 { - font-size: 18px; -} -h5, -.h5 { - font-size: 14px; -} -h6, -.h6 { - font-size: 12px; -} -p { - margin: 0 0 10px; -} -.lead { - margin-bottom: 20px; - font-size: 16px; - font-weight: 300; - line-height: 1.4; -} -@media (min-width: 768px) { - .lead { - font-size: 21px; - } -} -small, -.small { - font-size: 85%; -} -cite { - font-style: normal; -} -mark, -.mark { - padding: .2em; - background-color: #fcf8e3; -} -.text-left { - text-align: left; -} -.text-right { - text-align: right; -} -.text-center { - text-align: center; -} -.text-justify { - text-align: justify; -} -.text-nowrap { - white-space: nowrap; -} -.text-lowercase { - text-transform: lowercase; -} -.text-uppercase { - text-transform: uppercase; -} -.text-capitalize { - text-transform: capitalize; -} -.text-muted { - color: #777; -} -.text-primary { - color: #428bca; -} -a.text-primary:hover { - color: #3071a9; -} -.text-success { - color: #3c763d; -} -a.text-success:hover { - color: #2b542c; -} -.text-info { - color: #31708f; -} -a.text-info:hover { - color: #245269; -} -.text-warning { - color: #8a6d3b; -} -a.text-warning:hover { - color: #66512c; -} -.text-danger { - color: #a94442; -} -a.text-danger:hover { - color: #843534; -} -.bg-primary { - color: #fff; - background-color: #428bca; -} -a.bg-primary:hover { - background-color: #3071a9; -} -.bg-success { - background-color: #dff0d8; -} -a.bg-success:hover { - background-color: #c1e2b3; -} -.bg-info { - background-color: #d9edf7; -} -a.bg-info:hover { - background-color: #afd9ee; -} -.bg-warning { - background-color: #fcf8e3; -} -a.bg-warning:hover { - background-color: #f7ecb5; -} -.bg-danger { - background-color: #f2dede; -} -a.bg-danger:hover { - background-color: #e4b9b9; -} -.page-header { - padding-bottom: 9px; - margin: 40px 0 20px; - border-bottom: 1px solid #eee; -} -ul, -ol { - margin-top: 0; - margin-bottom: 10px; -} -ul ul, -ol ul, -ul ol, -ol ol { - margin-bottom: 0; -} -.list-unstyled { - padding-left: 0; - list-style: none; -} -.list-inline { - padding-left: 0; - margin-left: -5px; - list-style: none; -} -.list-inline > li { - display: inline-block; - padding-right: 5px; - padding-left: 5px; -} -dl { - margin-top: 0; - margin-bottom: 20px; -} -dt, -dd { - line-height: 1.42857143; -} -dt { - font-weight: bold; -} -dd { - margin-left: 0; -} -@media (min-width: 768px) { - .dl-horizontal dt { - float: left; - width: 160px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; - } - .dl-horizontal dd { - margin-left: 180px; - } -} -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #777; -} -.initialism { - font-size: 90%; - text-transform: uppercase; -} -blockquote { - padding: 10px 20px; - margin: 0 0 20px; - font-size: 17.5px; - border-left: 5px solid #eee; -} -blockquote p:last-child, -blockquote ul:last-child, -blockquote ol:last-child { - margin-bottom: 0; -} -blockquote footer, -blockquote small, -blockquote .small { - display: block; - font-size: 80%; - line-height: 1.42857143; - color: #777; -} -blockquote footer:before, -blockquote small:before, -blockquote .small:before { - content: '\2014 \00A0'; -} -.blockquote-reverse, -blockquote.pull-right { - padding-right: 15px; - padding-left: 0; - text-align: right; - border-right: 5px solid #eee; - border-left: 0; -} -.blockquote-reverse footer:before, -blockquote.pull-right footer:before, -.blockquote-reverse small:before, -blockquote.pull-right small:before, -.blockquote-reverse .small:before, -blockquote.pull-right .small:before { - content: ''; -} -.blockquote-reverse footer:after, -blockquote.pull-right footer:after, -.blockquote-reverse small:after, -blockquote.pull-right small:after, -.blockquote-reverse .small:after, -blockquote.pull-right .small:after { - content: '\00A0 \2014'; -} -blockquote:before, -blockquote:after { - content: ""; -} -address { - margin-bottom: 20px; - font-style: normal; - line-height: 1.42857143; -} -code, -kbd, -pre, -samp { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; -} -code { - padding: 2px 4px; - font-size: 90%; - color: #c7254e; - background-color: #f9f2f4; - border-radius: 4px; -} -kbd { - padding: 2px 4px; - font-size: 90%; - color: #fff; - background-color: #333; - border-radius: 3px; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); -} -kbd kbd { - padding: 0; - font-size: 100%; - -webkit-box-shadow: none; - box-shadow: none; -} -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 1.42857143; - color: #333; - word-break: break-all; - word-wrap: break-word; - background-color: #f5f5f5; - border: 1px solid #ccc; - border-radius: 4px; -} -pre code { - padding: 0; - font-size: inherit; - color: inherit; - white-space: pre-wrap; - background-color: transparent; - border-radius: 0; -} -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} -.container { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} -@media (min-width: 768px) { - .container { - width: 750px; - } -} -@media (min-width: 992px) { - .container { - width: 970px; - } -} -@media (min-width: 1200px) { - .container { - width: 1170px; - } -} -.container-fluid { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} -.row { - margin-right: -15px; - margin-left: -15px; -} -.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; -} -.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { - float: left; -} -.col-xs-12 { - width: 100%; -} -.col-xs-11 { - width: 91.66666667%; -} -.col-xs-10 { - width: 83.33333333%; -} -.col-xs-9 { - width: 75%; -} -.col-xs-8 { - width: 66.66666667%; -} -.col-xs-7 { - width: 58.33333333%; -} -.col-xs-6 { - width: 50%; -} -.col-xs-5 { - width: 41.66666667%; -} -.col-xs-4 { - width: 33.33333333%; -} -.col-xs-3 { - width: 25%; -} -.col-xs-2 { - width: 16.66666667%; -} -.col-xs-1 { - width: 8.33333333%; -} -.col-xs-pull-12 { - right: 100%; -} -.col-xs-pull-11 { - right: 91.66666667%; -} -.col-xs-pull-10 { - right: 83.33333333%; -} -.col-xs-pull-9 { - right: 75%; -} -.col-xs-pull-8 { - right: 66.66666667%; -} -.col-xs-pull-7 { - right: 58.33333333%; -} -.col-xs-pull-6 { - right: 50%; -} -.col-xs-pull-5 { - right: 41.66666667%; -} -.col-xs-pull-4 { - right: 33.33333333%; -} -.col-xs-pull-3 { - right: 25%; -} -.col-xs-pull-2 { - right: 16.66666667%; -} -.col-xs-pull-1 { - right: 8.33333333%; -} -.col-xs-pull-0 { - right: auto; -} -.col-xs-push-12 { - left: 100%; -} -.col-xs-push-11 { - left: 91.66666667%; -} -.col-xs-push-10 { - left: 83.33333333%; -} -.col-xs-push-9 { - left: 75%; -} -.col-xs-push-8 { - left: 66.66666667%; -} -.col-xs-push-7 { - left: 58.33333333%; -} -.col-xs-push-6 { - left: 50%; -} -.col-xs-push-5 { - left: 41.66666667%; -} -.col-xs-push-4 { - left: 33.33333333%; -} -.col-xs-push-3 { - left: 25%; -} -.col-xs-push-2 { - left: 16.66666667%; -} -.col-xs-push-1 { - left: 8.33333333%; -} -.col-xs-push-0 { - left: auto; -} -.col-xs-offset-12 { - margin-left: 100%; -} -.col-xs-offset-11 { - margin-left: 91.66666667%; -} -.col-xs-offset-10 { - margin-left: 83.33333333%; -} -.col-xs-offset-9 { - margin-left: 75%; -} -.col-xs-offset-8 { - margin-left: 66.66666667%; -} -.col-xs-offset-7 { - margin-left: 58.33333333%; -} -.col-xs-offset-6 { - margin-left: 50%; -} -.col-xs-offset-5 { - margin-left: 41.66666667%; -} -.col-xs-offset-4 { - margin-left: 33.33333333%; -} -.col-xs-offset-3 { - margin-left: 25%; -} -.col-xs-offset-2 { - margin-left: 16.66666667%; -} -.col-xs-offset-1 { - margin-left: 8.33333333%; -} -.col-xs-offset-0 { - margin-left: 0; -} -@media (min-width: 768px) { - .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { - float: left; - } - .col-sm-12 { - width: 100%; - } - .col-sm-11 { - width: 91.66666667%; - } - .col-sm-10 { - width: 83.33333333%; - } - .col-sm-9 { - width: 75%; - } - .col-sm-8 { - width: 66.66666667%; - } - .col-sm-7 { - width: 58.33333333%; - } - .col-sm-6 { - width: 50%; - } - .col-sm-5 { - width: 41.66666667%; - } - .col-sm-4 { - width: 33.33333333%; - } - .col-sm-3 { - width: 25%; - } - .col-sm-2 { - width: 16.66666667%; - } - .col-sm-1 { - width: 8.33333333%; - } - .col-sm-pull-12 { - right: 100%; - } - .col-sm-pull-11 { - right: 91.66666667%; - } - .col-sm-pull-10 { - right: 83.33333333%; - } - .col-sm-pull-9 { - right: 75%; - } - .col-sm-pull-8 { - right: 66.66666667%; - } - .col-sm-pull-7 { - right: 58.33333333%; - } - .col-sm-pull-6 { - right: 50%; - } - .col-sm-pull-5 { - right: 41.66666667%; - } - .col-sm-pull-4 { - right: 33.33333333%; - } - .col-sm-pull-3 { - right: 25%; - } - .col-sm-pull-2 { - right: 16.66666667%; - } - .col-sm-pull-1 { - right: 8.33333333%; - } - .col-sm-pull-0 { - right: auto; - } - .col-sm-push-12 { - left: 100%; - } - .col-sm-push-11 { - left: 91.66666667%; - } - .col-sm-push-10 { - left: 83.33333333%; - } - .col-sm-push-9 { - left: 75%; - } - .col-sm-push-8 { - left: 66.66666667%; - } - .col-sm-push-7 { - left: 58.33333333%; - } - .col-sm-push-6 { - left: 50%; - } - .col-sm-push-5 { - left: 41.66666667%; - } - .col-sm-push-4 { - left: 33.33333333%; - } - .col-sm-push-3 { - left: 25%; - } - .col-sm-push-2 { - left: 16.66666667%; - } - .col-sm-push-1 { - left: 8.33333333%; - } - .col-sm-push-0 { - left: auto; - } - .col-sm-offset-12 { - margin-left: 100%; - } - .col-sm-offset-11 { - margin-left: 91.66666667%; - } - .col-sm-offset-10 { - margin-left: 83.33333333%; - } - .col-sm-offset-9 { - margin-left: 75%; - } - .col-sm-offset-8 { - margin-left: 66.66666667%; - } - .col-sm-offset-7 { - margin-left: 58.33333333%; - } - .col-sm-offset-6 { - margin-left: 50%; - } - .col-sm-offset-5 { - margin-left: 41.66666667%; - } - .col-sm-offset-4 { - margin-left: 33.33333333%; - } - .col-sm-offset-3 { - margin-left: 25%; - } - .col-sm-offset-2 { - margin-left: 16.66666667%; - } - .col-sm-offset-1 { - margin-left: 8.33333333%; - } - .col-sm-offset-0 { - margin-left: 0; - } -} -@media (min-width: 992px) { - .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { - float: left; - } - .col-md-12 { - width: 100%; - } - .col-md-11 { - width: 91.66666667%; - } - .col-md-10 { - width: 83.33333333%; - } - .col-md-9 { - width: 75%; - } - .col-md-8 { - width: 66.66666667%; - } - .col-md-7 { - width: 58.33333333%; - } - .col-md-6 { - width: 50%; - } - .col-md-5 { - width: 41.66666667%; - } - .col-md-4 { - width: 33.33333333%; - } - .col-md-3 { - width: 25%; - } - .col-md-2 { - width: 16.66666667%; - } - .col-md-1 { - width: 8.33333333%; - } - .col-md-pull-12 { - right: 100%; - } - .col-md-pull-11 { - right: 91.66666667%; - } - .col-md-pull-10 { - right: 83.33333333%; - } - .col-md-pull-9 { - right: 75%; - } - .col-md-pull-8 { - right: 66.66666667%; - } - .col-md-pull-7 { - right: 58.33333333%; - } - .col-md-pull-6 { - right: 50%; - } - .col-md-pull-5 { - right: 41.66666667%; - } - .col-md-pull-4 { - right: 33.33333333%; - } - .col-md-pull-3 { - right: 25%; - } - .col-md-pull-2 { - right: 16.66666667%; - } - .col-md-pull-1 { - right: 8.33333333%; - } - .col-md-pull-0 { - right: auto; - } - .col-md-push-12 { - left: 100%; - } - .col-md-push-11 { - left: 91.66666667%; - } - .col-md-push-10 { - left: 83.33333333%; - } - .col-md-push-9 { - left: 75%; - } - .col-md-push-8 { - left: 66.66666667%; - } - .col-md-push-7 { - left: 58.33333333%; - } - .col-md-push-6 { - left: 50%; - } - .col-md-push-5 { - left: 41.66666667%; - } - .col-md-push-4 { - left: 33.33333333%; - } - .col-md-push-3 { - left: 25%; - } - .col-md-push-2 { - left: 16.66666667%; - } - .col-md-push-1 { - left: 8.33333333%; - } - .col-md-push-0 { - left: auto; - } - .col-md-offset-12 { - margin-left: 100%; - } - .col-md-offset-11 { - margin-left: 91.66666667%; - } - .col-md-offset-10 { - margin-left: 83.33333333%; - } - .col-md-offset-9 { - margin-left: 75%; - } - .col-md-offset-8 { - margin-left: 66.66666667%; - } - .col-md-offset-7 { - margin-left: 58.33333333%; - } - .col-md-offset-6 { - margin-left: 50%; - } - .col-md-offset-5 { - margin-left: 41.66666667%; - } - .col-md-offset-4 { - margin-left: 33.33333333%; - } - .col-md-offset-3 { - margin-left: 25%; - } - .col-md-offset-2 { - margin-left: 16.66666667%; - } - .col-md-offset-1 { - margin-left: 8.33333333%; - } - .col-md-offset-0 { - margin-left: 0; - } -} -@media (min-width: 1200px) { - .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { - float: left; - } - .col-lg-12 { - width: 100%; - } - .col-lg-11 { - width: 91.66666667%; - } - .col-lg-10 { - width: 83.33333333%; - } - .col-lg-9 { - width: 75%; - } - .col-lg-8 { - width: 66.66666667%; - } - .col-lg-7 { - width: 58.33333333%; - } - .col-lg-6 { - width: 50%; - } - .col-lg-5 { - width: 41.66666667%; - } - .col-lg-4 { - width: 33.33333333%; - } - .col-lg-3 { - width: 25%; - } - .col-lg-2 { - width: 16.66666667%; - } - .col-lg-1 { - width: 8.33333333%; - } - .col-lg-pull-12 { - right: 100%; - } - .col-lg-pull-11 { - right: 91.66666667%; - } - .col-lg-pull-10 { - right: 83.33333333%; - } - .col-lg-pull-9 { - right: 75%; - } - .col-lg-pull-8 { - right: 66.66666667%; - } - .col-lg-pull-7 { - right: 58.33333333%; - } - .col-lg-pull-6 { - right: 50%; - } - .col-lg-pull-5 { - right: 41.66666667%; - } - .col-lg-pull-4 { - right: 33.33333333%; - } - .col-lg-pull-3 { - right: 25%; - } - .col-lg-pull-2 { - right: 16.66666667%; - } - .col-lg-pull-1 { - right: 8.33333333%; - } - .col-lg-pull-0 { - right: auto; - } - .col-lg-push-12 { - left: 100%; - } - .col-lg-push-11 { - left: 91.66666667%; - } - .col-lg-push-10 { - left: 83.33333333%; - } - .col-lg-push-9 { - left: 75%; - } - .col-lg-push-8 { - left: 66.66666667%; - } - .col-lg-push-7 { - left: 58.33333333%; - } - .col-lg-push-6 { - left: 50%; - } - .col-lg-push-5 { - left: 41.66666667%; - } - .col-lg-push-4 { - left: 33.33333333%; - } - .col-lg-push-3 { - left: 25%; - } - .col-lg-push-2 { - left: 16.66666667%; - } - .col-lg-push-1 { - left: 8.33333333%; - } - .col-lg-push-0 { - left: auto; - } - .col-lg-offset-12 { - margin-left: 100%; - } - .col-lg-offset-11 { - margin-left: 91.66666667%; - } - .col-lg-offset-10 { - margin-left: 83.33333333%; - } - .col-lg-offset-9 { - margin-left: 75%; - } - .col-lg-offset-8 { - margin-left: 66.66666667%; - } - .col-lg-offset-7 { - margin-left: 58.33333333%; - } - .col-lg-offset-6 { - margin-left: 50%; - } - .col-lg-offset-5 { - margin-left: 41.66666667%; - } - .col-lg-offset-4 { - margin-left: 33.33333333%; - } - .col-lg-offset-3 { - margin-left: 25%; - } - .col-lg-offset-2 { - margin-left: 16.66666667%; - } - .col-lg-offset-1 { - margin-left: 8.33333333%; - } - .col-lg-offset-0 { - margin-left: 0; - } -} -table { - background-color: transparent; -} -th { - text-align: left; -} -.table { - width: 100%; - max-width: 100%; - margin-bottom: 20px; -} -.table > thead > tr > th, -.table > tbody > tr > th, -.table > tfoot > tr > th, -.table > thead > tr > td, -.table > tbody > tr > td, -.table > tfoot > tr > td { - padding: 8px; - line-height: 1.42857143; - vertical-align: top; - border-top: 1px solid #ddd; -} -.table > thead > tr > th { - vertical-align: bottom; - border-bottom: 2px solid #ddd; -} -.table > caption + thead > tr:first-child > th, -.table > colgroup + thead > tr:first-child > th, -.table > thead:first-child > tr:first-child > th, -.table > caption + thead > tr:first-child > td, -.table > colgroup + thead > tr:first-child > td, -.table > thead:first-child > tr:first-child > td { - border-top: 0; -} -.table > tbody + tbody { - border-top: 2px solid #ddd; -} -.table .table { - background-color: #fff; -} -.table-condensed > thead > tr > th, -.table-condensed > tbody > tr > th, -.table-condensed > tfoot > tr > th, -.table-condensed > thead > tr > td, -.table-condensed > tbody > tr > td, -.table-condensed > tfoot > tr > td { - padding: 5px; -} -.table-bordered { - border: 1px solid #ddd; -} -.table-bordered > thead > tr > th, -.table-bordered > tbody > tr > th, -.table-bordered > tfoot > tr > th, -.table-bordered > thead > tr > td, -.table-bordered > tbody > tr > td, -.table-bordered > tfoot > tr > td { - border: 1px solid #ddd; -} -.table-bordered > thead > tr > th, -.table-bordered > thead > tr > td { - border-bottom-width: 2px; -} -.table-striped > tbody > tr:nth-child(odd) > td, -.table-striped > tbody > tr:nth-child(odd) > th { - background-color: #f9f9f9; -} -.table-hover > tbody > tr:hover > td, -.table-hover > tbody > tr:hover > th { - background-color: #f5f5f5; -} -table col[class*="col-"] { - position: static; - display: table-column; - float: none; -} -table td[class*="col-"], -table th[class*="col-"] { - position: static; - display: table-cell; - float: none; -} -.table > thead > tr > td.active, -.table > tbody > tr > td.active, -.table > tfoot > tr > td.active, -.table > thead > tr > th.active, -.table > tbody > tr > th.active, -.table > tfoot > tr > th.active, -.table > thead > tr.active > td, -.table > tbody > tr.active > td, -.table > tfoot > tr.active > td, -.table > thead > tr.active > th, -.table > tbody > tr.active > th, -.table > tfoot > tr.active > th { - background-color: #f5f5f5; -} -.table-hover > tbody > tr > td.active:hover, -.table-hover > tbody > tr > th.active:hover, -.table-hover > tbody > tr.active:hover > td, -.table-hover > tbody > tr:hover > .active, -.table-hover > tbody > tr.active:hover > th { - background-color: #e8e8e8; -} -.table > thead > tr > td.success, -.table > tbody > tr > td.success, -.table > tfoot > tr > td.success, -.table > thead > tr > th.success, -.table > tbody > tr > th.success, -.table > tfoot > tr > th.success, -.table > thead > tr.success > td, -.table > tbody > tr.success > td, -.table > tfoot > tr.success > td, -.table > thead > tr.success > th, -.table > tbody > tr.success > th, -.table > tfoot > tr.success > th { - background-color: #dff0d8; -} -.table-hover > tbody > tr > td.success:hover, -.table-hover > tbody > tr > th.success:hover, -.table-hover > tbody > tr.success:hover > td, -.table-hover > tbody > tr:hover > .success, -.table-hover > tbody > tr.success:hover > th { - background-color: #d0e9c6; -} -.table > thead > tr > td.info, -.table > tbody > tr > td.info, -.table > tfoot > tr > td.info, -.table > thead > tr > th.info, -.table > tbody > tr > th.info, -.table > tfoot > tr > th.info, -.table > thead > tr.info > td, -.table > tbody > tr.info > td, -.table > tfoot > tr.info > td, -.table > thead > tr.info > th, -.table > tbody > tr.info > th, -.table > tfoot > tr.info > th { - background-color: #d9edf7; -} -.table-hover > tbody > tr > td.info:hover, -.table-hover > tbody > tr > th.info:hover, -.table-hover > tbody > tr.info:hover > td, -.table-hover > tbody > tr:hover > .info, -.table-hover > tbody > tr.info:hover > th { - background-color: #c4e3f3; -} -.table > thead > tr > td.warning, -.table > tbody > tr > td.warning, -.table > tfoot > tr > td.warning, -.table > thead > tr > th.warning, -.table > tbody > tr > th.warning, -.table > tfoot > tr > th.warning, -.table > thead > tr.warning > td, -.table > tbody > tr.warning > td, -.table > tfoot > tr.warning > td, -.table > thead > tr.warning > th, -.table > tbody > tr.warning > th, -.table > tfoot > tr.warning > th { - background-color: #fcf8e3; -} -.table-hover > tbody > tr > td.warning:hover, -.table-hover > tbody > tr > th.warning:hover, -.table-hover > tbody > tr.warning:hover > td, -.table-hover > tbody > tr:hover > .warning, -.table-hover > tbody > tr.warning:hover > th { - background-color: #faf2cc; -} -.table > thead > tr > td.danger, -.table > tbody > tr > td.danger, -.table > tfoot > tr > td.danger, -.table > thead > tr > th.danger, -.table > tbody > tr > th.danger, -.table > tfoot > tr > th.danger, -.table > thead > tr.danger > td, -.table > tbody > tr.danger > td, -.table > tfoot > tr.danger > td, -.table > thead > tr.danger > th, -.table > tbody > tr.danger > th, -.table > tfoot > tr.danger > th { - background-color: #f2dede; -} -.table-hover > tbody > tr > td.danger:hover, -.table-hover > tbody > tr > th.danger:hover, -.table-hover > tbody > tr.danger:hover > td, -.table-hover > tbody > tr:hover > .danger, -.table-hover > tbody > tr.danger:hover > th { - background-color: #ebcccc; -} -@media screen and (max-width: 767px) { - .table-responsive { - width: 100%; - margin-bottom: 15px; - overflow-x: auto; - overflow-y: hidden; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar; - border: 1px solid #ddd; - } - .table-responsive > .table { - margin-bottom: 0; - } - .table-responsive > .table > thead > tr > th, - .table-responsive > .table > tbody > tr > th, - .table-responsive > .table > tfoot > tr > th, - .table-responsive > .table > thead > tr > td, - .table-responsive > .table > tbody > tr > td, - .table-responsive > .table > tfoot > tr > td { - white-space: nowrap; - } - .table-responsive > .table-bordered { - border: 0; - } - .table-responsive > .table-bordered > thead > tr > th:first-child, - .table-responsive > .table-bordered > tbody > tr > th:first-child, - .table-responsive > .table-bordered > tfoot > tr > th:first-child, - .table-responsive > .table-bordered > thead > tr > td:first-child, - .table-responsive > .table-bordered > tbody > tr > td:first-child, - .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; - } - .table-responsive > .table-bordered > thead > tr > th:last-child, - .table-responsive > .table-bordered > tbody > tr > th:last-child, - .table-responsive > .table-bordered > tfoot > tr > th:last-child, - .table-responsive > .table-bordered > thead > tr > td:last-child, - .table-responsive > .table-bordered > tbody > tr > td:last-child, - .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; - } - .table-responsive > .table-bordered > tbody > tr:last-child > th, - .table-responsive > .table-bordered > tfoot > tr:last-child > th, - .table-responsive > .table-bordered > tbody > tr:last-child > td, - .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0; - } -} -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; -} -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: inherit; - color: #333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} -label { - display: inline-block; - max-width: 100%; - margin-bottom: 5px; - font-weight: bold; -} -input[type="search"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - line-height: normal; -} -input[type="file"] { - display: block; -} -input[type="range"] { - display: block; - width: 100%; -} -select[multiple], -select[size] { - height: auto; -} -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -output { - display: block; - padding-top: 7px; - font-size: 14px; - line-height: 1.42857143; - color: #555; -} -.form-control { - display: block; - width: 100%; - height: 34px; - padding: 6px 12px; - font-size: 14px; - line-height: 1.42857143; - color: #555; - background-color: #fff; - background-image: none; - border: 1px solid #ccc; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; - -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; - transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; -} -.form-control:focus { - border-color: #66afe9; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); -} -.form-control::-moz-placeholder { - color: #777; - opacity: 1; -} -.form-control:-ms-input-placeholder { - color: #777; -} -.form-control::-webkit-input-placeholder { - color: #777; -} -.form-control[disabled], -.form-control[readonly], -fieldset[disabled] .form-control { - cursor: not-allowed; - background-color: #eee; - opacity: 1; -} -textarea.form-control { - height: auto; -} -input[type="search"] { - -webkit-appearance: none; -} -input[type="date"], -input[type="time"], -input[type="datetime-local"], -input[type="month"] { - line-height: 34px; - line-height: 1.42857143 \0; -} -input[type="date"].input-sm, -input[type="time"].input-sm, -input[type="datetime-local"].input-sm, -input[type="month"].input-sm { - line-height: 30px; -} -input[type="date"].input-lg, -input[type="time"].input-lg, -input[type="datetime-local"].input-lg, -input[type="month"].input-lg { - line-height: 46px; -} -.form-group { - margin-bottom: 15px; -} -.radio, -.checkbox { - position: relative; - display: block; - min-height: 20px; - margin-top: 10px; - margin-bottom: 10px; -} -.radio label, -.checkbox label { - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - cursor: pointer; -} -.radio input[type="radio"], -.radio-inline input[type="radio"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - position: absolute; - margin-top: 4px \9; - margin-left: -20px; -} -.radio + .radio, -.checkbox + .checkbox { - margin-top: -5px; -} -.radio-inline, -.checkbox-inline { - display: inline-block; - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - vertical-align: middle; - cursor: pointer; -} -.radio-inline + .radio-inline, -.checkbox-inline + .checkbox-inline { - margin-top: 0; - margin-left: 10px; -} -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"].disabled, -input[type="checkbox"].disabled, -fieldset[disabled] input[type="radio"], -fieldset[disabled] input[type="checkbox"] { - cursor: not-allowed; -} -.radio-inline.disabled, -.checkbox-inline.disabled, -fieldset[disabled] .radio-inline, -fieldset[disabled] .checkbox-inline { - cursor: not-allowed; -} -.radio.disabled label, -.checkbox.disabled label, -fieldset[disabled] .radio label, -fieldset[disabled] .checkbox label { - cursor: not-allowed; -} -.form-control-static { - padding-top: 7px; - padding-bottom: 7px; - margin-bottom: 0; -} -.form-control-static.input-lg, -.form-control-static.input-sm { - padding-right: 0; - padding-left: 0; -} -.input-sm, -.form-horizontal .form-group-sm .form-control { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -select.input-sm { - height: 30px; - line-height: 30px; -} -textarea.input-sm, -select[multiple].input-sm { - height: auto; -} -.input-lg, -.form-horizontal .form-group-lg .form-control { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} -select.input-lg { - height: 46px; - line-height: 46px; -} -textarea.input-lg, -select[multiple].input-lg { - height: auto; -} -.has-feedback { - position: relative; -} -.has-feedback .form-control { - padding-right: 42.5px; -} -.form-control-feedback { - position: absolute; - top: 25px; - right: 0; - z-index: 2; - display: block; - width: 34px; - height: 34px; - line-height: 34px; - text-align: center; -} -.input-lg + .form-control-feedback { - width: 46px; - height: 46px; - line-height: 46px; -} -.input-sm + .form-control-feedback { - width: 30px; - height: 30px; - line-height: 30px; -} -.has-success .help-block, -.has-success .control-label, -.has-success .radio, -.has-success .checkbox, -.has-success .radio-inline, -.has-success .checkbox-inline { - color: #3c763d; -} -.has-success .form-control { - border-color: #3c763d; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-success .form-control:focus { - border-color: #2b542c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; -} -.has-success .input-group-addon { - color: #3c763d; - background-color: #dff0d8; - border-color: #3c763d; -} -.has-success .form-control-feedback { - color: #3c763d; -} -.has-warning .help-block, -.has-warning .control-label, -.has-warning .radio, -.has-warning .checkbox, -.has-warning .radio-inline, -.has-warning .checkbox-inline { - color: #8a6d3b; -} -.has-warning .form-control { - border-color: #8a6d3b; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-warning .form-control:focus { - border-color: #66512c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; -} -.has-warning .input-group-addon { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #8a6d3b; -} -.has-warning .form-control-feedback { - color: #8a6d3b; -} -.has-error .help-block, -.has-error .control-label, -.has-error .radio, -.has-error .checkbox, -.has-error .radio-inline, -.has-error .checkbox-inline { - color: #a94442; -} -.has-error .form-control { - border-color: #a94442; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-error .form-control:focus { - border-color: #843534; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; -} -.has-error .input-group-addon { - color: #a94442; - background-color: #f2dede; - border-color: #a94442; -} -.has-error .form-control-feedback { - color: #a94442; -} -.has-feedback label.sr-only ~ .form-control-feedback { - top: 0; -} -.help-block { - display: block; - margin-top: 5px; - margin-bottom: 10px; - color: #737373; -} -@media (min-width: 768px) { - .form-inline .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .form-inline .input-group { - display: inline-table; - vertical-align: middle; - } - .form-inline .input-group .input-group-addon, - .form-inline .input-group .input-group-btn, - .form-inline .input-group .form-control { - width: auto; - } - .form-inline .input-group > .form-control { - width: 100%; - } - .form-inline .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio, - .form-inline .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio label, - .form-inline .checkbox label { - padding-left: 0; - } - .form-inline .radio input[type="radio"], - .form-inline .checkbox input[type="checkbox"] { - position: relative; - margin-left: 0; - } - .form-inline .has-feedback .form-control-feedback { - top: 0; - } -} -.form-horizontal .radio, -.form-horizontal .checkbox, -.form-horizontal .radio-inline, -.form-horizontal .checkbox-inline { - padding-top: 7px; - margin-top: 0; - margin-bottom: 0; -} -.form-horizontal .radio, -.form-horizontal .checkbox { - min-height: 27px; -} -.form-horizontal .form-group { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .form-horizontal .control-label { - padding-top: 7px; - margin-bottom: 0; - text-align: right; - } -} -.form-horizontal .has-feedback .form-control-feedback { - top: 0; - right: 15px; -} -@media (min-width: 768px) { - .form-horizontal .form-group-lg .control-label { - padding-top: 14.3px; - } -} -@media (min-width: 768px) { - .form-horizontal .form-group-sm .control-label { - padding-top: 6px; - } -} -.btn { - display: inline-block; - padding: 6px 12px; - margin-bottom: 0; - font-size: 14px; - font-weight: normal; - line-height: 1.42857143; - text-align: center; - white-space: nowrap; - vertical-align: middle; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} -.btn:focus, -.btn:active:focus, -.btn.active:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.btn:hover, -.btn:focus { - color: #333; - text-decoration: none; -} -.btn:active, -.btn.active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn.disabled, -.btn[disabled], -fieldset[disabled] .btn { - pointer-events: none; - cursor: not-allowed; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - box-shadow: none; - opacity: .65; -} -.btn-default { - color: #333; - background-color: #fff; - border-color: #ccc; -} -.btn-default:hover, -.btn-default:focus, -.btn-default:active, -.btn-default.active, -.open > .dropdown-toggle.btn-default { - color: #333; - background-color: #e6e6e6; - border-color: #adadad; -} -.btn-default:active, -.btn-default.active, -.open > .dropdown-toggle.btn-default { - background-image: none; -} -.btn-default.disabled, -.btn-default[disabled], -fieldset[disabled] .btn-default, -.btn-default.disabled:hover, -.btn-default[disabled]:hover, -fieldset[disabled] .btn-default:hover, -.btn-default.disabled:focus, -.btn-default[disabled]:focus, -fieldset[disabled] .btn-default:focus, -.btn-default.disabled:active, -.btn-default[disabled]:active, -fieldset[disabled] .btn-default:active, -.btn-default.disabled.active, -.btn-default[disabled].active, -fieldset[disabled] .btn-default.active { - background-color: #fff; - border-color: #ccc; -} -.btn-default .badge { - color: #fff; - background-color: #333; -} -.btn-primary { - color: #fff; - background-color: #428bca; - border-color: #357ebd; -} -.btn-primary:hover, -.btn-primary:focus, -.btn-primary:active, -.btn-primary.active, -.open > .dropdown-toggle.btn-primary { - color: #fff; - background-color: #3071a9; - border-color: #285e8e; -} -.btn-primary:active, -.btn-primary.active, -.open > .dropdown-toggle.btn-primary { - background-image: none; -} -.btn-primary.disabled, -.btn-primary[disabled], -fieldset[disabled] .btn-primary, -.btn-primary.disabled:hover, -.btn-primary[disabled]:hover, -fieldset[disabled] .btn-primary:hover, -.btn-primary.disabled:focus, -.btn-primary[disabled]:focus, -fieldset[disabled] .btn-primary:focus, -.btn-primary.disabled:active, -.btn-primary[disabled]:active, -fieldset[disabled] .btn-primary:active, -.btn-primary.disabled.active, -.btn-primary[disabled].active, -fieldset[disabled] .btn-primary.active { - background-color: #428bca; - border-color: #357ebd; -} -.btn-primary .badge { - color: #428bca; - background-color: #fff; -} -.btn-success { - color: #fff; - background-color: #5cb85c; - border-color: #4cae4c; -} -.btn-success:hover, -.btn-success:focus, -.btn-success:active, -.btn-success.active, -.open > .dropdown-toggle.btn-success { - color: #fff; - background-color: #449d44; - border-color: #398439; -} -.btn-success:active, -.btn-success.active, -.open > .dropdown-toggle.btn-success { - background-image: none; -} -.btn-success.disabled, -.btn-success[disabled], -fieldset[disabled] .btn-success, -.btn-success.disabled:hover, -.btn-success[disabled]:hover, -fieldset[disabled] .btn-success:hover, -.btn-success.disabled:focus, -.btn-success[disabled]:focus, -fieldset[disabled] .btn-success:focus, -.btn-success.disabled:active, -.btn-success[disabled]:active, -fieldset[disabled] .btn-success:active, -.btn-success.disabled.active, -.btn-success[disabled].active, -fieldset[disabled] .btn-success.active { - background-color: #5cb85c; - border-color: #4cae4c; -} -.btn-success .badge { - color: #5cb85c; - background-color: #fff; -} -.btn-info { - color: #fff; - background-color: #5bc0de; - border-color: #46b8da; -} -.btn-info:hover, -.btn-info:focus, -.btn-info:active, -.btn-info.active, -.open > .dropdown-toggle.btn-info { - color: #fff; - background-color: #31b0d5; - border-color: #269abc; -} -.btn-info:active, -.btn-info.active, -.open > .dropdown-toggle.btn-info { - background-image: none; -} -.btn-info.disabled, -.btn-info[disabled], -fieldset[disabled] .btn-info, -.btn-info.disabled:hover, -.btn-info[disabled]:hover, -fieldset[disabled] .btn-info:hover, -.btn-info.disabled:focus, -.btn-info[disabled]:focus, -fieldset[disabled] .btn-info:focus, -.btn-info.disabled:active, -.btn-info[disabled]:active, -fieldset[disabled] .btn-info:active, -.btn-info.disabled.active, -.btn-info[disabled].active, -fieldset[disabled] .btn-info.active { - background-color: #5bc0de; - border-color: #46b8da; -} -.btn-info .badge { - color: #5bc0de; - background-color: #fff; -} -.btn-warning { - color: #fff; - background-color: #f0ad4e; - border-color: #eea236; -} -.btn-warning:hover, -.btn-warning:focus, -.btn-warning:active, -.btn-warning.active, -.open > .dropdown-toggle.btn-warning { - color: #fff; - background-color: #ec971f; - border-color: #d58512; -} -.btn-warning:active, -.btn-warning.active, -.open > .dropdown-toggle.btn-warning { - background-image: none; -} -.btn-warning.disabled, -.btn-warning[disabled], -fieldset[disabled] .btn-warning, -.btn-warning.disabled:hover, -.btn-warning[disabled]:hover, -fieldset[disabled] .btn-warning:hover, -.btn-warning.disabled:focus, -.btn-warning[disabled]:focus, -fieldset[disabled] .btn-warning:focus, -.btn-warning.disabled:active, -.btn-warning[disabled]:active, -fieldset[disabled] .btn-warning:active, -.btn-warning.disabled.active, -.btn-warning[disabled].active, -fieldset[disabled] .btn-warning.active { - background-color: #f0ad4e; - border-color: #eea236; -} -.btn-warning .badge { - color: #f0ad4e; - background-color: #fff; -} -.btn-danger { - color: #fff; - background-color: #d9534f; - border-color: #d43f3a; -} -.btn-danger:hover, -.btn-danger:focus, -.btn-danger:active, -.btn-danger.active, -.open > .dropdown-toggle.btn-danger { - color: #fff; - background-color: #c9302c; - border-color: #ac2925; -} -.btn-danger:active, -.btn-danger.active, -.open > .dropdown-toggle.btn-danger { - background-image: none; -} -.btn-danger.disabled, -.btn-danger[disabled], -fieldset[disabled] .btn-danger, -.btn-danger.disabled:hover, -.btn-danger[disabled]:hover, -fieldset[disabled] .btn-danger:hover, -.btn-danger.disabled:focus, -.btn-danger[disabled]:focus, -fieldset[disabled] .btn-danger:focus, -.btn-danger.disabled:active, -.btn-danger[disabled]:active, -fieldset[disabled] .btn-danger:active, -.btn-danger.disabled.active, -.btn-danger[disabled].active, -fieldset[disabled] .btn-danger.active { - background-color: #d9534f; - border-color: #d43f3a; -} -.btn-danger .badge { - color: #d9534f; - background-color: #fff; -} -.btn-link { - font-weight: normal; - color: #428bca; - cursor: pointer; - border-radius: 0; -} -.btn-link, -.btn-link:active, -.btn-link[disabled], -fieldset[disabled] .btn-link { - background-color: transparent; - -webkit-box-shadow: none; - box-shadow: none; -} -.btn-link, -.btn-link:hover, -.btn-link:focus, -.btn-link:active { - border-color: transparent; -} -.btn-link:hover, -.btn-link:focus { - color: #2a6496; - text-decoration: underline; - background-color: transparent; -} -.btn-link[disabled]:hover, -fieldset[disabled] .btn-link:hover, -.btn-link[disabled]:focus, -fieldset[disabled] .btn-link:focus { - color: #777; - text-decoration: none; -} -.btn-lg, -.btn-group-lg > .btn { - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} -.btn-sm, -.btn-group-sm > .btn { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.btn-xs, -.btn-group-xs > .btn { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.btn-block { - display: block; - width: 100%; -} -.btn-block + .btn-block { - margin-top: 5px; -} -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} -.fade { - opacity: 0; - -webkit-transition: opacity .15s linear; - -o-transition: opacity .15s linear; - transition: opacity .15s linear; -} -.fade.in { - opacity: 1; -} -.collapse { - display: none; -} -.collapse.in { - display: block; -} -tr.collapse.in { - display: table-row; -} -tbody.collapse.in { - display: table-row-group; -} -.collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height .35s ease; - -o-transition: height .35s ease; - transition: height .35s ease; -} -.caret { - display: inline-block; - width: 0; - height: 0; - margin-left: 2px; - vertical-align: middle; - border-top: 4px solid; - border-right: 4px solid transparent; - border-left: 4px solid transparent; -} -.dropdown { - position: relative; -} -.dropdown-toggle:focus { - outline: 0; -} -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - font-size: 14px; - text-align: left; - list-style: none; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, .15); - border-radius: 4px; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); - box-shadow: 0 6px 12px rgba(0, 0, 0, .175); -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 1.42857143; - color: #333; - white-space: nowrap; -} -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - color: #262626; - text-decoration: none; - background-color: #f5f5f5; -} -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #fff; - text-decoration: none; - background-color: #428bca; - outline: 0; -} -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #777; -} -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - cursor: not-allowed; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.open > .dropdown-menu { - display: block; -} -.open > a { - outline: 0; -} -.dropdown-menu-right { - right: 0; - left: auto; -} -.dropdown-menu-left { - right: auto; - left: 0; -} -.dropdown-header { - display: block; - padding: 3px 20px; - font-size: 12px; - line-height: 1.42857143; - color: #777; - white-space: nowrap; -} -.dropdown-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 990; -} -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - content: ""; - border-top: 0; - border-bottom: 4px solid; -} -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} -@media (min-width: 768px) { - .navbar-right .dropdown-menu { - right: 0; - left: auto; - } - .navbar-right .dropdown-menu-left { - right: auto; - left: 0; - } -} -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-block; - vertical-align: middle; -} -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - float: left; -} -.btn-group > .btn:hover, -.btn-group-vertical > .btn:hover, -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus, -.btn-group > .btn:active, -.btn-group-vertical > .btn:active, -.btn-group > .btn.active, -.btn-group-vertical > .btn.active { - z-index: 2; -} -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus { - outline: 0; -} -.btn-group .btn + .btn, -.btn-group .btn + .btn-group, -.btn-group .btn-group + .btn, -.btn-group .btn-group + .btn-group { - margin-left: -1px; -} -.btn-toolbar { - margin-left: -5px; -} -.btn-toolbar .btn-group, -.btn-toolbar .input-group { - float: left; -} -.btn-toolbar > .btn, -.btn-toolbar > .btn-group, -.btn-toolbar > .input-group { - margin-left: 5px; -} -.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0; -} -.btn-group > .btn:first-child { - margin-left: 0; -} -.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn:last-child:not(:first-child), -.btn-group > .dropdown-toggle:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group > .btn-group { - float: left; -} -.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group > .btn-group:first-child > .btn:last-child, -.btn-group > .btn-group:first-child > .dropdown-toggle { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn-group:last-child > .btn:first-child { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} -.btn-group > .btn + .dropdown-toggle { - padding-right: 8px; - padding-left: 8px; -} -.btn-group > .btn-lg + .dropdown-toggle { - padding-right: 12px; - padding-left: 12px; -} -.btn-group.open .dropdown-toggle { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn-group.open .dropdown-toggle.btn-link { - -webkit-box-shadow: none; - box-shadow: none; -} -.btn .caret { - margin-left: 0; -} -.btn-lg .caret { - border-width: 5px 5px 0; - border-bottom-width: 0; -} -.dropup .btn-lg .caret { - border-width: 0 5px 5px; -} -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group, -.btn-group-vertical > .btn-group > .btn { - display: block; - float: none; - width: 100%; - max-width: 100%; -} -.btn-group-vertical > .btn-group > .btn { - float: none; -} -.btn-group-vertical > .btn + .btn, -.btn-group-vertical > .btn + .btn-group, -.btn-group-vertical > .btn-group + .btn, -.btn-group-vertical > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; -} -.btn-group-vertical > .btn:not(:first-child):not(:last-child) { - border-radius: 0; -} -.btn-group-vertical > .btn:first-child:not(:last-child) { - border-top-right-radius: 4px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn:last-child:not(:first-child) { - border-top-left-radius: 0; - border-top-right-radius: 0; - border-bottom-left-radius: 4px; -} -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.btn-group-justified { - display: table; - width: 100%; - table-layout: fixed; - border-collapse: separate; -} -.btn-group-justified > .btn, -.btn-group-justified > .btn-group { - display: table-cell; - float: none; - width: 1%; -} -.btn-group-justified > .btn-group .btn { - width: 100%; -} -.btn-group-justified > .btn-group .dropdown-menu { - left: auto; -} -[data-toggle="buttons"] > .btn > input[type="radio"], -[data-toggle="buttons"] > .btn > input[type="checkbox"] { - position: absolute; - z-index: -1; - filter: alpha(opacity=0); - opacity: 0; -} -.input-group { - position: relative; - display: table; - border-collapse: separate; -} -.input-group[class*="col-"] { - float: none; - padding-right: 0; - padding-left: 0; -} -.input-group .form-control { - position: relative; - z-index: 2; - float: left; - width: 100%; - margin-bottom: 0; -} -.input-group-lg > .form-control, -.input-group-lg > .input-group-addon, -.input-group-lg > .input-group-btn > .btn { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} -select.input-group-lg > .form-control, -select.input-group-lg > .input-group-addon, -select.input-group-lg > .input-group-btn > .btn { - height: 46px; - line-height: 46px; -} -textarea.input-group-lg > .form-control, -textarea.input-group-lg > .input-group-addon, -textarea.input-group-lg > .input-group-btn > .btn, -select[multiple].input-group-lg > .form-control, -select[multiple].input-group-lg > .input-group-addon, -select[multiple].input-group-lg > .input-group-btn > .btn { - height: auto; -} -.input-group-sm > .form-control, -.input-group-sm > .input-group-addon, -.input-group-sm > .input-group-btn > .btn { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -select.input-group-sm > .form-control, -select.input-group-sm > .input-group-addon, -select.input-group-sm > .input-group-btn > .btn { - height: 30px; - line-height: 30px; -} -textarea.input-group-sm > .form-control, -textarea.input-group-sm > .input-group-addon, -textarea.input-group-sm > .input-group-btn > .btn, -select[multiple].input-group-sm > .form-control, -select[multiple].input-group-sm > .input-group-addon, -select[multiple].input-group-sm > .input-group-btn > .btn { - height: auto; -} -.input-group-addon, -.input-group-btn, -.input-group .form-control { - display: table-cell; -} -.input-group-addon:not(:first-child):not(:last-child), -.input-group-btn:not(:first-child):not(:last-child), -.input-group .form-control:not(:first-child):not(:last-child) { - border-radius: 0; -} -.input-group-addon, -.input-group-btn { - width: 1%; - white-space: nowrap; - vertical-align: middle; -} -.input-group-addon { - padding: 6px 12px; - font-size: 14px; - font-weight: normal; - line-height: 1; - color: #555; - text-align: center; - background-color: #eee; - border: 1px solid #ccc; - border-radius: 4px; -} -.input-group-addon.input-sm { - padding: 5px 10px; - font-size: 12px; - border-radius: 3px; -} -.input-group-addon.input-lg { - padding: 10px 16px; - font-size: 18px; - border-radius: 6px; -} -.input-group-addon input[type="radio"], -.input-group-addon input[type="checkbox"] { - margin-top: 0; -} -.input-group .form-control:first-child, -.input-group-addon:first-child, -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group > .btn, -.input-group-btn:first-child > .dropdown-toggle, -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), -.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.input-group-addon:first-child { - border-right: 0; -} -.input-group .form-control:last-child, -.input-group-addon:last-child, -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group > .btn, -.input-group-btn:last-child > .dropdown-toggle, -.input-group-btn:first-child > .btn:not(:first-child), -.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.input-group-addon:last-child { - border-left: 0; -} -.input-group-btn { - position: relative; - font-size: 0; - white-space: nowrap; -} -.input-group-btn > .btn { - position: relative; -} -.input-group-btn > .btn + .btn { - margin-left: -1px; -} -.input-group-btn > .btn:hover, -.input-group-btn > .btn:focus, -.input-group-btn > .btn:active { - z-index: 2; -} -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group { - margin-right: -1px; -} -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group { - margin-left: -1px; -} -.nav { - padding-left: 0; - margin-bottom: 0; - list-style: none; -} -.nav > li { - position: relative; - display: block; -} -.nav > li > a { - position: relative; - display: block; - padding: 10px 15px; -} -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eee; -} -.nav > li.disabled > a { - color: #777; -} -.nav > li.disabled > a:hover, -.nav > li.disabled > a:focus { - color: #777; - text-decoration: none; - cursor: not-allowed; - background-color: transparent; -} -.nav .open > a, -.nav .open > a:hover, -.nav .open > a:focus { - background-color: #eee; - border-color: #428bca; -} -.nav .nav-divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.nav > li > a > img { - max-width: none; -} -.nav-tabs { - border-bottom: 1px solid #ddd; -} -.nav-tabs > li { - float: left; - margin-bottom: -1px; -} -.nav-tabs > li > a { - margin-right: 2px; - line-height: 1.42857143; - border: 1px solid transparent; - border-radius: 4px 4px 0 0; -} -.nav-tabs > li > a:hover { - border-color: #eee #eee #ddd; -} -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:hover, -.nav-tabs > li.active > a:focus { - color: #555; - cursor: default; - background-color: #fff; - border: 1px solid #ddd; - border-bottom-color: transparent; -} -.nav-tabs.nav-justified { - width: 100%; - border-bottom: 0; -} -.nav-tabs.nav-justified > li { - float: none; -} -.nav-tabs.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} -.nav-tabs.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-tabs.nav-justified > li > a { - margin-bottom: 0; - } -} -.nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 4px; -} -.nav-tabs.nav-justified > .active > a, -.nav-tabs.nav-justified > .active > a:hover, -.nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #ddd; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #ddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs.nav-justified > .active > a, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #fff; - } -} -.nav-pills > li { - float: left; -} -.nav-pills > li > a { - border-radius: 4px; -} -.nav-pills > li + li { - margin-left: 2px; -} -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - color: #fff; - background-color: #428bca; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; -} -.nav-justified { - width: 100%; -} -.nav-justified > li { - float: none; -} -.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} -.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-justified > li > a { - margin-bottom: 0; - } -} -.nav-tabs-justified { - border-bottom: 0; -} -.nav-tabs-justified > li > a { - margin-right: 0; - border-radius: 4px; -} -.nav-tabs-justified > .active > a, -.nav-tabs-justified > .active > a:hover, -.nav-tabs-justified > .active > a:focus { - border: 1px solid #ddd; -} -@media (min-width: 768px) { - .nav-tabs-justified > li > a { - border-bottom: 1px solid #ddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus { - border-bottom-color: #fff; - } -} -.tab-content > .tab-pane { - display: none; -} -.tab-content > .active { - display: block; -} -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.navbar { - position: relative; - min-height: 50px; - margin-bottom: 20px; - border: 1px solid transparent; -} -@media (min-width: 768px) { - .navbar { - border-radius: 4px; - } -} -@media (min-width: 768px) { - .navbar-header { - float: left; - } -} -.navbar-collapse { - padding-right: 15px; - padding-left: 15px; - overflow-x: visible; - -webkit-overflow-scrolling: touch; - border-top: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); -} -.navbar-collapse.in { - overflow-y: auto; -} -@media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - .navbar-collapse.in { - overflow-y: visible; - } - .navbar-fixed-top .navbar-collapse, - .navbar-static-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - padding-right: 0; - padding-left: 0; - } -} -.navbar-fixed-top .navbar-collapse, -.navbar-fixed-bottom .navbar-collapse { - max-height: 340px; -} -@media (max-width: 480px) and (orientation: landscape) { - .navbar-fixed-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - max-height: 200px; - } -} -.container > .navbar-header, -.container-fluid > .navbar-header, -.container > .navbar-collapse, -.container-fluid > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .container > .navbar-header, - .container-fluid > .navbar-header, - .container > .navbar-collapse, - .container-fluid > .navbar-collapse { - margin-right: 0; - margin-left: 0; - } -} -.navbar-static-top { - z-index: 1000; - border-width: 0 0 1px; -} -@media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; - } -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - -webkit-transform: translate3d(0, 0, 0); - -o-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -@media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } -} -.navbar-fixed-top { - top: 0; - border-width: 0 0 1px; -} -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; - border-width: 1px 0 0; -} -.navbar-brand { - float: left; - height: 50px; - padding: 15px 15px; - font-size: 18px; - line-height: 20px; -} -.navbar-brand:hover, -.navbar-brand:focus { - text-decoration: none; -} -@media (min-width: 768px) { - .navbar > .container .navbar-brand, - .navbar > .container-fluid .navbar-brand { - margin-left: -15px; - } -} -.navbar-toggle { - position: relative; - float: right; - padding: 9px 10px; - margin-top: 8px; - margin-right: 15px; - margin-bottom: 8px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} -.navbar-toggle:focus { - outline: 0; -} -.navbar-toggle .icon-bar { - display: block; - width: 22px; - height: 2px; - border-radius: 1px; -} -.navbar-toggle .icon-bar + .icon-bar { - margin-top: 4px; -} -@media (min-width: 768px) { - .navbar-toggle { - display: none; - } -} -.navbar-nav { - margin: 7.5px -15px; -} -.navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; -} -@media (max-width: 767px) { - .navbar-nav .open .dropdown-menu { - position: static; - float: none; - width: auto; - margin-top: 0; - background-color: transparent; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; - } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 20px; - } - .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; - } -} -@media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 15px; - padding-bottom: 15px; - } - .navbar-nav.navbar-right:last-child { - margin-right: -15px; - } -} -@media (min-width: 768px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - } -} -.navbar-form { - padding: 10px 15px; - margin-top: 8px; - margin-right: -15px; - margin-bottom: 8px; - margin-left: -15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); -} -@media (min-width: 768px) { - .navbar-form .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .navbar-form .input-group { - display: inline-table; - vertical-align: middle; - } - .navbar-form .input-group .input-group-addon, - .navbar-form .input-group .input-group-btn, - .navbar-form .input-group .form-control { - width: auto; - } - .navbar-form .input-group > .form-control { - width: 100%; - } - .navbar-form .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio, - .navbar-form .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio label, - .navbar-form .checkbox label { - padding-left: 0; - } - .navbar-form .radio input[type="radio"], - .navbar-form .checkbox input[type="checkbox"] { - position: relative; - margin-left: 0; - } - .navbar-form .has-feedback .form-control-feedback { - top: 0; - } -} -@media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; - } -} -@media (min-width: 768px) { - .navbar-form { - width: auto; - padding-top: 0; - padding-bottom: 0; - margin-right: 0; - margin-left: 0; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-form.navbar-right:last-child { - margin-right: -15px; - } -} -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.navbar-btn { - margin-top: 8px; - margin-bottom: 8px; -} -.navbar-btn.btn-sm { - margin-top: 10px; - margin-bottom: 10px; -} -.navbar-btn.btn-xs { - margin-top: 14px; - margin-bottom: 14px; -} -.navbar-text { - margin-top: 15px; - margin-bottom: 15px; -} -@media (min-width: 768px) { - .navbar-text { - float: left; - margin-right: 15px; - margin-left: 15px; - } - .navbar-text.navbar-right:last-child { - margin-right: 0; - } -} -.navbar-default { - background-color: #f8f8f8; - border-color: #e7e7e7; -} -.navbar-default .navbar-brand { - color: #777; -} -.navbar-default .navbar-brand:hover, -.navbar-default .navbar-brand:focus { - color: #5e5e5e; - background-color: transparent; -} -.navbar-default .navbar-text { - color: #777; -} -.navbar-default .navbar-nav > li > a { - color: #777; -} -.navbar-default .navbar-nav > li > a:hover, -.navbar-default .navbar-nav > li > a:focus { - color: #333; - background-color: transparent; -} -.navbar-default .navbar-nav > .active > a, -.navbar-default .navbar-nav > .active > a:hover, -.navbar-default .navbar-nav > .active > a:focus { - color: #555; - background-color: #e7e7e7; -} -.navbar-default .navbar-nav > .disabled > a, -.navbar-default .navbar-nav > .disabled > a:hover, -.navbar-default .navbar-nav > .disabled > a:focus { - color: #ccc; - background-color: transparent; -} -.navbar-default .navbar-toggle { - border-color: #ddd; -} -.navbar-default .navbar-toggle:hover, -.navbar-default .navbar-toggle:focus { - background-color: #ddd; -} -.navbar-default .navbar-toggle .icon-bar { - background-color: #888; -} -.navbar-default .navbar-collapse, -.navbar-default .navbar-form { - border-color: #e7e7e7; -} -.navbar-default .navbar-nav > .open > a, -.navbar-default .navbar-nav > .open > a:hover, -.navbar-default .navbar-nav > .open > a:focus { - color: #555; - background-color: #e7e7e7; -} -@media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #777; - } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #333; - background-color: transparent; - } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #555; - background-color: #e7e7e7; - } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #ccc; - background-color: transparent; - } -} -.navbar-default .navbar-link { - color: #777; -} -.navbar-default .navbar-link:hover { - color: #333; -} -.navbar-default .btn-link { - color: #777; -} -.navbar-default .btn-link:hover, -.navbar-default .btn-link:focus { - color: #333; -} -.navbar-default .btn-link[disabled]:hover, -fieldset[disabled] .navbar-default .btn-link:hover, -.navbar-default .btn-link[disabled]:focus, -fieldset[disabled] .navbar-default .btn-link:focus { - color: #ccc; -} -.navbar-inverse { - background-color: #222; - border-color: #080808; -} -.navbar-inverse .navbar-brand { - color: #777; -} -.navbar-inverse .navbar-brand:hover, -.navbar-inverse .navbar-brand:focus { - color: #fff; - background-color: transparent; -} -.navbar-inverse .navbar-text { - color: #777; -} -.navbar-inverse .navbar-nav > li > a { - color: #777; -} -.navbar-inverse .navbar-nav > li > a:hover, -.navbar-inverse .navbar-nav > li > a:focus { - color: #fff; - background-color: transparent; -} -.navbar-inverse .navbar-nav > .active > a, -.navbar-inverse .navbar-nav > .active > a:hover, -.navbar-inverse .navbar-nav > .active > a:focus { - color: #fff; - background-color: #080808; -} -.navbar-inverse .navbar-nav > .disabled > a, -.navbar-inverse .navbar-nav > .disabled > a:hover, -.navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444; - background-color: transparent; -} -.navbar-inverse .navbar-toggle { - border-color: #333; -} -.navbar-inverse .navbar-toggle:hover, -.navbar-inverse .navbar-toggle:focus { - background-color: #333; -} -.navbar-inverse .navbar-toggle .icon-bar { - background-color: #fff; -} -.navbar-inverse .navbar-collapse, -.navbar-inverse .navbar-form { - border-color: #101010; -} -.navbar-inverse .navbar-nav > .open > a, -.navbar-inverse .navbar-nav > .open > a:hover, -.navbar-inverse .navbar-nav > .open > a:focus { - color: #fff; - background-color: #080808; -} -@media (max-width: 767px) { - .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { - border-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu .divider { - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { - color: #777; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: #fff; - background-color: transparent; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #fff; - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444; - background-color: transparent; - } -} -.navbar-inverse .navbar-link { - color: #777; -} -.navbar-inverse .navbar-link:hover { - color: #fff; -} -.navbar-inverse .btn-link { - color: #777; -} -.navbar-inverse .btn-link:hover, -.navbar-inverse .btn-link:focus { - color: #fff; -} -.navbar-inverse .btn-link[disabled]:hover, -fieldset[disabled] .navbar-inverse .btn-link:hover, -.navbar-inverse .btn-link[disabled]:focus, -fieldset[disabled] .navbar-inverse .btn-link:focus { - color: #444; -} -.breadcrumb { - padding: 8px 15px; - margin-bottom: 20px; - list-style: none; - background-color: #f5f5f5; - border-radius: 4px; -} -.breadcrumb > li { - display: inline-block; -} -.breadcrumb > li + li:before { - padding: 0 5px; - color: #ccc; - content: "/\00a0"; -} -.breadcrumb > .active { - color: #777; -} -.pagination { - display: inline-block; - padding-left: 0; - margin: 20px 0; - border-radius: 4px; -} -.pagination > li { - display: inline; -} -.pagination > li > a, -.pagination > li > span { - position: relative; - float: left; - padding: 6px 12px; - margin-left: -1px; - line-height: 1.42857143; - color: #428bca; - text-decoration: none; - background-color: #fff; - border: 1px solid #ddd; -} -.pagination > li:first-child > a, -.pagination > li:first-child > span { - margin-left: 0; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; -} -.pagination > li:last-child > a, -.pagination > li:last-child > span { - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; -} -.pagination > li > a:hover, -.pagination > li > span:hover, -.pagination > li > a:focus, -.pagination > li > span:focus { - color: #2a6496; - background-color: #eee; - border-color: #ddd; -} -.pagination > .active > a, -.pagination > .active > span, -.pagination > .active > a:hover, -.pagination > .active > span:hover, -.pagination > .active > a:focus, -.pagination > .active > span:focus { - z-index: 2; - color: #fff; - cursor: default; - background-color: #428bca; - border-color: #428bca; -} -.pagination > .disabled > span, -.pagination > .disabled > span:hover, -.pagination > .disabled > span:focus, -.pagination > .disabled > a, -.pagination > .disabled > a:hover, -.pagination > .disabled > a:focus { - color: #777; - cursor: not-allowed; - background-color: #fff; - border-color: #ddd; -} -.pagination-lg > li > a, -.pagination-lg > li > span { - padding: 10px 16px; - font-size: 18px; -} -.pagination-lg > li:first-child > a, -.pagination-lg > li:first-child > span { - border-top-left-radius: 6px; - border-bottom-left-radius: 6px; -} -.pagination-lg > li:last-child > a, -.pagination-lg > li:last-child > span { - border-top-right-radius: 6px; - border-bottom-right-radius: 6px; -} -.pagination-sm > li > a, -.pagination-sm > li > span { - padding: 5px 10px; - font-size: 12px; -} -.pagination-sm > li:first-child > a, -.pagination-sm > li:first-child > span { - border-top-left-radius: 3px; - border-bottom-left-radius: 3px; -} -.pagination-sm > li:last-child > a, -.pagination-sm > li:last-child > span { - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; -} -.pager { - padding-left: 0; - margin: 20px 0; - text-align: center; - list-style: none; -} -.pager li { - display: inline; -} -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 15px; -} -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #eee; -} -.pager .next > a, -.pager .next > span { - float: right; -} -.pager .previous > a, -.pager .previous > span { - float: left; -} -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #777; - cursor: not-allowed; - background-color: #fff; -} -.label { - display: inline; - padding: .2em .6em .3em; - font-size: 75%; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25em; -} -a.label:hover, -a.label:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -.label:empty { - display: none; -} -.btn .label { - position: relative; - top: -1px; -} -.label-default { - background-color: #777; -} -.label-default[href]:hover, -.label-default[href]:focus { - background-color: #5e5e5e; -} -.label-primary { - background-color: #428bca; -} -.label-primary[href]:hover, -.label-primary[href]:focus { - background-color: #3071a9; -} -.label-success { - background-color: #5cb85c; -} -.label-success[href]:hover, -.label-success[href]:focus { - background-color: #449d44; -} -.label-info { - background-color: #5bc0de; -} -.label-info[href]:hover, -.label-info[href]:focus { - background-color: #31b0d5; -} -.label-warning { - background-color: #f0ad4e; -} -.label-warning[href]:hover, -.label-warning[href]:focus { - background-color: #ec971f; -} -.label-danger { - background-color: #d9534f; -} -.label-danger[href]:hover, -.label-danger[href]:focus { - background-color: #c9302c; -} -.badge { - display: inline-block; - min-width: 10px; - padding: 3px 7px; - font-size: 12px; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - background-color: #777; - border-radius: 10px; -} -.badge:empty { - display: none; -} -.btn .badge { - position: relative; - top: -1px; -} -.btn-xs .badge { - top: 0; - padding: 1px 5px; -} -a.badge:hover, -a.badge:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -a.list-group-item.active > .badge, -.nav-pills > .active > a > .badge { - color: #428bca; - background-color: #fff; -} -.nav-pills > li > a > .badge { - margin-left: 3px; -} -.jumbotron { - padding: 30px; - margin-bottom: 30px; - color: inherit; - background-color: #eee; -} -.jumbotron h1, -.jumbotron .h1 { - color: inherit; -} -.jumbotron p { - margin-bottom: 15px; - font-size: 21px; - font-weight: 200; -} -.jumbotron > hr { - border-top-color: #d5d5d5; -} -.container .jumbotron { - border-radius: 6px; -} -.jumbotron .container { - max-width: 100%; -} -@media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; - } - .container .jumbotron { - padding-right: 60px; - padding-left: 60px; - } - .jumbotron h1, - .jumbotron .h1 { - font-size: 63px; - } -} -.thumbnail { - display: block; - padding: 4px; - margin-bottom: 20px; - line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; - -webkit-transition: all .2s ease-in-out; - -o-transition: all .2s ease-in-out; - transition: all .2s ease-in-out; -} -.thumbnail > img, -.thumbnail a > img { - margin-right: auto; - margin-left: auto; -} -a.thumbnail:hover, -a.thumbnail:focus, -a.thumbnail.active { - border-color: #428bca; -} -.thumbnail .caption { - padding: 9px; - color: #333; -} -.alert { - padding: 15px; - margin-bottom: 20px; - border: 1px solid transparent; - border-radius: 4px; -} -.alert h4 { - margin-top: 0; - color: inherit; -} -.alert .alert-link { - font-weight: bold; -} -.alert > p, -.alert > ul { - margin-bottom: 0; -} -.alert > p + p { - margin-top: 5px; -} -.alert-dismissable, -.alert-dismissible { - padding-right: 35px; -} -.alert-dismissable .close, -.alert-dismissible .close { - position: relative; - top: -2px; - right: -21px; - color: inherit; -} -.alert-success { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} -.alert-success hr { - border-top-color: #c9e2b3; -} -.alert-success .alert-link { - color: #2b542c; -} -.alert-info { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} -.alert-info hr { - border-top-color: #a6e1ec; -} -.alert-info .alert-link { - color: #245269; -} -.alert-warning { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} -.alert-warning hr { - border-top-color: #f7e1b5; -} -.alert-warning .alert-link { - color: #66512c; -} -.alert-danger { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} -.alert-danger hr { - border-top-color: #e4b9c0; -} -.alert-danger .alert-link { - color: #843534; -} -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-o-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -.progress { - height: 20px; - margin-bottom: 20px; - overflow: hidden; - background-color: #f5f5f5; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); -} -.progress-bar { - float: left; - width: 0; - height: 100%; - font-size: 12px; - line-height: 20px; - color: #fff; - text-align: center; - background-color: #428bca; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); - -webkit-transition: width .6s ease; - -o-transition: width .6s ease; - transition: width .6s ease; -} -.progress-striped .progress-bar, -.progress-bar-striped { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - background-size: 40px 40px; -} -.progress.active .progress-bar, -.progress-bar.active { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} -.progress-bar[aria-valuenow="1"], -.progress-bar[aria-valuenow="2"] { - min-width: 30px; -} -.progress-bar[aria-valuenow="0"] { - min-width: 30px; - color: #777; - background-color: transparent; - background-image: none; - -webkit-box-shadow: none; - box-shadow: none; -} -.progress-bar-success { - background-color: #5cb85c; -} -.progress-striped .progress-bar-success { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-info { - background-color: #5bc0de; -} -.progress-striped .progress-bar-info { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-warning { - background-color: #f0ad4e; -} -.progress-striped .progress-bar-warning { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-danger { - background-color: #d9534f; -} -.progress-striped .progress-bar-danger { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.media, -.media-body { - overflow: hidden; - zoom: 1; -} -.media, -.media .media { - margin-top: 15px; -} -.media:first-child { - margin-top: 0; -} -.media-object { - display: block; -} -.media-heading { - margin: 0 0 5px; -} -.media > .pull-left { - margin-right: 10px; -} -.media > .pull-right { - margin-left: 10px; -} -.media-list { - padding-left: 0; - list-style: none; -} -.list-group { - padding-left: 0; - margin-bottom: 20px; -} -.list-group-item { - position: relative; - display: block; - padding: 10px 15px; - margin-bottom: -1px; - background-color: #fff; - border: 1px solid #ddd; -} -.list-group-item:first-child { - border-top-left-radius: 4px; - border-top-right-radius: 4px; -} -.list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; -} -.list-group-item > .badge { - float: right; -} -.list-group-item > .badge + .badge { - margin-right: 5px; -} -a.list-group-item { - color: #555; -} -a.list-group-item .list-group-item-heading { - color: #333; -} -a.list-group-item:hover, -a.list-group-item:focus { - color: #555; - text-decoration: none; - background-color: #f5f5f5; -} -.list-group-item.disabled, -.list-group-item.disabled:hover, -.list-group-item.disabled:focus { - color: #777; - background-color: #eee; -} -.list-group-item.disabled .list-group-item-heading, -.list-group-item.disabled:hover .list-group-item-heading, -.list-group-item.disabled:focus .list-group-item-heading { - color: inherit; -} -.list-group-item.disabled .list-group-item-text, -.list-group-item.disabled:hover .list-group-item-text, -.list-group-item.disabled:focus .list-group-item-text { - color: #777; -} -.list-group-item.active, -.list-group-item.active:hover, -.list-group-item.active:focus { - z-index: 2; - color: #fff; - background-color: #428bca; - border-color: #428bca; -} -.list-group-item.active .list-group-item-heading, -.list-group-item.active:hover .list-group-item-heading, -.list-group-item.active:focus .list-group-item-heading, -.list-group-item.active .list-group-item-heading > small, -.list-group-item.active:hover .list-group-item-heading > small, -.list-group-item.active:focus .list-group-item-heading > small, -.list-group-item.active .list-group-item-heading > .small, -.list-group-item.active:hover .list-group-item-heading > .small, -.list-group-item.active:focus .list-group-item-heading > .small { - color: inherit; -} -.list-group-item.active .list-group-item-text, -.list-group-item.active:hover .list-group-item-text, -.list-group-item.active:focus .list-group-item-text { - color: #e1edf7; -} -.list-group-item-success { - color: #3c763d; - background-color: #dff0d8; -} -a.list-group-item-success { - color: #3c763d; -} -a.list-group-item-success .list-group-item-heading { - color: inherit; -} -a.list-group-item-success:hover, -a.list-group-item-success:focus { - color: #3c763d; - background-color: #d0e9c6; -} -a.list-group-item-success.active, -a.list-group-item-success.active:hover, -a.list-group-item-success.active:focus { - color: #fff; - background-color: #3c763d; - border-color: #3c763d; -} -.list-group-item-info { - color: #31708f; - background-color: #d9edf7; -} -a.list-group-item-info { - color: #31708f; -} -a.list-group-item-info .list-group-item-heading { - color: inherit; -} -a.list-group-item-info:hover, -a.list-group-item-info:focus { - color: #31708f; - background-color: #c4e3f3; -} -a.list-group-item-info.active, -a.list-group-item-info.active:hover, -a.list-group-item-info.active:focus { - color: #fff; - background-color: #31708f; - border-color: #31708f; -} -.list-group-item-warning { - color: #8a6d3b; - background-color: #fcf8e3; -} -a.list-group-item-warning { - color: #8a6d3b; -} -a.list-group-item-warning .list-group-item-heading { - color: inherit; -} -a.list-group-item-warning:hover, -a.list-group-item-warning:focus { - color: #8a6d3b; - background-color: #faf2cc; -} -a.list-group-item-warning.active, -a.list-group-item-warning.active:hover, -a.list-group-item-warning.active:focus { - color: #fff; - background-color: #8a6d3b; - border-color: #8a6d3b; -} -.list-group-item-danger { - color: #a94442; - background-color: #f2dede; -} -a.list-group-item-danger { - color: #a94442; -} -a.list-group-item-danger .list-group-item-heading { - color: inherit; -} -a.list-group-item-danger:hover, -a.list-group-item-danger:focus { - color: #a94442; - background-color: #ebcccc; -} -a.list-group-item-danger.active, -a.list-group-item-danger.active:hover, -a.list-group-item-danger.active:focus { - color: #fff; - background-color: #a94442; - border-color: #a94442; -} -.list-group-item-heading { - margin-top: 0; - margin-bottom: 5px; -} -.list-group-item-text { - margin-bottom: 0; - line-height: 1.3; -} -.panel { - margin-bottom: 20px; - background-color: #fff; - border: 1px solid transparent; - border-radius: 4px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); - box-shadow: 0 1px 1px rgba(0, 0, 0, .05); -} -.panel-body { - padding: 15px; -} -.panel-heading { - padding: 10px 15px; - border-bottom: 1px solid transparent; - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel-heading > .dropdown .dropdown-toggle { - color: inherit; -} -.panel-title { - margin-top: 0; - margin-bottom: 0; - font-size: 16px; - color: inherit; -} -.panel-title > a { - color: inherit; -} -.panel-footer { - padding: 10px 15px; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .list-group { - margin-bottom: 0; -} -.panel > .list-group .list-group-item { - border-width: 1px 0; - border-radius: 0; -} -.panel > .list-group:first-child .list-group-item:first-child { - border-top: 0; - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel > .list-group:last-child .list-group-item:last-child { - border-bottom: 0; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel-heading + .list-group .list-group-item:first-child { - border-top-width: 0; -} -.list-group + .panel-footer { - border-top-width: 0; -} -.panel > .table, -.panel > .table-responsive > .table, -.panel > .panel-collapse > .table { - margin-bottom: 0; -} -.panel > .table:first-child, -.panel > .table-responsive:first-child > .table:first-child { - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, -.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { - border-top-left-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, -.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, -.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, -.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { - border-top-right-radius: 3px; -} -.panel > .table:last-child, -.panel > .table-responsive:last-child > .table:last-child { - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, -.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, -.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { - border-bottom-right-radius: 3px; -} -.panel > .panel-body + .table, -.panel > .panel-body + .table-responsive { - border-top: 1px solid #ddd; -} -.panel > .table > tbody:first-child > tr:first-child th, -.panel > .table > tbody:first-child > tr:first-child td { - border-top: 0; -} -.panel > .table-bordered, -.panel > .table-responsive > .table-bordered { - border: 0; -} -.panel > .table-bordered > thead > tr > th:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, -.panel > .table-bordered > tbody > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, -.panel > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-bordered > thead > tr > td:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, -.panel > .table-bordered > tbody > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, -.panel > .table-bordered > tfoot > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; -} -.panel > .table-bordered > thead > tr > th:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, -.panel > .table-bordered > tbody > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, -.panel > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-bordered > thead > tr > td:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, -.panel > .table-bordered > tbody > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, -.panel > .table-bordered > tfoot > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; -} -.panel > .table-bordered > thead > tr:first-child > td, -.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, -.panel > .table-bordered > tbody > tr:first-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, -.panel > .table-bordered > thead > tr:first-child > th, -.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, -.panel > .table-bordered > tbody > tr:first-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { - border-bottom: 0; -} -.panel > .table-bordered > tbody > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, -.panel > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-bordered > tbody > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, -.panel > .table-bordered > tfoot > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { - border-bottom: 0; -} -.panel > .table-responsive { - margin-bottom: 0; - border: 0; -} -.panel-group { - margin-bottom: 20px; -} -.panel-group .panel { - margin-bottom: 0; - border-radius: 4px; -} -.panel-group .panel + .panel { - margin-top: 5px; -} -.panel-group .panel-heading { - border-bottom: 0; -} -.panel-group .panel-heading + .panel-collapse > .panel-body { - border-top: 1px solid #ddd; -} -.panel-group .panel-footer { - border-top: 0; -} -.panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #ddd; -} -.panel-default { - border-color: #ddd; -} -.panel-default > .panel-heading { - color: #333; - background-color: #f5f5f5; - border-color: #ddd; -} -.panel-default > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ddd; -} -.panel-default > .panel-heading .badge { - color: #f5f5f5; - background-color: #333; -} -.panel-default > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ddd; -} -.panel-primary { - border-color: #428bca; -} -.panel-primary > .panel-heading { - color: #fff; - background-color: #428bca; - border-color: #428bca; -} -.panel-primary > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #428bca; -} -.panel-primary > .panel-heading .badge { - color: #428bca; - background-color: #fff; -} -.panel-primary > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #428bca; -} -.panel-success { - border-color: #d6e9c6; -} -.panel-success > .panel-heading { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} -.panel-success > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #d6e9c6; -} -.panel-success > .panel-heading .badge { - color: #dff0d8; - background-color: #3c763d; -} -.panel-success > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #d6e9c6; -} -.panel-info { - border-color: #bce8f1; -} -.panel-info > .panel-heading { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} -.panel-info > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #bce8f1; -} -.panel-info > .panel-heading .badge { - color: #d9edf7; - background-color: #31708f; -} -.panel-info > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #bce8f1; -} -.panel-warning { - border-color: #faebcc; -} -.panel-warning > .panel-heading { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} -.panel-warning > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #faebcc; -} -.panel-warning > .panel-heading .badge { - color: #fcf8e3; - background-color: #8a6d3b; -} -.panel-warning > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #faebcc; -} -.panel-danger { - border-color: #ebccd1; -} -.panel-danger > .panel-heading { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} -.panel-danger > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ebccd1; -} -.panel-danger > .panel-heading .badge { - color: #f2dede; - background-color: #a94442; -} -.panel-danger > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ebccd1; -} -.embed-responsive { - position: relative; - display: block; - height: 0; - padding: 0; - overflow: hidden; -} -.embed-responsive .embed-responsive-item, -.embed-responsive iframe, -.embed-responsive embed, -.embed-responsive object { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 100%; - height: 100%; - border: 0; -} -.embed-responsive.embed-responsive-16by9 { - padding-bottom: 56.25%; -} -.embed-responsive.embed-responsive-4by3 { - padding-bottom: 75%; -} -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); -} -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, .15); -} -.well-lg { - padding: 24px; - border-radius: 6px; -} -.well-sm { - padding: 9px; - border-radius: 3px; -} -.close { - float: right; - font-size: 21px; - font-weight: bold; - line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; - filter: alpha(opacity=20); - opacity: .2; -} -.close:hover, -.close:focus { - color: #000; - text-decoration: none; - cursor: pointer; - filter: alpha(opacity=50); - opacity: .5; -} -button.close { - -webkit-appearance: none; - padding: 0; - cursor: pointer; - background: transparent; - border: 0; -} -.modal-open { - overflow: hidden; -} -.modal { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1050; - display: none; - overflow: hidden; - -webkit-overflow-scrolling: touch; - outline: 0; -} -.modal.fade .modal-dialog { - -webkit-transition: -webkit-transform .3s ease-out; - -o-transition: -o-transform .3s ease-out; - transition: transform .3s ease-out; - -webkit-transform: translate3d(0, -25%, 0); - -o-transform: translate3d(0, -25%, 0); - transform: translate3d(0, -25%, 0); -} -.modal.in .modal-dialog { - -webkit-transform: translate3d(0, 0, 0); - -o-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -.modal-open .modal { - overflow-x: hidden; - overflow-y: auto; -} -.modal-dialog { - position: relative; - width: auto; - margin: 10px; -} -.modal-content { - position: relative; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: 6px; - outline: 0; - -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); - box-shadow: 0 3px 9px rgba(0, 0, 0, .5); -} -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000; -} -.modal-backdrop.fade { - filter: alpha(opacity=0); - opacity: 0; -} -.modal-backdrop.in { - filter: alpha(opacity=50); - opacity: .5; -} -.modal-header { - min-height: 16.42857143px; - padding: 15px; - border-bottom: 1px solid #e5e5e5; -} -.modal-header .close { - margin-top: -2px; -} -.modal-title { - margin: 0; - line-height: 1.42857143; -} -.modal-body { - position: relative; - padding: 15px; -} -.modal-footer { - padding: 15px; - text-align: right; - border-top: 1px solid #e5e5e5; -} -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} -.modal-scrollbar-measure { - position: absolute; - top: -9999px; - width: 50px; - height: 50px; - overflow: scroll; -} -@media (min-width: 768px) { - .modal-dialog { - width: 600px; - margin: 30px auto; - } - .modal-content { - -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); - box-shadow: 0 5px 15px rgba(0, 0, 0, .5); - } - .modal-sm { - width: 300px; - } -} -@media (min-width: 992px) { - .modal-lg { - width: 900px; - } -} -.tooltip { - position: absolute; - z-index: 1070; - display: block; - font-size: 12px; - line-height: 1.4; - visibility: visible; - filter: alpha(opacity=0); - opacity: 0; -} -.tooltip.in { - filter: alpha(opacity=90); - opacity: .9; -} -.tooltip.top { - padding: 5px 0; - margin-top: -3px; -} -.tooltip.right { - padding: 0 5px; - margin-left: 3px; -} -.tooltip.bottom { - padding: 5px 0; - margin-top: 3px; -} -.tooltip.left { - padding: 0 5px; - margin-left: -3px; -} -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #fff; - text-align: center; - text-decoration: none; - background-color: #000; - border-radius: 4px; -} -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.top-left .tooltip-arrow { - bottom: 0; - left: 5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.top-right .tooltip-arrow { - right: 5px; - bottom: 0; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-width: 5px 5px 5px 0; - border-right-color: #000; -} -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-width: 5px 0 5px 5px; - border-left-color: #000; -} -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.tooltip.bottom-left .tooltip-arrow { - top: 0; - left: 5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.tooltip.bottom-right .tooltip-arrow { - top: 0; - right: 5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1060; - display: none; - max-width: 276px; - padding: 1px; - text-align: left; - white-space: normal; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); - box-shadow: 0 5px 10px rgba(0, 0, 0, .2); -} -.popover.top { - margin-top: -10px; -} -.popover.right { - margin-left: 10px; -} -.popover.bottom { - margin-top: 10px; -} -.popover.left { - margin-left: -10px; -} -.popover-title { - padding: 8px 14px; - margin: 0; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-radius: 5px 5px 0 0; -} -.popover-content { - padding: 9px 14px; -} -.popover > .arrow, -.popover > .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.popover > .arrow { - border-width: 11px; -} -.popover > .arrow:after { - content: ""; - border-width: 10px; -} -.popover.top > .arrow { - bottom: -11px; - left: 50%; - margin-left: -11px; - border-top-color: #999; - border-top-color: rgba(0, 0, 0, .25); - border-bottom-width: 0; -} -.popover.top > .arrow:after { - bottom: 1px; - margin-left: -10px; - content: " "; - border-top-color: #fff; - border-bottom-width: 0; -} -.popover.right > .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-right-color: #999; - border-right-color: rgba(0, 0, 0, .25); - border-left-width: 0; -} -.popover.right > .arrow:after { - bottom: -10px; - left: 1px; - content: " "; - border-right-color: #fff; - border-left-width: 0; -} -.popover.bottom > .arrow { - top: -11px; - left: 50%; - margin-left: -11px; - border-top-width: 0; - border-bottom-color: #999; - border-bottom-color: rgba(0, 0, 0, .25); -} -.popover.bottom > .arrow:after { - top: 1px; - margin-left: -10px; - content: " "; - border-top-width: 0; - border-bottom-color: #fff; -} -.popover.left > .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-right-width: 0; - border-left-color: #999; - border-left-color: rgba(0, 0, 0, .25); -} -.popover.left > .arrow:after { - right: 1px; - bottom: -10px; - content: " "; - border-right-width: 0; - border-left-color: #fff; -} -.carousel { - position: relative; -} -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} -.carousel-inner > .item { - position: relative; - display: none; - -webkit-transition: .6s ease-in-out left; - -o-transition: .6s ease-in-out left; - transition: .6s ease-in-out left; -} -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - line-height: 1; -} -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} -.carousel-inner > .active { - left: 0; -} -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} -.carousel-inner > .next { - left: 100%; -} -.carousel-inner > .prev { - left: -100%; -} -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} -.carousel-inner > .active.left { - left: -100%; -} -.carousel-inner > .active.right { - left: 100%; -} -.carousel-control { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 15%; - font-size: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, .6); - filter: alpha(opacity=50); - opacity: .5; -} -.carousel-control.left { - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); - background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); - background-repeat: repeat-x; -} -.carousel-control.right { - right: 0; - left: auto; - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); - background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); - background-repeat: repeat-x; -} -.carousel-control:hover, -.carousel-control:focus { - color: #fff; - text-decoration: none; - filter: alpha(opacity=90); - outline: 0; - opacity: .9; -} -.carousel-control .icon-prev, -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-left, -.carousel-control .glyphicon-chevron-right { - position: absolute; - top: 50%; - z-index: 5; - display: inline-block; -} -.carousel-control .icon-prev, -.carousel-control .glyphicon-chevron-left { - left: 50%; - margin-left: -10px; -} -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-right { - right: 50%; - margin-right: -10px; -} -.carousel-control .icon-prev, -.carousel-control .icon-next { - width: 20px; - height: 20px; - margin-top: -10px; - font-family: serif; -} -.carousel-control .icon-prev:before { - content: '\2039'; -} -.carousel-control .icon-next:before { - content: '\203a'; -} -.carousel-indicators { - position: absolute; - bottom: 10px; - left: 50%; - z-index: 15; - width: 60%; - padding-left: 0; - margin-left: -30%; - text-align: center; - list-style: none; -} -.carousel-indicators li { - display: inline-block; - width: 10px; - height: 10px; - margin: 1px; - text-indent: -999px; - cursor: pointer; - background-color: #000 \9; - background-color: rgba(0, 0, 0, 0); - border: 1px solid #fff; - border-radius: 10px; -} -.carousel-indicators .active { - width: 12px; - height: 12px; - margin: 0; - background-color: #fff; -} -.carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, .6); -} -.carousel-caption .btn { - text-shadow: none; -} -@media screen and (min-width: 768px) { - .carousel-control .glyphicon-chevron-left, - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-prev, - .carousel-control .icon-next { - width: 30px; - height: 30px; - margin-top: -15px; - font-size: 30px; - } - .carousel-control .glyphicon-chevron-left, - .carousel-control .icon-prev { - margin-left: -15px; - } - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-next { - margin-right: -15px; - } - .carousel-caption { - right: 20%; - left: 20%; - padding-bottom: 30px; - } - .carousel-indicators { - bottom: 20px; - } -} -.clearfix:before, -.clearfix:after, -.dl-horizontal dd:before, -.dl-horizontal dd:after, -.container:before, -.container:after, -.container-fluid:before, -.container-fluid:after, -.row:before, -.row:after, -.form-horizontal .form-group:before, -.form-horizontal .form-group:after, -.btn-toolbar:before, -.btn-toolbar:after, -.btn-group-vertical > .btn-group:before, -.btn-group-vertical > .btn-group:after, -.nav:before, -.nav:after, -.navbar:before, -.navbar:after, -.navbar-header:before, -.navbar-header:after, -.navbar-collapse:before, -.navbar-collapse:after, -.pager:before, -.pager:after, -.panel-body:before, -.panel-body:after, -.modal-footer:before, -.modal-footer:after { - display: table; - content: " "; -} -.clearfix:after, -.dl-horizontal dd:after, -.container:after, -.container-fluid:after, -.row:after, -.form-horizontal .form-group:after, -.btn-toolbar:after, -.btn-group-vertical > .btn-group:after, -.nav:after, -.navbar:after, -.navbar-header:after, -.navbar-collapse:after, -.pager:after, -.panel-body:after, -.modal-footer:after { - clear: both; -} -.center-block { - display: block; - margin-right: auto; - margin-left: auto; -} -.pull-right { - float: right !important; -} -.pull-left { - float: left !important; -} -.hide { - display: none !important; -} -.show { - display: block !important; -} -.invisible { - visibility: hidden; -} -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.hidden { - display: none !important; - visibility: hidden !important; -} -.affix { - position: fixed; - -webkit-transform: translate3d(0, 0, 0); - -o-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -@-ms-viewport { - width: device-width; -} -.visible-xs, -.visible-sm, -.visible-md, -.visible-lg { - display: none !important; -} -.visible-xs-block, -.visible-xs-inline, -.visible-xs-inline-block, -.visible-sm-block, -.visible-sm-inline, -.visible-sm-inline-block, -.visible-md-block, -.visible-md-inline, -.visible-md-inline-block, -.visible-lg-block, -.visible-lg-inline, -.visible-lg-inline-block { - display: none !important; -} -@media (max-width: 767px) { - .visible-xs { - display: block !important; - } - table.visible-xs { - display: table; - } - tr.visible-xs { - display: table-row !important; - } - th.visible-xs, - td.visible-xs { - display: table-cell !important; - } -} -@media (max-width: 767px) { - .visible-xs-block { - display: block !important; - } -} -@media (max-width: 767px) { - .visible-xs-inline { - display: inline !important; - } -} -@media (max-width: 767px) { - .visible-xs-inline-block { - display: inline-block !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm { - display: block !important; - } - table.visible-sm { - display: table; - } - tr.visible-sm { - display: table-row !important; - } - th.visible-sm, - td.visible-sm { - display: table-cell !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-block { - display: block !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-inline { - display: inline !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-inline-block { - display: inline-block !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md { - display: block !important; - } - table.visible-md { - display: table; - } - tr.visible-md { - display: table-row !important; - } - th.visible-md, - td.visible-md { - display: table-cell !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-block { - display: block !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-inline { - display: inline !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-inline-block { - display: inline-block !important; - } -} -@media (min-width: 1200px) { - .visible-lg { - display: block !important; - } - table.visible-lg { - display: table; - } - tr.visible-lg { - display: table-row !important; - } - th.visible-lg, - td.visible-lg { - display: table-cell !important; - } -} -@media (min-width: 1200px) { - .visible-lg-block { - display: block !important; - } -} -@media (min-width: 1200px) { - .visible-lg-inline { - display: inline !important; - } -} -@media (min-width: 1200px) { - .visible-lg-inline-block { - display: inline-block !important; - } -} -@media (max-width: 767px) { - .hidden-xs { - display: none !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .hidden-sm { - display: none !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-md { - display: none !important; - } -} -@media (min-width: 1200px) { - .hidden-lg { - display: none !important; - } -} -.visible-print { - display: none !important; -} -@media print { - .visible-print { - display: block !important; - } - table.visible-print { - display: table; - } - tr.visible-print { - display: table-row !important; - } - th.visible-print, - td.visible-print { - display: table-cell !important; - } -} -.visible-print-block { - display: none !important; -} -@media print { - .visible-print-block { - display: block !important; - } -} -.visible-print-inline { - display: none !important; -} -@media print { - .visible-print-inline { - display: inline !important; - } -} -.visible-print-inline-block { - display: none !important; -} -@media print { - .visible-print-inline-block { - display: inline-block !important; - } -} -@media print { - .hidden-print { - display: none !important; - } -} -/*# sourceMappingURL=bootstrap.css.map */ diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox1/css/bootstrap.css.map b/pdf-as-tests/src/test/test-suites/public_pdfbox1/css/bootstrap.css.map deleted file mode 100644 index bfb56168..00000000 --- a/pdf-as-tests/src/test/test-suites/public_pdfbox1/css/bootstrap.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"bootstrap.css","sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"AAAA,6DAA4D;ACQ5D;EACE,yBAAA;EACA,4BAAA;EACA,gCAAA;EDND;ACaD;EACE,WAAA;EDXD;ACuBD;;;;;;;;;;;;EAYE,gBAAA;EDrBD;AC6BD;;;;EAIE,uBAAA;EACA,0BAAA;ED3BD;ACmCD;EACE,eAAA;EACA,WAAA;EDjCD;ACyCD;;EAEE,eAAA;EDvCD;ACiDD;EACE,yBAAA;ED/CD;ACsDD;;EAEE,YAAA;EDpDD;AC8DD;EACE,2BAAA;ED5DD;ACmED;;EAEE,mBAAA;EDjED;ACwED;EACE,oBAAA;EDtED;AC8ED;EACE,gBAAA;EACA,kBAAA;ED5ED;ACmFD;EACE,kBAAA;EACA,aAAA;EDjFD;ACwFD;EACE,gBAAA;EDtFD;AC6FD;;EAEE,gBAAA;EACA,gBAAA;EACA,oBAAA;EACA,0BAAA;ED3FD;AC8FD;EACE,aAAA;ED5FD;AC+FD;EACE,iBAAA;ED7FD;ACuGD;EACE,WAAA;EDrGD;AC4GD;EACE,kBAAA;ED1GD;ACoHD;EACE,kBAAA;EDlHD;ACyHD;EACE,8BAAA;EACA,iCAAA;EAAA,yBAAA;EACA,WAAA;EDvHD;AC8HD;EACE,gBAAA;ED5HD;ACmID;;;;EAIE,mCAAA;EACA,gBAAA;EDjID;ACmJD;;;;;EAKE,gBAAA;EACA,eAAA;EACA,WAAA;EDjJD;ACwJD;EACE,mBAAA;EDtJD;ACgKD;;EAEE,sBAAA;ED9JD;ACyKD;;;;EAIE,4BAAA;EACA,iBAAA;EDvKD;AC8KD;;EAEE,iBAAA;ED5KD;ACmLD;;EAEE,WAAA;EACA,YAAA;EDjLD;ACyLD;EACE,qBAAA;EDvLD;ACkMD;;EAEE,gCAAA;EAAA,6BAAA;EAAA,wBAAA;EACA,YAAA;EDhMD;ACyMD;;EAEE,cAAA;EDvMD;ACgND;EACE,+BAAA;EACA,8BAAA;EACA,iCAAA;EACA,yBAAA;ED9MD;ACuND;;EAEE,0BAAA;EDrND;AC4ND;EACE,2BAAA;EACA,eAAA;EACA,gCAAA;ED1ND;ACkOD;EACE,WAAA;EACA,YAAA;EDhOD;ACuOD;EACE,gBAAA;EDrOD;AC6OD;EACE,mBAAA;ED3OD;ACqPD;EACE,2BAAA;EACA,mBAAA;EDnPD;ACsPD;;EAEE,YAAA;EDpPD;AE9ED;EA9FE;IACE,8BAAA;IACA,wBAAA;IACA,oCAAA;IACA,qCAAA;IAAA,6BAAA;IF+KD;EE5KD;;IAEE,4BAAA;IF8KD;EE3KD;IACE,8BAAA;IF6KD;EE1KD;IACE,+BAAA;IF4KD;EExKD;;IAEE,aAAA;IF0KD;EEvKD;;IAEE,wBAAA;IACA,0BAAA;IFyKD;EEtKD;IACE,6BAAA;IFwKD;EErKD;;IAEE,0BAAA;IFuKD;EEpKD;IACE,4BAAA;IFsKD;EEnKD;;;IAGE,YAAA;IACA,WAAA;IFqKD;EElKD;;IAEE,yBAAA;IFoKD;EE/JD;IACE,6BAAA;IFiKD;EE7JD;IACE,eAAA;IF+JD;EE7JD;;IAGI,mCAAA;IF8JH;EE3JD;;IAGI,mCAAA;IF4JH;EEzJD;IACE,wBAAA;IF2JD;EExJD;IACE,sCAAA;IF0JD;EExJD;;IAGI,mCAAA;IFyJH;EACF;AGhPD;EACE,qCAAA;EACA,uDAAA;EACA,6TAAA;EHkPD;AG3OD;EACE,oBAAA;EACA,UAAA;EACA,uBAAA;EACA,qCAAA;EACA,oBAAA;EACA,qBAAA;EACA,gBAAA;EACA,qCAAA;EACA,oCAAA;EH6OD;AGzOmC;EAAW,gBAAA;EH4O9C;AG3OmC;EAAW,gBAAA;EH8O9C;AG7OmC;EAAW,kBAAA;EHgP9C;AG/OmC;EAAW,kBAAA;EHkP9C;AGjPmC;EAAW,kBAAA;EHoP9C;AGnPmC;EAAW,kBAAA;EHsP9C;AGrPmC;EAAW,kBAAA;EHwP9C;AGvPmC;EAAW,kBAAA;EH0P9C;AGzPmC;EAAW,kBAAA;EH4P9C;AG3PmC;EAAW,kBAAA;EH8P9C;AG7PmC;EAAW,kBAAA;EHgQ9C;AG/PmC;EAAW,kBAAA;EHkQ9C;AGjQmC;EAAW,kBAAA;EHoQ9C;AGnQmC;EAAW,kBAAA;EHsQ9C;AGrQmC;EAAW,kBAAA;EHwQ9C;AGvQmC;EAAW,kBAAA;EH0Q9C;AGzQmC;EAAW,kBAAA;EH4Q9C;AG3QmC;EAAW,kBAAA;EH8Q9C;AG7QmC;EAAW,kBAAA;EHgR9C;AG/QmC;EAAW,kBAAA;EHkR9C;AGjRmC;EAAW,kBAAA;EHoR9C;AGnRmC;EAAW,kBAAA;EHsR9C;AGrRmC;EAAW,kBAAA;EHwR9C;AGvRmC;EAAW,kBAAA;EH0R9C;AGzRmC;EAAW,kBAAA;EH4R9C;AG3RmC;EAAW,kBAAA;EH8R9C;AG7RmC;EAAW,kBAAA;EHgS9C;AG/RmC;EAAW,kBAAA;EHkS9C;AGjSmC;EAAW,kBAAA;EHoS9C;AGnSmC;EAAW,kBAAA;EHsS9C;AGrSmC;EAAW,kBAAA;EHwS9C;AGvSmC;EAAW,kBAAA;EH0S9C;AGzSmC;EAAW,kBAAA;EH4S9C;AG3SmC;EAAW,kBAAA;EH8S9C;AG7SmC;EAAW,kBAAA;EHgT9C;AG/SmC;EAAW,kBAAA;EHkT9C;AGjTmC;EAAW,kBAAA;EHoT9C;AGnTmC;EAAW,kBAAA;EHsT9C;AGrTmC;EAAW,kBAAA;EHwT9C;AGvTmC;EAAW,kBAAA;EH0T9C;AGzTmC;EAAW,kBAAA;EH4T9C;AG3TmC;EAAW,kBAAA;EH8T9C;AG7TmC;EAAW,kBAAA;EHgU9C;AG/TmC;EAAW,kBAAA;EHkU9C;AGjUmC;EAAW,kBAAA;EHoU9C;AGnUmC;EAAW,kBAAA;EHsU9C;AGrUmC;EAAW,kBAAA;EHwU9C;AGvUmC;EAAW,kBAAA;EH0U9C;AGzUmC;EAAW,kBAAA;EH4U9C;AG3UmC;EAAW,kBAAA;EH8U9C;AG7UmC;EAAW,kBAAA;EHgV9C;AG/UmC;EAAW,kBAAA;EHkV9C;AGjVmC;EAAW,kBAAA;EHoV9C;AGnVmC;EAAW,kBAAA;EHsV9C;AGrVmC;EAAW,kBAAA;EHwV9C;AGvVmC;EAAW,kBAAA;EH0V9C;AGzVmC;EAAW,kBAAA;EH4V9C;AG3VmC;EAAW,kBAAA;EH8V9C;AG7VmC;EAAW,kBAAA;EHgW9C;AG/VmC;EAAW,kBAAA;EHkW9C;AGjWmC;EAAW,kBAAA;EHoW9C;AGnWmC;EAAW,kBAAA;EHsW9C;AGrWmC;EAAW,kBAAA;EHwW9C;AGvWmC;EAAW,kBAAA;EH0W9C;AGzWmC;EAAW,kBAAA;EH4W9C;AG3WmC;EAAW,kBAAA;EH8W9C;AG7WmC;EAAW,kBAAA;EHgX9C;AG/WmC;EAAW,kBAAA;EHkX9C;AGjXmC;EAAW,kBAAA;EHoX9C;AGnXmC;EAAW,kBAAA;EHsX9C;AGrXmC;EAAW,kBAAA;EHwX9C;AGvXmC;EAAW,kBAAA;EH0X9C;AGzXmC;EAAW,kBAAA;EH4X9C;AG3XmC;EAAW,kBAAA;EH8X9C;AG7XmC;EAAW,kBAAA;EHgY9C;AG/XmC;EAAW,kBAAA;EHkY9C;AGjYmC;EAAW,kBAAA;EHoY9C;AGnYmC;EAAW,kBAAA;EHsY9C;AGrYmC;EAAW,kBAAA;EHwY9C;AGvYmC;EAAW,kBAAA;EH0Y9C;AGzYmC;EAAW,kBAAA;EH4Y9C;AG3YmC;EAAW,kBAAA;EH8Y9C;AG7YmC;EAAW,kBAAA;EHgZ9C;AG/YmC;EAAW,kBAAA;EHkZ9C;AGjZmC;EAAW,kBAAA;EHoZ9C;AGnZmC;EAAW,kBAAA;EHsZ9C;AGrZmC;EAAW,kBAAA;EHwZ9C;AGvZmC;EAAW,kBAAA;EH0Z9C;AGzZmC;EAAW,kBAAA;EH4Z9C;AG3ZmC;EAAW,kBAAA;EH8Z9C;AG7ZmC;EAAW,kBAAA;EHga9C;AG/ZmC;EAAW,kBAAA;EHka9C;AGjamC;EAAW,kBAAA;EHoa9C;AGnamC;EAAW,kBAAA;EHsa9C;AGramC;EAAW,kBAAA;EHwa9C;AGvamC;EAAW,kBAAA;EH0a9C;AGzamC;EAAW,kBAAA;EH4a9C;AG3amC;EAAW,kBAAA;EH8a9C;AG7amC;EAAW,kBAAA;EHgb9C;AG/amC;EAAW,kBAAA;EHkb9C;AGjbmC;EAAW,kBAAA;EHob9C;AGnbmC;EAAW,kBAAA;EHsb9C;AGrbmC;EAAW,kBAAA;EHwb9C;AGvbmC;EAAW,kBAAA;EH0b9C;AGzbmC;EAAW,kBAAA;EH4b9C;AG3bmC;EAAW,kBAAA;EH8b9C;AG7bmC;EAAW,kBAAA;EHgc9C;AG/bmC;EAAW,kBAAA;EHkc9C;AGjcmC;EAAW,kBAAA;EHoc9C;AGncmC;EAAW,kBAAA;EHsc9C;AGrcmC;EAAW,kBAAA;EHwc9C;AGvcmC;EAAW,kBAAA;EH0c9C;AGzcmC;EAAW,kBAAA;EH4c9C;AG3cmC;EAAW,kBAAA;EH8c9C;AG7cmC;EAAW,kBAAA;EHgd9C;AG/cmC;EAAW,kBAAA;EHkd9C;AGjdmC;EAAW,kBAAA;EHod9C;AGndmC;EAAW,kBAAA;EHsd9C;AGrdmC;EAAW,kBAAA;EHwd9C;AGvdmC;EAAW,kBAAA;EH0d9C;AGzdmC;EAAW,kBAAA;EH4d9C;AG3dmC;EAAW,kBAAA;EH8d9C;AG7dmC;EAAW,kBAAA;EHge9C;AG/dmC;EAAW,kBAAA;EHke9C;AGjemC;EAAW,kBAAA;EHoe9C;AGnemC;EAAW,kBAAA;EHse9C;AGremC;EAAW,kBAAA;EHwe9C;AGvemC;EAAW,kBAAA;EH0e9C;AGzemC;EAAW,kBAAA;EH4e9C;AG3emC;EAAW,kBAAA;EH8e9C;AG7emC;EAAW,kBAAA;EHgf9C;AG/emC;EAAW,kBAAA;EHkf9C;AGjfmC;EAAW,kBAAA;EHof9C;AGnfmC;EAAW,kBAAA;EHsf9C;AGrfmC;EAAW,kBAAA;EHwf9C;AGvfmC;EAAW,kBAAA;EH0f9C;AGzfmC;EAAW,kBAAA;EH4f9C;AG3fmC;EAAW,kBAAA;EH8f9C;AG7fmC;EAAW,kBAAA;EHggB9C;AG/fmC;EAAW,kBAAA;EHkgB9C;AGjgBmC;EAAW,kBAAA;EHogB9C;AGngBmC;EAAW,kBAAA;EHsgB9C;AGrgBmC;EAAW,kBAAA;EHwgB9C;AGvgBmC;EAAW,kBAAA;EH0gB9C;AGzgBmC;EAAW,kBAAA;EH4gB9C;AG3gBmC;EAAW,kBAAA;EH8gB9C;AG7gBmC;EAAW,kBAAA;EHghB9C;AG/gBmC;EAAW,kBAAA;EHkhB9C;AGjhBmC;EAAW,kBAAA;EHohB9C;AGnhBmC;EAAW,kBAAA;EHshB9C;AGrhBmC;EAAW,kBAAA;EHwhB9C;AGvhBmC;EAAW,kBAAA;EH0hB9C;AGzhBmC;EAAW,kBAAA;EH4hB9C;AG3hBmC;EAAW,kBAAA;EH8hB9C;AG7hBmC;EAAW,kBAAA;EHgiB9C;AG/hBmC;EAAW,kBAAA;EHkiB9C;AGjiBmC;EAAW,kBAAA;EHoiB9C;AGniBmC;EAAW,kBAAA;EHsiB9C;AGriBmC;EAAW,kBAAA;EHwiB9C;AGviBmC;EAAW,kBAAA;EH0iB9C;AGziBmC;EAAW,kBAAA;EH4iB9C;AG3iBmC;EAAW,kBAAA;EH8iB9C;AG7iBmC;EA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A;Efk8CH;Ae97CC;EACE,YAAA;Efg8CH;Ael7CC;EACE,mBAAA;Efo7CH;Aer7CC;EACE,2BAAA;Efu7CH;Aex7CC;EACE,2BAAA;Ef07CH;Ae37CC;EACE,kBAAA;Ef67CH;Ae97CC;EACE,2BAAA;Efg8CH;Aej8CC;EACE,2BAAA;Efm8CH;Aep8CC;EACE,kBAAA;Efs8CH;Aev8CC;EACE,2BAAA;Efy8CH;Ae18CC;EACE,2BAAA;Ef48CH;Ae78CC;EACE,kBAAA;Ef+8CH;Aeh9CC;EACE,2BAAA;Efk9CH;Aen9CC;EACE,0BAAA;Efq9CH;Aet9CC;EACE,iBAAA;Efw9CH;Aa59CD;EE9BI;IACE,aAAA;If6/CH;Eet/CD;IACE,aAAA;Ifw/CD;Eez/CD;IACE,qBAAA;If2/CD;Ee5/CD;IACE,qBAAA;If8/CD;Ee//CD;IACE,YAAA;IfigDD;EelgDD;IACE,qBAAA;IfogDD;EergDD;IACE,qBAAA;IfugDD;EexgDD;IACE,YAAA;If0gDD;Ee3gDD;IACE,qBAAA;If6gDD;Ee9gDD;IACE,qBAAA;IfghDD;EejhDD;IACE,YAAA;IfmhDD;EephDD;IACE,qBAAA;IfshDD;EevhDD;IACE,oBAAA;IfyhDD;Ee3gDD;IACE,aAAA;If6gDD;Ee9gDD;IACE,qBAAA;IfghDD;EejhDD;IACE,qBAAA;IfmhDD;EephDD;IACE,YAAA;IfshDD;EevhDD;IACE,qBAAA;IfyhDD;Ee1hDD;IACE,qBAAA;If4hDD;Ee7hDD;IACE,YAAA;If+hDD;EehiDD;IACE,qBAAA;IfkiDD;EeniDD;IACE,qBAAA;IfqiDD;EetiDD;IACE,YAAA;IfwiDD;EeziDD;IACE,qBAAA;If2iDD;Ee5iDD;IACE,oBAAA;If8iDD;Ee1iDD;IACE,aAAA;If4iDD;Ee5jDD;IACE,YAAA;If8jDD;Ee/jDD;IACE,oBAAA;IfikDD;EelkDD;IACE,oBAAA;IfokDD;EerkDD;IACE,WAAA;IfukDD;EexkDD;IACE,oBAAA;If0kDD;Ee3kDD;IACE,oBAAA;If6kDD;Ee9kDD;IACE,WAAA;IfglDD;EejlDD;IACE,oBAAA;IfmlDD;EeplDD;IACE,oBAAA;IfslDD;EevlDD;IACE,WAAA;IfylDD;Ee1lDD;IACE,oBAAA;If4lDD;Ee7lDD;IACE,mBAAA;If+lDD;Ee3lDD;IACE,YAAA;If6lDD;Ee/kDD;IACE,mBAAA;IfilDD;EellDD;IACE,2BAAA;IfolDD;EerlDD;IACE,2BAAA;IfulDD;EexlDD;IACE,kBAAA;If0lDD;Ee3lDD;IACE,2BAAA;If6lDD;Ee9lDD;IACE,2BAAA;IfgmDD;EejmDD;IACE,kBAAA;IfmmDD;EepmDD;IACE,2BAAA;IfsmDD;EevmDD;IACE,2BAAA;IfymDD;Ee1mDD;IACE,kBAAA;If4mDD;Ee7mDD;IACE,2BAAA;If+mDD;EehnDD;IACE,0BAAA;IfknDD;EennDD;IACE,iBAAA;IfqnDD;EACF;AajnDD;EEvCI;IACE,aAAA;If2pDH;EeppDD;IACE,aAAA;IfspDD;EevpDD;IACE,qBAAA;IfypDD;Ee1pDD;IACE,qBAAA;If4pDD;Ee7pDD;IACE,YAAA;If+pDD;EehqDD;IACE,qBAAA;IfkqDD;EenqDD;IACE,qBAAA;IfqqDD;EetqDD;IACE,YAAA;IfwqDD;EezqDD;IACE,qBAAA;If2qDD;Ee5qDD;IACE,qBAAA;If8qDD;Ee/qDD;IACE,YAAA;IfirDD;EelrDD;IACE,qBAAA;IforDD;EerrDD;IACE,oBAAA;IfurDD;EezqDD;IACE,aAAA;If2qDD;Ee5qDD;IACE,qBAAA;If8qDD;Ee/qDD;IACE,qBAAA;IfirDD;EelrDD;IACE,YAAA;IforDD;EerrDD;IACE,qBAAA;IfurDD;EexrDD;IACE,qBAAA;If0rDD;Ee3rDD;IACE,YAAA;If6rDD;Ee9rDD;IACE,qBAAA;IfgsDD;EejsDD;IACE,qBAAA;IfmsDD;EepsDD;IACE,YAAA;IfssDD;EevsDD;IACE,qBAAA;IfysDD;Ee1sDD;IACE,oBAAA;If4sDD;EexsDD;IACE,aAAA;If0sDD;Ee1tDD;IACE,YAAA;If4tDD;Ee7tDD;IACE,oBAAA;If+tDD;EehuDD;IACE,oBAAA;IfkuDD;EenuDD;IACE,WAAA;IfquDD;EetuDD;IACE,oBAAA;IfwuDD;EezuDD;IACE,oBAAA;If2uDD;Ee5uDD;IACE,WAAA;If8uDD;Ee/uDD;IACE,oBAAA;IfivDD;EelvDD;IACE,oBAAA;IfovDD;EervDD;IACE,WAAA;IfuvDD;EexvDD;IACE,oBAAA;If0vDD;Ee3vDD;IACE,mBAAA;If6vDD;EezvDD;IACE,YAAA;If2vDD;Ee7uDD;IACE,mBAAA;If+uDD;EehvDD;IACE,2BAAA;IfkvDD;EenvDD;IACE,2BAAA;IfqvDD;EetvDD;IACE,kBAAA;IfwvDD;EezvDD;IACE,2BAAA;If2vDD;Ee5vDD;IACE,2BAAA;If8vDD;Ee/vDD;IACE,kBAAA;IfiwDD;EelwDD;IACE,2BAAA;IfowDD;EerwDD;IACE,2BAAA;IfuwDD;EexwDD;IACE,kBAAA;If0wDD;Ee3wDD;IACE,2BAAA;If6wDD;Ee9wDD;IACE,0BAAA;IfgxDD;EejxDD;IACE,iBAAA;IfmxDD;EACF;AaxwDD;EE9CI;IACE,aAAA;IfyzDH;EelzDD;IACE,aAAA;IfozDD;EerzDD;IACE,qBAAA;IfuzDD;EexzDD;IACE,qBAAA;If0zDD;Ee3zDD;IACE,YAAA;If6zDD;Ee9zDD;IACE,qBAAA;Ifg0DD;Eej0DD;IACE,qBAAA;Ifm0DD;Eep0DD;IACE,YAAA;Ifs0DD;Eev0DD;IACE,qBAAA;Ify0DD;Ee10DD;IACE,qBAAA;If40DD;Ee70DD;IACE,YAAA;If+0DD;Eeh1DD;IACE,qBAAA;Ifk1DD;Een1DD;IACE,oBAAA;Ifq1DD;Eev0DD;IACE,aAAA;Ify0DD;Ee10DD;IACE,qBAAA;If40DD;Ee70DD;IACE,qBAAA;If+0DD;Eeh1DD;IACE,YAAA;Ifk1DD;Een1DD;IACE,qBAAA;Ifq1DD;Eet1DD;IACE,qBAAA;Ifw1DD;Eez1DD;IACE,YAAA;If21DD;Ee51DD;IACE,qBAAA;If81DD;Ee/1DD;IACE,qBAAA;Ifi2DD;Eel2DD;IACE,YAAA;Ifo2DD;Eer2DD;IACE,qBAAA;Ifu2DD;Eex2DD;IACE,oBAAA;If02DD;Eet2DD;IACE,aAAA;Ifw2DD;Eex3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AAA;EACI,uBAAA;ErBqsFT;AoB9qFD;EClBI,gBAAA;EACA,2BAAA;ErBmsFH;AoB/qFD;ECrDE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBuuFD;AqBruFC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBuuFP;AqBruFC;;;EAGE,wBAAA;ErBuuFH;AqBluFG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErB8uFT;AoBptFD;ECrBI,gBAAA;EACA,2BAAA;ErB4uFH;AoBptFD;ECzDE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBgxFD;AqB9wFC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBgxFP;AqB9wFC;;;EAGE,wBAAA;ErBgxFH;AqB3wFG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErBuxFT;AoBzvFD;ECzBI,gBAAA;EACA,2BAAA;ErBqxFH;AoBzvFD;EC7DE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErByzFD;AqBvzFC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErByzFP;AqBvzFC;;;EAGE,wBAAA;ErByzFH;AqBpzFG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErBg0FT;AoB9xFD;EC7BI,gBAAA;EACA,2BAAA;ErB8zFH;AoB9xFD;ECjEE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBk2FD;AqBh2FC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBk2FP;AqBh2FC;;;EAGE,wBAAA;ErBk2FH;AqB71FG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErBy2FT;AoBn0FD;ECjCI,gBAAA;EACA,2BAAA;ErBu2FH;AoBn0FD;ECrEE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErB24FD;AqBz4FC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErB24FP;AqBz4FC;;;EAGE,wBAAA;ErB24FH;AqBt4FG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErBk5FT;AoBx2FD;ECrCI,gBAAA;EACA,2BAAA;ErBg5FH;AoBn2FD;EACE,gBAAA;EACA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","sourcesContent":[null,"/*! normalize.css v3.0.1 | MIT License | git.io/normalize */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS text size adjust after orientation change, without disabling\n// user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11 and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background: transparent;\n}\n\n//\n// Improve readability when focused and also mouse hovered in all browsers.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome\n// (include `-moz` to future-proof).\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n -moz-box-sizing: content-box;\n -webkit-box-sizing: content-box; // 2\n box-sizing: content-box;\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","//\n// Basic print styles\n// --------------------------------------------------\n// Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css\n\n@media print {\n\n * {\n text-shadow: none !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n background: transparent !important;\n box-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links for images, or javascript/internal links\n a[href^=\"javascript:\"]:after,\n a[href^=\"#\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245\n // Once fixed, we can just straight up remove this.\n select {\n background: #fff !important;\n }\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .table {\n td,\n th {\n background-color: #fff !important;\n }\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// Star\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\2a\"; } }\n.glyphicon-plus { &:before { content: \"\\2b\"; } }\n.glyphicon-euro { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: underline;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n &::-moz-placeholder { color: @color; // Firefox\n opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n width: 100% \\9; // Force IE10 and below to size SVG images correctly\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\n// Undo browser default styling\ncite {\n font-style: normal;\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @grid-float-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Quotes\nblockquote:before,\nblockquote:after {\n content: \"\";\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: (@gutter / -2);\n margin-right: (@gutter / -2);\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) when (@index = 1) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) when (@index = 1) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-child(odd) {\n > td,\n > th {\n background-color: @table-bg-accent;\n }\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n > td,\n > th {\n background-color: @table-bg-hover;\n }\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n overflow-x: auto;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n -webkit-overflow-scrolling: touch;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\n// Set the height of file controls to match text inputs\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &[disabled],\n &[readonly],\n fieldset[disabled] & {\n cursor: not-allowed;\n background-color: @input-bg-disabled;\n opacity: 1; // iOS fix for unreadable disabled content\n }\n\n // Reset height for `textarea`s\n textarea& {\n height: auto;\n }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned.\n// As a workaround, we set a pixel line-height that matches the\n// given height of the input. Since this fucks up everything else, we have to\n// appropriately reset it for Internet Explorer and the size variations.\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n line-height: @input-height-base;\n // IE8+ misaligns the text within date inputs, so we reset\n line-height: @line-height-base ~\"\\0\";\n\n &.input-sm {\n line-height: @input-height-small;\n }\n &.input-lg {\n line-height: @input-height-large;\n }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: 15px;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n min-height: @line-height-computed; // clear the floating input if there is no label text\n margin-top: 10px;\n margin-bottom: 10px;\n\n label {\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because