Compare commits
3 Commits
Frooodle-p
...
decrypt
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f4082e3f96 | ||
|
|
c93a48b40d | ||
|
|
75e10efcbd |
2
.github/ISSUE_TEMPLATE/config.yml
vendored
2
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,5 +1,5 @@
|
|||||||
blank_issues_enabled: true
|
blank_issues_enabled: true
|
||||||
contact_links:
|
contact_links:
|
||||||
- name: 💬 Discord Server
|
- name: 💬 Discord Server
|
||||||
url: https://discord.gg/Cn8pWhQRxZ
|
url: https://discord.gg/HYmhKj45pU
|
||||||
about: You can join our Discord server for real time discussion and support
|
about: You can join our Discord server for real time discussion and support
|
||||||
|
|||||||
91
.github/labels.yml
vendored
91
.github/labels.yml
vendored
@@ -1,91 +0,0 @@
|
|||||||
# Labels names are important as they are used by Release Drafter to decide
|
|
||||||
# regarding where to record them in changelog or if to skip them.
|
|
||||||
#
|
|
||||||
# The repository labels will be automatically configured using this file and
|
|
||||||
# the GitHub Action https://github.com/marketplace/actions/github-labeler.
|
|
||||||
- name: "Back End"
|
|
||||||
color: "20CE6C"
|
|
||||||
description: "Issues related to back-end development"
|
|
||||||
from_name: "Back end"
|
|
||||||
- name: "Bug"
|
|
||||||
description: "Something isn't working"
|
|
||||||
color: "EB9CA6"
|
|
||||||
from_name: "bug"
|
|
||||||
- name: "dependencies"
|
|
||||||
description: "Pull requests that update a dependency file"
|
|
||||||
color: "5AA8FC"
|
|
||||||
- name: "Docker"
|
|
||||||
description: "Pull requests that update Docker code"
|
|
||||||
color: "1FCEFF"
|
|
||||||
from_name: "docker"
|
|
||||||
- name: "Documentation"
|
|
||||||
description: "Improvements or additions to documentation"
|
|
||||||
color: "35ABFF"
|
|
||||||
from_name: "documentation"
|
|
||||||
- name: "Done for next release"
|
|
||||||
color: "0CDBD1"
|
|
||||||
- name: "Done"
|
|
||||||
color: "60F13B"
|
|
||||||
- name: "duplicate"
|
|
||||||
description: "This issue or pull request already exists"
|
|
||||||
color: "CDD1D5"
|
|
||||||
- name: "enhancement"
|
|
||||||
description: "New feature or request"
|
|
||||||
color: "A0EEEE"
|
|
||||||
- name: "fix needs confirmation"
|
|
||||||
color: "60A1E7"
|
|
||||||
description: "Fix needs to be confirmed"
|
|
||||||
- name: "Front End"
|
|
||||||
color: "BBD2F1"
|
|
||||||
description: "Issues related to front-end development"
|
|
||||||
- name: "github-actions"
|
|
||||||
description: "Pull requests that update GitHub Actions code"
|
|
||||||
color: "999999"
|
|
||||||
from_name: "github_actions"
|
|
||||||
- name: "good first issue"
|
|
||||||
description: "Good for newcomers"
|
|
||||||
color: "C1B8FF"
|
|
||||||
- name: "help wanted"
|
|
||||||
description: "Extra attention is needed"
|
|
||||||
color: "00E6C4"
|
|
||||||
- name: "invalid"
|
|
||||||
description: "This doesn't seem right"
|
|
||||||
color: "E5E566"
|
|
||||||
- name: "Java"
|
|
||||||
description: "Pull requests that update Java code"
|
|
||||||
color: "FF9E1F"
|
|
||||||
from_name: "java"
|
|
||||||
- name: "Long-term Enhancement"
|
|
||||||
color: "BFDEC3"
|
|
||||||
description: "Enhancements planned for the long term"
|
|
||||||
- name: "more-info-needed"
|
|
||||||
color: "00E4F8"
|
|
||||||
description: "More information is needed"
|
|
||||||
- name: "needs investigation"
|
|
||||||
color: "B8C3A7"
|
|
||||||
description: "Issues that require further investigation"
|
|
||||||
- name: "Prioritised enhancement"
|
|
||||||
color: "4BA2EE"
|
|
||||||
description: "High-priority enhancements"
|
|
||||||
- name: "question"
|
|
||||||
description: "Further information is requested"
|
|
||||||
color: "D97EE5"
|
|
||||||
- name: "Translation"
|
|
||||||
color: "9FABF9"
|
|
||||||
from_name: "translation"
|
|
||||||
- name: "upstream"
|
|
||||||
color: "DEDEDE"
|
|
||||||
- name: "v2"
|
|
||||||
color: "FFFF00"
|
|
||||||
- name: "wontfix"
|
|
||||||
description: "This will not be worked on"
|
|
||||||
color: "FFFFFF"
|
|
||||||
- name: "Security"
|
|
||||||
color: "000000"
|
|
||||||
description: "Security-related issues or pull requests"
|
|
||||||
- name: "API"
|
|
||||||
color: "FFFF00"
|
|
||||||
description: "API-related issues or pull requests"
|
|
||||||
- name: "Test"
|
|
||||||
color: "FF9E1F"
|
|
||||||
description: "Testing-related issues or pull requests"
|
|
||||||
24
.github/workflows/manage-label.yml
vendored
24
.github/workflows/manage-label.yml
vendored
@@ -1,24 +0,0 @@
|
|||||||
name: Manage labels
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: "30 20 * * *"
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
issues: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
labeler:
|
|
||||||
name: Labeler
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Check out the repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Run Labeler
|
|
||||||
uses: crazy-max/ghaction-github-labeler@v5
|
|
||||||
with:
|
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
yaml-file: .github/labels.yml
|
|
||||||
skip-delete: true
|
|
||||||
@@ -31,7 +31,7 @@ ENV DOCKER_ENABLE_SECURITY=false \
|
|||||||
PGID=1000 \
|
PGID=1000 \
|
||||||
UMASK=022 \
|
UMASK=022 \
|
||||||
FAT_DOCKER=true \
|
FAT_DOCKER=true \
|
||||||
INSTALL_BOOK_AND_ADVANCED_HTML_OPS=false
|
INSTALL_BOOK_AND_ADVANCED_HTML_OPS=true
|
||||||
|
|
||||||
|
|
||||||
# JDK for app
|
# JDK for app
|
||||||
@@ -45,6 +45,7 @@ RUN echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /et
|
|||||||
tini \
|
tini \
|
||||||
bash \
|
bash \
|
||||||
curl \
|
curl \
|
||||||
|
calibre@testing \
|
||||||
shadow \
|
shadow \
|
||||||
su-exec \
|
su-exec \
|
||||||
openssl \
|
openssl \
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<h1 align="center">Stirling-PDF</h1>
|
<h1 align="center">Stirling-PDF</h1>
|
||||||
|
|
||||||
[](https://hub.docker.com/r/frooodle/s-pdf)
|
[](https://hub.docker.com/r/frooodle/s-pdf)
|
||||||
[](https://discord.gg/Cn8pWhQRxZ)
|
[](https://discord.gg/HYmhKj45pU)
|
||||||
[](https://github.com/Stirling-Tools/Stirling-PDF/)
|
[](https://github.com/Stirling-Tools/Stirling-PDF/)
|
||||||
[](https://github.com/Stirling-Tools/stirling-pdf)
|
[](https://github.com/Stirling-Tools/stirling-pdf)
|
||||||
[](https://www.paypal.com/donate/?hosted_button_id=MN7JPG5G6G3JL)
|
[](https://www.paypal.com/donate/?hosted_button_id=MN7JPG5G6G3JL)
|
||||||
@@ -165,14 +165,14 @@ Please view https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToUseOCR
|
|||||||
|
|
||||||
## Supported Languages
|
## Supported Languages
|
||||||
|
|
||||||
Stirling PDF currently supports 33!
|
Stirling PDF currently supports 32!
|
||||||
|
|
||||||
| Language | Progress |
|
| Language | Progress |
|
||||||
| ------------------------------------------- | -------------------------------------- |
|
| ------------------------------------------- | -------------------------------------- |
|
||||||
| English (English) (en_GB) |  |
|
| English (English) (en_GB) |  |
|
||||||
| English (US) (en_US) |  |
|
| English (US) (en_US) |  |
|
||||||
| Arabic (العربية) (ar_AR) |  |
|
| Arabic (العربية) (ar_AR) |  |
|
||||||
| German (Deutsch) (de_DE) |  |
|
| German (Deutsch) (de_DE) |  |
|
||||||
| French (Français) (fr_FR) |  |
|
| French (Français) (fr_FR) |  |
|
||||||
| Spanish (Español) (es_ES) |  |
|
| Spanish (Español) (es_ES) |  |
|
||||||
| Simplified Chinese (简体中文) (zh_CN) |  |
|
| Simplified Chinese (简体中文) (zh_CN) |  |
|
||||||
@@ -190,7 +190,7 @@ Stirling PDF currently supports 33!
|
|||||||
| Japanese (日本語) (ja_JP) |  |
|
| Japanese (日本語) (ja_JP) |  |
|
||||||
| Dutch (Nederlands) (nl_NL) |  |
|
| Dutch (Nederlands) (nl_NL) |  |
|
||||||
| Greek (Ελληνικά) (el_GR) |  |
|
| Greek (Ελληνικά) (el_GR) |  |
|
||||||
| Turkish (Türkçe) (tr_TR) |  |
|
| Turkish (Türkçe) (tr_TR) |  |
|
||||||
| Indonesia (Bahasa Indonesia) (id_ID) |  |
|
| Indonesia (Bahasa Indonesia) (id_ID) |  |
|
||||||
| Hindi (हिंदी) (hi_IN) |  |
|
| Hindi (हिंदी) (hi_IN) |  |
|
||||||
| Hungarian (Magyar) (hu_HU) |  |
|
| Hungarian (Magyar) (hu_HU) |  |
|
||||||
@@ -201,7 +201,6 @@ Stirling PDF currently supports 33!
|
|||||||
| Czech (Česky) (cs_CZ) |  |
|
| Czech (Česky) (cs_CZ) |  |
|
||||||
| Croatian (Hrvatski) (hr_HR) |  |
|
| Croatian (Hrvatski) (hr_HR) |  |
|
||||||
| Norwegian (Norsk) (no_NB) |  |
|
| Norwegian (Norsk) (no_NB) |  |
|
||||||
| Thai (ไทย) (th_TH) |  |
|
|
||||||
|
|
||||||
## Contributing (creating issues, translations, fixing bugs, etc.)
|
## Contributing (creating issues, translations, fixing bugs, etc.)
|
||||||
|
|
||||||
|
|||||||
@@ -12,11 +12,11 @@ plugins {
|
|||||||
import com.github.jk1.license.render.*
|
import com.github.jk1.license.render.*
|
||||||
|
|
||||||
ext {
|
ext {
|
||||||
springBootVersion = "3.3.2"
|
springBootVersion = "3.3.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
group = "stirling.software"
|
group = "stirling.software"
|
||||||
version = "0.27.0"
|
version = "0.26.1"
|
||||||
|
|
||||||
// 17 is lowest but we support and recommend 21
|
// 17 is lowest but we support and recommend 21
|
||||||
sourceCompatibility = "17"
|
sourceCompatibility = "17"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
apiVersion: v2
|
apiVersion: v2
|
||||||
appVersion: 0.26.2
|
appVersion: 0.26.1
|
||||||
description: locally hosted web application that allows you to perform various operations
|
description: locally hosted web application that allows you to perform various operations
|
||||||
on PDF files
|
on PDF files
|
||||||
home: https://github.com/Stirling-Tools/Stirling-PDF
|
home: https://github.com/Stirling-Tools/Stirling-PDF
|
||||||
|
|||||||
@@ -1,106 +0,0 @@
|
|||||||
%PDF-1.3
|
|
||||||
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
|
|
||||||
1 0 obj
|
|
||||||
<<
|
|
||||||
/F1 2 0 R
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
2 0 obj
|
|
||||||
<<
|
|
||||||
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
3 0 obj
|
|
||||||
<<
|
|
||||||
/Contents 9 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
|
||||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
|
||||||
>> /Rotate 0 /Trans <<
|
|
||||||
|
|
||||||
>>
|
|
||||||
/Type /Page
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
4 0 obj
|
|
||||||
<<
|
|
||||||
/Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
|
||||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
|
||||||
>> /Rotate 0 /Trans <<
|
|
||||||
|
|
||||||
>>
|
|
||||||
/Type /Page
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
5 0 obj
|
|
||||||
<<
|
|
||||||
/Contents 11 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
|
||||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
|
||||||
>> /Rotate 0 /Trans <<
|
|
||||||
|
|
||||||
>>
|
|
||||||
/Type /Page
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
6 0 obj
|
|
||||||
<<
|
|
||||||
/PageMode /UseNone /Pages 8 0 R /Type /Catalog
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
7 0 obj
|
|
||||||
<<
|
|
||||||
/Author (anonymous) /CreationDate (D:20240718233034+00'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20240718233034+00'00') /Producer (ReportLab PDF Library - www.reportlab.com)
|
|
||||||
/Subject (unspecified) /Title (untitled) /Trapped /False
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
8 0 obj
|
|
||||||
<<
|
|
||||||
/Count 3 /Kids [ 3 0 R 4 0 R 5 0 R ] /Type /Pages
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
9 0 obj
|
|
||||||
<<
|
|
||||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 210
|
|
||||||
>>
|
|
||||||
stream
|
|
||||||
Gap@Gb79+X'F"5[`EfJOD4:mD<%*=m+N>oDG,>NK`<U'B^0WYY,dWl^i_UcRk`<"L=<NPC$BtQ<5l$3<Y!?BuoCSYQ6GSt25lpqr0IrP?S[b)9%M"e'HHFqcRO'9eRaR0'DYi*Y.:nEMFAoTM;rPL%EF]`CfoELVl_Q,"LS:%iI;Nc[&bG.*65O]ecfK1'*<>5P_s[usI/ph*0pV~>endstream
|
|
||||||
endobj
|
|
||||||
10 0 obj
|
|
||||||
<<
|
|
||||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 209
|
|
||||||
>>
|
|
||||||
stream
|
|
||||||
Gap@Gb79+X'F"5Y`EfJOV2A9=!fB]F'tK1LS`,]G+MiTenb&V2-^hqa(5IE#Nr59/!"Qm*5_(BdF!0&h!Yhk/A+\iS'%6tuO$O)9LaZS+flr([1p2&#RS1p/gT[B;rDj-=&=iqUlj(P^/5U@eCFqn4:<lU`l`.HXqG-',hJH.DI.(6L\luSAW`Q'oje[qgVLVIXg%PXe+,<$7('~>endstream
|
|
||||||
endobj
|
|
||||||
11 0 obj
|
|
||||||
<<
|
|
||||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 209
|
|
||||||
>>
|
|
||||||
stream
|
|
||||||
Gap@GbmK%f(e+0_`ODoa2.):e/i+N3r(.o*Qf\gSNb(bt4FIubi@GIOE=p8Ir3;CbQ@KuG^cdJhODZKQ*upt+*rdZ%!mFmN$*.P)K;`s#]G=8AO3s3DGB.RCOn?[F]bEIg,a>25?B%dh\Z/C6opFE'el@I,P\u\V\]:*JYrrsNJ&d,11VL;$h!43eGu&1X6$+5-h\Vr6!+>4Je,~>endstream
|
|
||||||
endobj
|
|
||||||
xref
|
|
||||||
0 12
|
|
||||||
0000000000 65535 f
|
|
||||||
0000000073 00000 n
|
|
||||||
0000000104 00000 n
|
|
||||||
0000000211 00000 n
|
|
||||||
0000000404 00000 n
|
|
||||||
0000000598 00000 n
|
|
||||||
0000000792 00000 n
|
|
||||||
0000000860 00000 n
|
|
||||||
0000001156 00000 n
|
|
||||||
0000001227 00000 n
|
|
||||||
0000001527 00000 n
|
|
||||||
0000001827 00000 n
|
|
||||||
trailer
|
|
||||||
<<
|
|
||||||
/ID
|
|
||||||
[<0d5cf047e754e05f8d574f067785875c><0d5cf047e754e05f8d574f067785875c>]
|
|
||||||
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
|
|
||||||
|
|
||||||
/Info 7 0 R
|
|
||||||
/Root 6 0 R
|
|
||||||
/Size 12
|
|
||||||
>>
|
|
||||||
startxref
|
|
||||||
2127
|
|
||||||
%%EOF
|
|
||||||
@@ -1,106 +0,0 @@
|
|||||||
%PDF-1.3
|
|
||||||
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
|
|
||||||
1 0 obj
|
|
||||||
<<
|
|
||||||
/F1 2 0 R
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
2 0 obj
|
|
||||||
<<
|
|
||||||
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
3 0 obj
|
|
||||||
<<
|
|
||||||
/Contents 9 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
|
||||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
|
||||||
>> /Rotate 0 /Trans <<
|
|
||||||
|
|
||||||
>>
|
|
||||||
/Type /Page
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
4 0 obj
|
|
||||||
<<
|
|
||||||
/Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
|
||||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
|
||||||
>> /Rotate 0 /Trans <<
|
|
||||||
|
|
||||||
>>
|
|
||||||
/Type /Page
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
5 0 obj
|
|
||||||
<<
|
|
||||||
/Contents 11 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
|
||||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
|
||||||
>> /Rotate 0 /Trans <<
|
|
||||||
|
|
||||||
>>
|
|
||||||
/Type /Page
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
6 0 obj
|
|
||||||
<<
|
|
||||||
/PageMode /UseNone /Pages 8 0 R /Type /Catalog
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
7 0 obj
|
|
||||||
<<
|
|
||||||
/Author (anonymous) /CreationDate (D:20240718233034+00'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20240718233034+00'00') /Producer (ReportLab PDF Library - www.reportlab.com)
|
|
||||||
/Subject (unspecified) /Title (untitled) /Trapped /False
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
8 0 obj
|
|
||||||
<<
|
|
||||||
/Count 3 /Kids [ 3 0 R 4 0 R 5 0 R ] /Type /Pages
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
9 0 obj
|
|
||||||
<<
|
|
||||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 207
|
|
||||||
>>
|
|
||||||
stream
|
|
||||||
Gap@G:CDb.*/<p2MVk["e@)7*Z0@"b%+@f/9pA%_U<oOkVp?PnGRb81iPg?0i?(]%^_CSf##%;<!7Ne/-%RR^p@t7hKYZ9eJVHV]fjjHIB:6DrW+2\p16@*`r^CpQZZH'2Pjqd<.&hM2UO%$Wi$te%4QmS;<E"QS\!deQG_XtuEK>b(UbS>%`/0S`k\\5'TNY0mmgH?`8]i_0~>endstream
|
|
||||||
endobj
|
|
||||||
10 0 obj
|
|
||||||
<<
|
|
||||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 207
|
|
||||||
>>
|
|
||||||
stream
|
|
||||||
Gap@G]afWJ'Lm;=if<;s>V*7BTJ]oQ@P!(q5S+WG1%>L@?8Ue;c>[fY&&IOd5@t@TY@+q.5T<Z'81"J("KhsBa+&u4"n'#6)AjfImh)%$0tVC:aGk",=aJJH#/4]i.WJr9c"cibYm:M-44<%FFlG0Cl\Z'nmo7C"TR+7dk3T#iD(9Pq'\;rQku%o>A_`50SO&7M04=8M'O<Am~>endstream
|
|
||||||
endobj
|
|
||||||
11 0 obj
|
|
||||||
<<
|
|
||||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 209
|
|
||||||
>>
|
|
||||||
stream
|
|
||||||
Gap@GYmu@>'Ld5[if35r/JNaJ.A.7fP9RpSN*8k^-sEER0,enq1Rsuo@R/uCO-^&Y`F'9d^a?9)?ns+F&dXm[HMgPn6Ep+%TRk5Nh+!(+[H#H:U^.^(YL,PKS'%j/:3O\hJVEK-UUekJTd[A$N^((K^#0Du`i@,/^f5KiUISGr")3/+f9NF8NO1+iUgm^b"X\cE^+[:s!0]Gu6i~>endstream
|
|
||||||
endobj
|
|
||||||
xref
|
|
||||||
0 12
|
|
||||||
0000000000 65535 f
|
|
||||||
0000000073 00000 n
|
|
||||||
0000000104 00000 n
|
|
||||||
0000000211 00000 n
|
|
||||||
0000000404 00000 n
|
|
||||||
0000000598 00000 n
|
|
||||||
0000000792 00000 n
|
|
||||||
0000000860 00000 n
|
|
||||||
0000001156 00000 n
|
|
||||||
0000001227 00000 n
|
|
||||||
0000001524 00000 n
|
|
||||||
0000001822 00000 n
|
|
||||||
trailer
|
|
||||||
<<
|
|
||||||
/ID
|
|
||||||
[<407fc55425168745e56176202aad30c9><407fc55425168745e56176202aad30c9>]
|
|
||||||
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
|
|
||||||
|
|
||||||
/Info 7 0 R
|
|
||||||
/Root 6 0 R
|
|
||||||
/Size 12
|
|
||||||
>>
|
|
||||||
startxref
|
|
||||||
2122
|
|
||||||
%%EOF
|
|
||||||
@@ -1,106 +0,0 @@
|
|||||||
%PDF-1.3
|
|
||||||
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
|
|
||||||
1 0 obj
|
|
||||||
<<
|
|
||||||
/F1 2 0 R
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
2 0 obj
|
|
||||||
<<
|
|
||||||
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
3 0 obj
|
|
||||||
<<
|
|
||||||
/Contents 9 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
|
||||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
|
||||||
>> /Rotate 0 /Trans <<
|
|
||||||
|
|
||||||
>>
|
|
||||||
/Type /Page
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
4 0 obj
|
|
||||||
<<
|
|
||||||
/Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
|
||||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
|
||||||
>> /Rotate 0 /Trans <<
|
|
||||||
|
|
||||||
>>
|
|
||||||
/Type /Page
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
5 0 obj
|
|
||||||
<<
|
|
||||||
/Contents 11 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
|
||||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
|
||||||
>> /Rotate 0 /Trans <<
|
|
||||||
|
|
||||||
>>
|
|
||||||
/Type /Page
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
6 0 obj
|
|
||||||
<<
|
|
||||||
/PageMode /UseNone /Pages 8 0 R /Type /Catalog
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
7 0 obj
|
|
||||||
<<
|
|
||||||
/Author (anonymous) /CreationDate (D:20240718233034+00'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20240718233034+00'00') /Producer (ReportLab PDF Library - www.reportlab.com)
|
|
||||||
/Subject (unspecified) /Title (untitled) /Trapped /False
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
8 0 obj
|
|
||||||
<<
|
|
||||||
/Count 3 /Kids [ 3 0 R 4 0 R 5 0 R ] /Type /Pages
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
9 0 obj
|
|
||||||
<<
|
|
||||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 209
|
|
||||||
>>
|
|
||||||
stream
|
|
||||||
Gap@G]+0EH(e/_@iZH]:>:>hu1e>07BJg5<'#:.C1n)e#(QJ6R1Rsuo_gpn.+0-H5$/#"iYR[B.9\'>7!aDAC*rf/t&6O#aH<?-7IT'\?X(&TcABG=ON*Nq`4k=o&p@3,0*31r<)TAP2Pk94p0\"R-_sY1$AYo[8B\?4R>feLAB\mpjZhp"`@J3;"Fm97#9+W,"eb95\+#p\^HN~>endstream
|
|
||||||
endobj
|
|
||||||
10 0 obj
|
|
||||||
<<
|
|
||||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 209
|
|
||||||
>>
|
|
||||||
stream
|
|
||||||
Gap@G]+0EX'Eriuig+>QHNeD'#n%Sq#n%BW`C'uDUOYK)HdS4E9JMsp+HUmDj&H-t*4?UamXX0peVspk"i_@ba+&u"J>UYDKV_^G,7V==aTZZ<YO7:sNSQ[6"Ja-29NtYjd#=`J@D'h+[QW=:EEb?A<k!f+\`g^?,Vgp7_)91[lR\f.Tkf7VIPLVYM&deF!aYt9Ip^"N",3F'*W~>endstream
|
|
||||||
endobj
|
|
||||||
11 0 obj
|
|
||||||
<<
|
|
||||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 209
|
|
||||||
>>
|
|
||||||
stream
|
|
||||||
Gap@G]+0EH(e/_@iZH]:>J`g!jPCLm;?AgU"fdk"PQZD\d?lRI_oWc[$tp^]O\:3fK8kWeX2&Jcg0+RoJ]j;2j*upu!b4.o&f)b$I@7CfIYjP^#\VjhC=QhQ]^lV-@<0Tam!0.+Dn@("AK%N,Uc7hb+6VoQ$q2q[7]BB92RoY/.j2N028i1jNf'@<1+Fqf$1&"8omHk`#DHP>OT~>endstream
|
|
||||||
endobj
|
|
||||||
xref
|
|
||||||
0 12
|
|
||||||
0000000000 65535 f
|
|
||||||
0000000073 00000 n
|
|
||||||
0000000104 00000 n
|
|
||||||
0000000211 00000 n
|
|
||||||
0000000404 00000 n
|
|
||||||
0000000598 00000 n
|
|
||||||
0000000792 00000 n
|
|
||||||
0000000860 00000 n
|
|
||||||
0000001156 00000 n
|
|
||||||
0000001227 00000 n
|
|
||||||
0000001526 00000 n
|
|
||||||
0000001826 00000 n
|
|
||||||
trailer
|
|
||||||
<<
|
|
||||||
/ID
|
|
||||||
[<80da26147a484f2b7573da8151a93d2e><80da26147a484f2b7573da8151a93d2e>]
|
|
||||||
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
|
|
||||||
|
|
||||||
/Info 7 0 R
|
|
||||||
/Root 6 0 R
|
|
||||||
/Size 12
|
|
||||||
>>
|
|
||||||
startxref
|
|
||||||
2126
|
|
||||||
%%EOF
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,106 +0,0 @@
|
|||||||
%PDF-1.3
|
|
||||||
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
|
|
||||||
1 0 obj
|
|
||||||
<<
|
|
||||||
/F1 2 0 R
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
2 0 obj
|
|
||||||
<<
|
|
||||||
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
3 0 obj
|
|
||||||
<<
|
|
||||||
/Contents 9 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
|
||||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
|
||||||
>> /Rotate 0 /Trans <<
|
|
||||||
|
|
||||||
>>
|
|
||||||
/Type /Page
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
4 0 obj
|
|
||||||
<<
|
|
||||||
/Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
|
||||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
|
||||||
>> /Rotate 0 /Trans <<
|
|
||||||
|
|
||||||
>>
|
|
||||||
/Type /Page
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
5 0 obj
|
|
||||||
<<
|
|
||||||
/Contents 11 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
|
||||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
|
||||||
>> /Rotate 0 /Trans <<
|
|
||||||
|
|
||||||
>>
|
|
||||||
/Type /Page
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
6 0 obj
|
|
||||||
<<
|
|
||||||
/PageMode /UseNone /Pages 8 0 R /Type /Catalog
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
7 0 obj
|
|
||||||
<<
|
|
||||||
/Author (anonymous) /CreationDate (D:20240718233034+00'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20240718233034+00'00') /Producer (ReportLab PDF Library - www.reportlab.com)
|
|
||||||
/Subject (unspecified) /Title (untitled) /Trapped /False
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
8 0 obj
|
|
||||||
<<
|
|
||||||
/Count 3 /Kids [ 3 0 R 4 0 R 5 0 R ] /Type /Pages
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
9 0 obj
|
|
||||||
<<
|
|
||||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 206
|
|
||||||
>>
|
|
||||||
stream
|
|
||||||
Gap@G\IO3f&4Lr[@S4&T2aReWZ3N'9",Ncra>5AuK^J(o@r?=EP>b]h[L@XZ8q7#[c:#H2:^/=b,p3^,&f-Q.'H%!U?%N\iVa1pLMlh/41\A8@dF5@0al:-1?L;D%LpL3g\9`.3c6N/Mp=sE/nO%^@%Cc3`]e`qqS@[pkUWemMZC<P\fkqa55u)*hIUoU437-gb!e_*&B/,&~>endstream
|
|
||||||
endobj
|
|
||||||
10 0 obj
|
|
||||||
<<
|
|
||||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 209
|
|
||||||
>>
|
|
||||||
stream
|
|
||||||
Gap@G\IO3V'LdA_ig"8P1PS=kA5Q_GQ\P]*S3\>Q`jHYt?8UdkV`6]UV*On)+1VMV+A@.iF:*6sWfM9f"s.NmVuMto!p7-+,Rb<.h,pdi-&OQ5KO\RRFj.j"A)ScTQ7$hudF^TnZ'XuQA5"O]rYkt><-DJmj'"Ri>n!4`^m409XX`e)AR'*rGsn6m79.18+^ba=qRuss"-A3k+9~>endstream
|
|
||||||
endobj
|
|
||||||
11 0 obj
|
|
||||||
<<
|
|
||||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 210
|
|
||||||
>>
|
|
||||||
stream
|
|
||||||
Gap@G]+0EH(e/_@iZH]:.1fBHK`Xl'[i1&AjX(\k8hbgo(QJ6R1Rsuo6_I1A5Gg$JL;D#$J2CX;+Cf*cUHk2%H1XmpWe+qZ5moJ#B]>b%%[d,mfSSkS4A:Q4NlOFfrL7eA,s45"eUSakM;927AA,1"-LZ)&nZ/ah=8_X7:?ZMj@J@;r7d`t]Z0\d39M%:$k8[S5D"2oSap4s80l?~>endstream
|
|
||||||
endobj
|
|
||||||
xref
|
|
||||||
0 12
|
|
||||||
0000000000 65535 f
|
|
||||||
0000000073 00000 n
|
|
||||||
0000000104 00000 n
|
|
||||||
0000000211 00000 n
|
|
||||||
0000000404 00000 n
|
|
||||||
0000000598 00000 n
|
|
||||||
0000000792 00000 n
|
|
||||||
0000000860 00000 n
|
|
||||||
0000001156 00000 n
|
|
||||||
0000001227 00000 n
|
|
||||||
0000001523 00000 n
|
|
||||||
0000001823 00000 n
|
|
||||||
trailer
|
|
||||||
<<
|
|
||||||
/ID
|
|
||||||
[<88edee24ee67bd7d6b7cf53cfa2222b0><88edee24ee67bd7d6b7cf53cfa2222b0>]
|
|
||||||
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
|
|
||||||
|
|
||||||
/Info 7 0 R
|
|
||||||
/Root 6 0 R
|
|
||||||
/Size 12
|
|
||||||
>>
|
|
||||||
startxref
|
|
||||||
2124
|
|
||||||
%%EOF
|
|
||||||
@@ -1,106 +0,0 @@
|
|||||||
%PDF-1.3
|
|
||||||
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
|
|
||||||
1 0 obj
|
|
||||||
<<
|
|
||||||
/F1 2 0 R
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
2 0 obj
|
|
||||||
<<
|
|
||||||
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
3 0 obj
|
|
||||||
<<
|
|
||||||
/Contents 9 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
|
||||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
|
||||||
>> /Rotate 0 /Trans <<
|
|
||||||
|
|
||||||
>>
|
|
||||||
/Type /Page
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
4 0 obj
|
|
||||||
<<
|
|
||||||
/Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
|
||||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
|
||||||
>> /Rotate 0 /Trans <<
|
|
||||||
|
|
||||||
>>
|
|
||||||
/Type /Page
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
5 0 obj
|
|
||||||
<<
|
|
||||||
/Contents 11 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
|
||||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
|
||||||
>> /Rotate 0 /Trans <<
|
|
||||||
|
|
||||||
>>
|
|
||||||
/Type /Page
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
6 0 obj
|
|
||||||
<<
|
|
||||||
/PageMode /UseNone /Pages 8 0 R /Type /Catalog
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
7 0 obj
|
|
||||||
<<
|
|
||||||
/Author (anonymous) /CreationDate (D:20240718233034+00'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20240718233034+00'00') /Producer (ReportLab PDF Library - www.reportlab.com)
|
|
||||||
/Subject (unspecified) /Title (untitled) /Trapped /False
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
8 0 obj
|
|
||||||
<<
|
|
||||||
/Count 3 /Kids [ 3 0 R 4 0 R 5 0 R ] /Type /Pages
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
9 0 obj
|
|
||||||
<<
|
|
||||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 209
|
|
||||||
>>
|
|
||||||
stream
|
|
||||||
Gap@GYmu@>'Ld5[if35rI0]sG)F[U^"c>T)"\\os-r:1V0,enq1Rsuo,*67.@k7U.LRF-P.e"CM2V!>iYi<g`nXh!K?n@$t^rY1$+^0'>=B8H6e;F1WmG#,(eS00(Qe9&:O@nI879DTsT,njXAB?`8:>,Hn3*RV!qh4;&@6%]<9Y*>QZ].Z5o;RAZXg7d[#+bphHs_Ep!QR2TZ2~>endstream
|
|
||||||
endobj
|
|
||||||
10 0 obj
|
|
||||||
<<
|
|
||||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 210
|
|
||||||
>>
|
|
||||||
stream
|
|
||||||
Gap@G]+0EH(e/_@iZH]:>=,iY1bE)XN?M;1'J/>i&HY;gks]*rj:!DKpb8@`prC#N+9E#o#-<G*!#p7e6j-1sX2k5S,6XmM"taYkfK^k">%usEeEk=sR<UT"dm`rXD;!S`_jS9LU+(R%e'V%WSMfHP.pXZEQqTQq=&D[I[PS(41(NIAZ1R/U?:Z=hSXu!NDF)bpG2F+/I/q/u1-Y~>endstream
|
|
||||||
endobj
|
|
||||||
11 0 obj
|
|
||||||
<<
|
|
||||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 209
|
|
||||||
>>
|
|
||||||
stream
|
|
||||||
Gap@G_$YcZ'LhbF`EQB$nqi=8S<;#HbK3&f>rnodRPo`Vf4P[3cJidY(I=[K5NWCT'<lHgci?oCRVNST&[k#q4oSC0FWgAt1pD4d_(hIRjn_Nt+cFgJlfm[1U8@/M4r^Pk<@F!@e?%/!-Vq;]nfdLi9]P2M)ck9?)%oNXa_\N<-d"(pjlH%-G`T@Sj&P(j6.@#Xh\Vr6!1iI2/H~>endstream
|
|
||||||
endobj
|
|
||||||
xref
|
|
||||||
0 12
|
|
||||||
0000000000 65535 f
|
|
||||||
0000000073 00000 n
|
|
||||||
0000000104 00000 n
|
|
||||||
0000000211 00000 n
|
|
||||||
0000000404 00000 n
|
|
||||||
0000000598 00000 n
|
|
||||||
0000000792 00000 n
|
|
||||||
0000000860 00000 n
|
|
||||||
0000001156 00000 n
|
|
||||||
0000001227 00000 n
|
|
||||||
0000001526 00000 n
|
|
||||||
0000001827 00000 n
|
|
||||||
trailer
|
|
||||||
<<
|
|
||||||
/ID
|
|
||||||
[<4fcc82a085fe71e34a32d1b23c8b939f><4fcc82a085fe71e34a32d1b23c8b939f>]
|
|
||||||
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
|
|
||||||
|
|
||||||
/Info 7 0 R
|
|
||||||
/Root 6 0 R
|
|
||||||
/Size 12
|
|
||||||
>>
|
|
||||||
startxref
|
|
||||||
2127
|
|
||||||
%%EOF
|
|
||||||
@@ -14,8 +14,3 @@ def after_scenario(context, scenario):
|
|||||||
os.remove('response_file')
|
os.remove('response_file')
|
||||||
if hasattr(context, 'file_name') and os.path.exists(context.file_name):
|
if hasattr(context, 'file_name') and os.path.exists(context.file_name):
|
||||||
os.remove(context.file_name)
|
os.remove(context.file_name)
|
||||||
|
|
||||||
# Remove any temporary files
|
|
||||||
for temp_file in os.listdir('.'):
|
|
||||||
if temp_file.startswith('genericNonCustomisableName') or temp_file.startswith('temp_image_'):
|
|
||||||
os.remove(temp_file)
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
@example @general
|
@example
|
||||||
Feature: API Validation
|
Feature: API Validation
|
||||||
|
|
||||||
@positive @password
|
@positive @password
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ Feature: API Validation
|
|||||||
@ocr @positive
|
@ocr @positive
|
||||||
Scenario: Extract Image Scans
|
Scenario: Extract Image Scans
|
||||||
Given I generate a PDF file as "fileInput"
|
Given I generate a PDF file as "fileInput"
|
||||||
And the pdf contains 3 images of size 300x300 on 2 pages
|
And the pdf contains 3 images on 2 pages
|
||||||
And the request data includes
|
And the request data includes
|
||||||
| parameter | value |
|
| parameter | value |
|
||||||
| angleThreshold | 5 |
|
| angleThreshold | 5 |
|
||||||
@@ -125,7 +125,8 @@ Feature: API Validation
|
|||||||
|
|
||||||
@ocr
|
@ocr
|
||||||
Scenario: PDFA
|
Scenario: PDFA
|
||||||
Given I use an example file at "exampleFiles/pdfa2.pdf" as parameter "fileInput"
|
Given I generate a PDF file as "fileInput"
|
||||||
|
And the pdf contains 3 pages with random text
|
||||||
And the request data includes
|
And the request data includes
|
||||||
| parameter | value |
|
| parameter | value |
|
||||||
| outputFormat | pdfa |
|
| outputFormat | pdfa |
|
||||||
@@ -136,7 +137,8 @@ Feature: API Validation
|
|||||||
|
|
||||||
@ocr
|
@ocr
|
||||||
Scenario: PDFA1
|
Scenario: PDFA1
|
||||||
Given I use an example file at "exampleFiles/pdfa1.pdf" as parameter "fileInput"
|
Given I generate a PDF file as "fileInput"
|
||||||
|
And the pdf contains 3 pages with random text
|
||||||
And the request data includes
|
And the request data includes
|
||||||
| parameter | value |
|
| parameter | value |
|
||||||
| outputFormat | pdfa-1 |
|
| outputFormat | pdfa-1 |
|
||||||
@@ -147,7 +149,8 @@ Feature: API Validation
|
|||||||
|
|
||||||
@compress @ghostscript @positive
|
@compress @ghostscript @positive
|
||||||
Scenario: Compress
|
Scenario: Compress
|
||||||
Given I use an example file at "exampleFiles/ghost3.pdf" as parameter "fileInput"
|
Given I generate a PDF file as "fileInput"
|
||||||
|
And the pdf contains 3 pages with random text
|
||||||
And the request data includes
|
And the request data includes
|
||||||
| parameter | value |
|
| parameter | value |
|
||||||
| optimizeLevel | 4 |
|
| optimizeLevel | 4 |
|
||||||
@@ -158,7 +161,8 @@ Feature: API Validation
|
|||||||
|
|
||||||
@compress @ghostscript @positive
|
@compress @ghostscript @positive
|
||||||
Scenario: Compress
|
Scenario: Compress
|
||||||
Given I use an example file at "exampleFiles/ghost2.pdf" as parameter "fileInput"
|
Given I generate a PDF file as "fileInput"
|
||||||
|
And the pdf contains 3 pages with random text
|
||||||
And the request data includes
|
And the request data includes
|
||||||
| parameter | value |
|
| parameter | value |
|
||||||
| optimizeLevel | 1 |
|
| optimizeLevel | 1 |
|
||||||
@@ -171,7 +175,8 @@ Feature: API Validation
|
|||||||
|
|
||||||
@compress @ghostscript @positive
|
@compress @ghostscript @positive
|
||||||
Scenario: Compress
|
Scenario: Compress
|
||||||
Given I use an example file at "exampleFiles/ghost1.pdf" as parameter "fileInput"
|
Given I generate a PDF file as "fileInput"
|
||||||
|
And the pdf contains 3 pages with random text
|
||||||
And the request data includes
|
And the request data includes
|
||||||
| parameter | value |
|
| parameter | value |
|
||||||
| optimizeLevel | 1 |
|
| optimizeLevel | 1 |
|
||||||
|
|||||||
@@ -94,23 +94,3 @@ Feature: API Validation
|
|||||||
| 1 | 10 | 2 | 10 |
|
| 1 | 10 | 2 | 10 |
|
||||||
|
|
||||||
|
|
||||||
@extract-images
|
|
||||||
Scenario Outline: Extract Image Scans
|
|
||||||
Given I use an example file at "exampleFiles/images.pdf" as parameter "fileInput"
|
|
||||||
And the request data includes
|
|
||||||
| parameter | value |
|
|
||||||
| format | <format> |
|
|
||||||
When I send the API request to the endpoint "/api/v1/misc/extract-images"
|
|
||||||
Then the response content type should be "application/octet-stream"
|
|
||||||
And the response file should have extension ".zip"
|
|
||||||
And the response ZIP should contain 20 files
|
|
||||||
And the response file should have size greater than 0
|
|
||||||
And the response status code should be 200
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
| format |
|
|
||||||
| png |
|
|
||||||
| gif |
|
|
||||||
| jpeg |
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,14 +6,11 @@ import io
|
|||||||
import random
|
import random
|
||||||
import string
|
import string
|
||||||
from reportlab.lib.pagesizes import letter
|
from reportlab.lib.pagesizes import letter
|
||||||
from reportlab.lib.utils import ImageReader
|
|
||||||
from reportlab.pdfgen import canvas
|
from reportlab.pdfgen import canvas
|
||||||
import mimetypes
|
import mimetypes
|
||||||
import requests
|
import requests
|
||||||
import zipfile
|
import zipfile
|
||||||
import shutil
|
import shutil
|
||||||
import re
|
|
||||||
from PIL import Image, ImageDraw
|
|
||||||
|
|
||||||
#########
|
#########
|
||||||
# GIVEN #
|
# GIVEN #
|
||||||
@@ -46,6 +43,8 @@ def step_use_example_file(context, filePath, fileInput):
|
|||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
raise FileNotFoundError(f"The example file '{filePath}' does not exist.")
|
raise FileNotFoundError(f"The example file '{filePath}' does not exist.")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@given('the pdf contains {page_count:d} pages')
|
@given('the pdf contains {page_count:d} pages')
|
||||||
def step_pdf_contains_pages(context, page_count):
|
def step_pdf_contains_pages(context, page_count):
|
||||||
writer = PdfWriter()
|
writer = PdfWriter()
|
||||||
@@ -67,6 +66,8 @@ def step_pdf_contains_blank_pages(context, page_count):
|
|||||||
context.files[context.param_name].close()
|
context.files[context.param_name].close()
|
||||||
context.files[context.param_name] = open(context.file_name, 'rb')
|
context.files[context.param_name] = open(context.file_name, 'rb')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def create_black_box_image(file_name, size):
|
def create_black_box_image(file_name, size):
|
||||||
can = canvas.Canvas(file_name, pagesize=size)
|
can = canvas.Canvas(file_name, pagesize=size)
|
||||||
width, height = size
|
width, height = size
|
||||||
@@ -75,75 +76,36 @@ def create_black_box_image(file_name, size):
|
|||||||
can.showPage()
|
can.showPage()
|
||||||
can.save()
|
can.save()
|
||||||
|
|
||||||
@given(u'the pdf contains {image_count:d} images of size {width:d}x{height:d} on {page_count:d} pages')
|
def create_pdf_with_black_boxes(file_name, image_count, page_count):
|
||||||
def step_impl(context, image_count, width, height, page_count):
|
page_width, page_height = letter
|
||||||
context.param_name = "fileInput"
|
box_size = 72 # 1 inch by 1 inch black box
|
||||||
context.file_name = "genericNonCustomisableName.pdf"
|
|
||||||
create_pdf_with_images_and_boxes(context.file_name, image_count, page_count, width, height)
|
|
||||||
if not hasattr(context, 'files'):
|
|
||||||
context.files = {}
|
|
||||||
context.files[context.param_name] = open(context.file_name, 'rb')
|
|
||||||
|
|
||||||
def add_black_boxes_to_image(image):
|
|
||||||
if isinstance(image, str):
|
|
||||||
image = Image.open(image)
|
|
||||||
|
|
||||||
draw = ImageDraw.Draw(image)
|
|
||||||
draw.rectangle([(0, 0), image.size], fill=(0, 0, 0)) # Fill image with black
|
|
||||||
return image
|
|
||||||
|
|
||||||
def create_pdf_with_images_and_boxes(file_name, image_count, page_count, image_width, image_height):
|
|
||||||
page_width, page_height = max(letter[0], image_width), max(letter[1], image_height)
|
|
||||||
boxes_per_page = image_count // page_count + (1 if image_count % page_count != 0 else 0)
|
boxes_per_page = image_count // page_count + (1 if image_count % page_count != 0 else 0)
|
||||||
|
|
||||||
writer = PdfWriter()
|
writer = PdfWriter()
|
||||||
box_counter = 0
|
box_counter = 0
|
||||||
|
|
||||||
for page in range(page_count):
|
for page in range(page_count):
|
||||||
packet = io.BytesIO()
|
packet = io.BytesIO()
|
||||||
can = canvas.Canvas(packet, pagesize=(page_width, page_height))
|
can = canvas.Canvas(packet, pagesize=letter)
|
||||||
|
|
||||||
for i in range(boxes_per_page):
|
for i in range(boxes_per_page):
|
||||||
if box_counter >= image_count:
|
if box_counter >= image_count:
|
||||||
break
|
break
|
||||||
|
x = (i % (page_width // box_size)) * box_size
|
||||||
# Simulating a dynamic image creation (replace this with your actual image creation logic)
|
y = page_height - ((i // (page_width // box_size) + 1) * box_size)
|
||||||
# For demonstration, we'll create a simple black image
|
can.setFillColorRGB(0, 0, 0)
|
||||||
dummy_image = Image.new('RGB', (image_width, image_height), color='white') # Create a white image
|
can.rect(x, y, box_size, box_size, fill=1)
|
||||||
dummy_image = add_black_boxes_to_image(dummy_image) # Add black boxes
|
|
||||||
|
|
||||||
# Convert the PIL Image to bytes to pass to drawImage
|
|
||||||
image_bytes = io.BytesIO()
|
|
||||||
dummy_image.save(image_bytes, format='PNG')
|
|
||||||
image_bytes.seek(0)
|
|
||||||
|
|
||||||
# Check if the image fits in the current page dimensions
|
|
||||||
x = (i % (page_width // image_width)) * image_width
|
|
||||||
y = page_height - (((i % (page_height // image_height)) + 1) * image_height)
|
|
||||||
|
|
||||||
if x + image_width > page_width or y < 0:
|
|
||||||
break
|
|
||||||
|
|
||||||
# Add the image to the PDF
|
|
||||||
can.drawImage(ImageReader(image_bytes), x, y, width=image_width, height=image_height)
|
|
||||||
box_counter += 1
|
box_counter += 1
|
||||||
|
|
||||||
can.showPage()
|
can.showPage()
|
||||||
can.save()
|
can.save()
|
||||||
packet.seek(0)
|
packet.seek(0)
|
||||||
new_pdf = PdfReader(packet)
|
new_pdf = PdfReader(packet)
|
||||||
writer.add_page(new_pdf.pages[0])
|
writer.add_page(new_pdf.pages[0])
|
||||||
|
|
||||||
# Write the PDF to file
|
|
||||||
with open(file_name, 'wb') as f:
|
with open(file_name, 'wb') as f:
|
||||||
writer.write(f)
|
writer.write(f)
|
||||||
|
|
||||||
# Clean up temporary image files
|
|
||||||
for i in range(image_count):
|
|
||||||
temp_image_path = f"temp_image_{i}.png"
|
|
||||||
if os.path.exists(temp_image_path):
|
|
||||||
os.remove(temp_image_path)
|
|
||||||
|
|
||||||
@given('the pdf contains {image_count:d} images on {page_count:d} pages')
|
@given('the pdf contains {image_count:d} images on {page_count:d} pages')
|
||||||
def step_pdf_contains_images(context, image_count, page_count):
|
def step_pdf_contains_images(context, image_count, page_count):
|
||||||
if not hasattr(context, 'param_name'):
|
if not hasattr(context, 'param_name'):
|
||||||
@@ -156,6 +118,7 @@ def step_pdf_contains_images(context, image_count, page_count):
|
|||||||
context.files[context.param_name].close()
|
context.files[context.param_name].close()
|
||||||
context.files[context.param_name] = open(context.file_name, 'rb')
|
context.files[context.param_name] = open(context.file_name, 'rb')
|
||||||
|
|
||||||
|
|
||||||
@given('the pdf contains {page_count:d} pages with random text')
|
@given('the pdf contains {page_count:d} pages with random text')
|
||||||
def step_pdf_contains_pages_with_random_text(context, page_count):
|
def step_pdf_contains_pages_with_random_text(context, page_count):
|
||||||
buffer = io.BytesIO()
|
buffer = io.BytesIO()
|
||||||
@@ -223,21 +186,6 @@ def save_generated_pdf(context, filename):
|
|||||||
# WHEN #
|
# WHEN #
|
||||||
########
|
########
|
||||||
|
|
||||||
@when('I send a GET request to "{endpoint}"')
|
|
||||||
def step_send_get_request(context, endpoint):
|
|
||||||
base_url = "http://localhost:8080"
|
|
||||||
full_url = f"{base_url}{endpoint}"
|
|
||||||
response = requests.get(full_url)
|
|
||||||
context.response = response
|
|
||||||
|
|
||||||
@when('I send a GET request to "{endpoint}" with parameters')
|
|
||||||
def step_send_get_request_with_params(context, endpoint):
|
|
||||||
base_url = "http://localhost:8080"
|
|
||||||
params = {row['parameter']: row['value'] for row in context.table}
|
|
||||||
full_url = f"{base_url}{endpoint}"
|
|
||||||
response = requests.get(full_url, params=params)
|
|
||||||
context.response = response
|
|
||||||
|
|
||||||
@when('I send the API request to the endpoint "{endpoint}"')
|
@when('I send the API request to the endpoint "{endpoint}"')
|
||||||
def step_send_api_request(context, endpoint):
|
def step_send_api_request(context, endpoint):
|
||||||
url = f"http://localhost:8080{endpoint}"
|
url = f"http://localhost:8080{endpoint}"
|
||||||
@@ -330,6 +278,7 @@ def step_save_response_file(context, filename):
|
|||||||
f.write(context.response.content)
|
f.write(context.response.content)
|
||||||
print(f"Saved response content to {filename}")
|
print(f"Saved response content to {filename}")
|
||||||
|
|
||||||
|
|
||||||
@then('the response PDF should contain {page_count:d} pages')
|
@then('the response PDF should contain {page_count:d} pages')
|
||||||
def step_check_response_pdf_page_count(context, page_count):
|
def step_check_response_pdf_page_count(context, page_count):
|
||||||
response_file = io.BytesIO(context.response.content)
|
response_file = io.BytesIO(context.response.content)
|
||||||
@@ -356,26 +305,3 @@ def step_check_response_zip_doc_page_count(context, doc_count, pages_per_doc):
|
|||||||
reader = PdfReader(pdf_file)
|
reader = PdfReader(pdf_file)
|
||||||
actual_pages_per_doc = len(reader.pages)
|
actual_pages_per_doc = len(reader.pages)
|
||||||
assert actual_pages_per_doc == pages_per_doc, f"Expected {pages_per_doc} pages per document but got {actual_pages_per_doc} pages in document {file_name}"
|
assert actual_pages_per_doc == pages_per_doc, f"Expected {pages_per_doc} pages per document but got {actual_pages_per_doc} pages in document {file_name}"
|
||||||
|
|
||||||
@then('the JSON value of "{key}" should be "{expected_value}"')
|
|
||||||
def step_check_json_value(context, key, expected_value):
|
|
||||||
actual_value = context.response.json().get(key)
|
|
||||||
assert actual_value == expected_value, \
|
|
||||||
f"Expected JSON value for '{key}' to be '{expected_value}' but got '{actual_value}'"
|
|
||||||
|
|
||||||
@then('JSON list entry containing "{identifier_key}" as "{identifier_value}" should have "{target_key}" as "{target_value}"')
|
|
||||||
def step_check_json_list_entry(context, identifier_key, identifier_self, target_key, target_value):
|
|
||||||
json_response = context.response.json()
|
|
||||||
for entry in json_response:
|
|
||||||
if entry.get(identifier_key) == identifier_value:
|
|
||||||
assert entry.get(target_key) == target_value, \
|
|
||||||
f"Expected {target_key} to be {target_value} in entry where {identifier_key} is {identifier_value}, but found {entry.get(target_key)}"
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
raise AssertionError(f"No entry with {identifier_key} as {identifier_value} found")
|
|
||||||
|
|
||||||
@then('the response should match the regex "{pattern}"')
|
|
||||||
def step_response_matches_regex(context, pattern):
|
|
||||||
response_text = context.response.text
|
|
||||||
assert re.match(pattern, response_text), \
|
|
||||||
f"Response '{response_text}' does not match the expected pattern '{pattern}'"
|
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ services:
|
|||||||
DOCKER_ENABLE_SECURITY: "false"
|
DOCKER_ENABLE_SECURITY: "false"
|
||||||
SECURITY_ENABLELOGIN: "false"
|
SECURITY_ENABLELOGIN: "false"
|
||||||
LANGS: "en_GB,en_US,ar_AR,de_DE,fr_FR,es_ES,zh_CN,zh_TW,ca_CA,it_IT,sv_SE,pl_PL,ro_RO,ko_KR,pt_BR,ru_RU,el_GR,hi_IN,hu_HU,tr_TR,id_ID"
|
LANGS: "en_GB,en_US,ar_AR,de_DE,fr_FR,es_ES,zh_CN,zh_TW,ca_CA,it_IT,sv_SE,pl_PL,ro_RO,ko_KR,pt_BR,ru_RU,el_GR,hi_IN,hu_HU,tr_TR,id_ID"
|
||||||
|
INSTALL_BOOK_AND_ADVANCED_HTML_OPS: "true"
|
||||||
SYSTEM_DEFAULTLOCALE: en-US
|
SYSTEM_DEFAULTLOCALE: en-US
|
||||||
UI_APPNAME: Stirling-PDF
|
UI_APPNAME: Stirling-PDF
|
||||||
UI_HOMEDESCRIPTION: Demo site for Stirling-PDF Latest
|
UI_HOMEDESCRIPTION: Demo site for Stirling-PDF Latest
|
||||||
|
|||||||
@@ -212,14 +212,6 @@ ignore = [
|
|||||||
'language.direction',
|
'language.direction',
|
||||||
]
|
]
|
||||||
|
|
||||||
[th_TH]
|
|
||||||
ignore = [
|
|
||||||
'language.direction',
|
|
||||||
'pipeline.title',
|
|
||||||
'pipelineOptions.pipelineHeader',
|
|
||||||
'showJS.tags',
|
|
||||||
]
|
|
||||||
|
|
||||||
[tr_TR]
|
[tr_TR]
|
||||||
ignore = [
|
ignore = [
|
||||||
'language.direction',
|
'language.direction',
|
||||||
|
|||||||
@@ -12,8 +12,7 @@ fi
|
|||||||
umask "$UMASK" || true
|
umask "$UMASK" || true
|
||||||
|
|
||||||
if [[ "$INSTALL_BOOK_AND_ADVANCED_HTML_OPS" == "true" && "$FAT_DOCKER" != "true" ]]; then
|
if [[ "$INSTALL_BOOK_AND_ADVANCED_HTML_OPS" == "true" && "$FAT_DOCKER" != "true" ]]; then
|
||||||
echo "issue with calibre in current version, feature currently disabled on Stirling-PDF"
|
apk add --no-cache calibre@testing
|
||||||
#apk add --no-cache calibre@testing
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$FAT_DOCKER" != "true" ]]; then
|
if [[ "$FAT_DOCKER" != "true" ]]; then
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import java.nio.file.Paths;
|
|||||||
import java.nio.file.attribute.BasicFileAttributes;
|
import java.nio.file.attribute.BasicFileAttributes;
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.DriverManager;
|
import java.sql.DriverManager;
|
||||||
import java.sql.PreparedStatement;
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.sql.Statement;
|
import java.sql.Statement;
|
||||||
@@ -132,12 +131,11 @@ public class DatabaseBackupHelper implements DatabaseBackupInterface {
|
|||||||
DateTimeFormatter myFormatObj = DateTimeFormatter.ofPattern("yyyyMMddHHmm");
|
DateTimeFormatter myFormatObj = DateTimeFormatter.ofPattern("yyyyMMddHHmm");
|
||||||
Path insertOutputFilePath =
|
Path insertOutputFilePath =
|
||||||
this.getBackupFilePath("backup_" + dateNow.format(myFormatObj) + ".sql");
|
this.getBackupFilePath("backup_" + dateNow.format(myFormatObj) + ".sql");
|
||||||
String query = "SCRIPT SIMPLE COLUMNS DROP to ?;";
|
String query = "SCRIPT SIMPLE COLUMNS DROP to '" + insertOutputFilePath.toString() + "';";
|
||||||
|
|
||||||
try (Connection conn = DriverManager.getConnection(url, "sa", "");
|
try (Connection conn = DriverManager.getConnection(url, "sa", "");
|
||||||
PreparedStatement stmt = conn.prepareStatement(query)) {
|
Statement stmt = conn.createStatement()) {
|
||||||
stmt.setString(1, insertOutputFilePath.toString());
|
stmt.execute(query);
|
||||||
stmt.execute();
|
|
||||||
log.info("Database export completed: {}", insertOutputFilePath);
|
log.info("Database export completed: {}", insertOutputFilePath);
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
log.error("Error during database export: {}", e.getMessage(), e);
|
log.error("Error during database export: {}", e.getMessage(), e);
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ public class CompressController {
|
|||||||
List<String> command = new ArrayList<>();
|
List<String> command = new ArrayList<>();
|
||||||
command.add("gs");
|
command.add("gs");
|
||||||
command.add("-sDEVICE=pdfwrite");
|
command.add("-sDEVICE=pdfwrite");
|
||||||
command.add("-dCompatibilityLevel=1.5");
|
command.add("-dCompatibilityLevel=1.4");
|
||||||
|
|
||||||
switch (optimizeLevel) {
|
switch (optimizeLevel) {
|
||||||
case 1:
|
case 1:
|
||||||
|
|||||||
@@ -68,7 +68,6 @@ public class PasswordController {
|
|||||||
boolean canModifyAnnotations = request.isCanModifyAnnotations();
|
boolean canModifyAnnotations = request.isCanModifyAnnotations();
|
||||||
boolean canPrint = request.isCanPrint();
|
boolean canPrint = request.isCanPrint();
|
||||||
boolean canPrintFaithful = request.isCanPrintFaithful();
|
boolean canPrintFaithful = request.isCanPrintFaithful();
|
||||||
|
|
||||||
PDDocument document = Loader.loadPDF(fileInput.getBytes());
|
PDDocument document = Loader.loadPDF(fileInput.getBytes());
|
||||||
AccessPermission ap = new AccessPermission();
|
AccessPermission ap = new AccessPermission();
|
||||||
ap.setCanAssembleDocument(!canAssembleDocument);
|
ap.setCanAssembleDocument(!canAssembleDocument);
|
||||||
|
|||||||
@@ -3,11 +3,9 @@ package stirling.software.SPDF.repository;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
import org.springframework.stereotype.Repository;
|
|
||||||
|
|
||||||
import stirling.software.SPDF.model.Authority;
|
import stirling.software.SPDF.model.Authority;
|
||||||
|
|
||||||
@Repository
|
|
||||||
public interface AuthorityRepository extends JpaRepository<Authority, Long> {
|
public interface AuthorityRepository extends JpaRepository<Authority, Long> {
|
||||||
// Set<Authority> findByUsername(String username);
|
// Set<Authority> findByUsername(String username);
|
||||||
Set<Authority> findByUser_Username(String username);
|
Set<Authority> findByUser_Username(String username);
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
package stirling.software.SPDF.repository;
|
package stirling.software.SPDF.repository;
|
||||||
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
import org.springframework.stereotype.Repository;
|
|
||||||
|
|
||||||
import stirling.software.SPDF.model.PersistentLogin;
|
import stirling.software.SPDF.model.PersistentLogin;
|
||||||
|
|
||||||
@Repository
|
|
||||||
public interface PersistentLoginRepository extends JpaRepository<PersistentLogin, String> {}
|
public interface PersistentLoginRepository extends JpaRepository<PersistentLogin, String> {}
|
||||||
|
|||||||
@@ -3,12 +3,10 @@ package stirling.software.SPDF.repository;
|
|||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
import org.springframework.stereotype.Repository;
|
|
||||||
|
|
||||||
import stirling.software.SPDF.model.User;
|
import stirling.software.SPDF.model.User;
|
||||||
|
|
||||||
@Repository
|
public interface UserRepository extends JpaRepository<User, String> {
|
||||||
public interface UserRepository extends JpaRepository<User, Long> {
|
|
||||||
Optional<User> findByUsernameIgnoreCase(String username);
|
Optional<User> findByUsernameIgnoreCase(String username);
|
||||||
|
|
||||||
Optional<User> findByUsername(String username);
|
Optional<User> findByUsername(String username);
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -55,7 +55,7 @@ userNotFoundMessage=Kullanıcı bulunamadı.
|
|||||||
incorrectPasswordMessage=Mevcut şifre yanlış.
|
incorrectPasswordMessage=Mevcut şifre yanlış.
|
||||||
usernameExistsMessage=Yeni Kullanıcı Adı zaten var.
|
usernameExistsMessage=Yeni Kullanıcı Adı zaten var.
|
||||||
invalidUsernameMessage=Geçersiz kullanıcı adı, kullanıcı adı yalnızca harf, rakam ve aşağıdaki özel karakterleri @._+- içerebilir veya geçerli bir e-posta adresi olmalıdır.
|
invalidUsernameMessage=Geçersiz kullanıcı adı, kullanıcı adı yalnızca harf, rakam ve aşağıdaki özel karakterleri @._+- içerebilir veya geçerli bir e-posta adresi olmalıdır.
|
||||||
confirmPasswordErrorMessage=Yeni Şifre ve Yeni Şifreyi Onayla eşleşmelidir.
|
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||||
deleteCurrentUserMessage=Şu anda oturum açmış olan kullanıcı silinemiyor.
|
deleteCurrentUserMessage=Şu anda oturum açmış olan kullanıcı silinemiyor.
|
||||||
deleteUsernameExistsMessage=Kullanıcı adı mevcut değil ve silinemez.
|
deleteUsernameExistsMessage=Kullanıcı adı mevcut değil ve silinemez.
|
||||||
downgradeCurrentUserMessage=Mevcut kullanıcının rolü düşürülemiyor
|
downgradeCurrentUserMessage=Mevcut kullanıcının rolü düşürülemiyor
|
||||||
@@ -86,7 +86,7 @@ pipeline.defaultOption=Özel
|
|||||||
pipeline.submitButton=Gönder
|
pipeline.submitButton=Gönder
|
||||||
pipeline.help=Çoklu İşlemler Yardım
|
pipeline.help=Çoklu İşlemler Yardım
|
||||||
pipeline.scanHelp=Klasör Tarama Yardımı
|
pipeline.scanHelp=Klasör Tarama Yardımı
|
||||||
pipeline.deletePrompt=Çoklu işlemleri silmek istediğinizden emin misiniz
|
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -116,7 +116,7 @@ navbar.multiTool=Çoklu Araçlar
|
|||||||
navbar.sections.organize=Düzenle
|
navbar.sections.organize=Düzenle
|
||||||
navbar.sections.convertTo=PDF'ye dönüştür
|
navbar.sections.convertTo=PDF'ye dönüştür
|
||||||
navbar.sections.convertFrom=PDF'den dönüştür
|
navbar.sections.convertFrom=PDF'den dönüştür
|
||||||
navbar.sections.security=Oturum ve Güvenlik
|
navbar.sections.security=Oturum & Güvenlik
|
||||||
navbar.sections.advance=Gelişmiş
|
navbar.sections.advance=Gelişmiş
|
||||||
navbar.sections.edit=Görüntüle ve Düzenle
|
navbar.sections.edit=Görüntüle ve Düzenle
|
||||||
|
|
||||||
@@ -175,8 +175,8 @@ adminUserSettings.header=Yönetici Kullanıcı Kontrol Ayarları
|
|||||||
adminUserSettings.admin=Yönetici
|
adminUserSettings.admin=Yönetici
|
||||||
adminUserSettings.user=Kullanıcı
|
adminUserSettings.user=Kullanıcı
|
||||||
adminUserSettings.addUser=Yeni Kullanıcı Ekle
|
adminUserSettings.addUser=Yeni Kullanıcı Ekle
|
||||||
adminUserSettings.deleteUser=Kullanıcı Sil
|
adminUserSettings.deleteUser=Delete User
|
||||||
adminUserSettings.confirmDeleteUser=Kullanıcı silinsin mi?
|
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||||
adminUserSettings.usernameInfo=Kullanıcı adı yalnızca harf, rakam ve aşağıdaki özel karakterleri @._+- içerebilir veya geçerli bir e-posta adresi olmalıdır.
|
adminUserSettings.usernameInfo=Kullanıcı adı yalnızca harf, rakam ve aşağıdaki özel karakterleri @._+- içerebilir veya geçerli bir e-posta adresi olmalıdır.
|
||||||
adminUserSettings.roles=Roller
|
adminUserSettings.roles=Roller
|
||||||
adminUserSettings.role=Rol
|
adminUserSettings.role=Rol
|
||||||
@@ -192,21 +192,21 @@ adminUserSettings.changeUserRole=Kullanıcı rolünü değiştir
|
|||||||
adminUserSettings.authenticated=Onaylandı
|
adminUserSettings.authenticated=Onaylandı
|
||||||
|
|
||||||
|
|
||||||
database.title=Veri Tabanını İçe/Dışa Aktar
|
database.title=Database Import/Export
|
||||||
database.header=Veri Tabanını İçe/Dışa Aktar
|
database.header=Database Import/Export
|
||||||
database.fileName=Dosya Adı
|
database.fileName=File Name
|
||||||
database.creationDate=Oluşturulma Tarihi
|
database.creationDate=Creation Date
|
||||||
database.fileSize=Dosya Boyutu
|
database.fileSize=File Size
|
||||||
database.deleteBackupFile=Yedekleme Dosyasını Sil
|
database.deleteBackupFile=Delete Backup File
|
||||||
database.importBackupFile=Yedekleme Dosyasını İçe Aktar
|
database.importBackupFile=Import Backup File
|
||||||
database.downloadBackupFile=Yedekleme Dosyasını İndir
|
database.downloadBackupFile=Download Backup File
|
||||||
database.info_1=Verileri içe aktarırken, yapının doğru olduğundan emin olmak çok önemlidir. Ne yaptığınızdan emin değilseniz, bir uzmandan tavsiye ve destek alın. Yapıdaki bir hata, uygulamanın tamamen çalıştırılamaması da dahil olmak üzere uygulama sorunlarına neden olabilir.
|
database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application.
|
||||||
database.info_2=Karşıya yüklerken dosya adı önemli değildir. Daha sonra yedekleme_kullanıcısı_yyyyAAggSdd.sql biçiminde yeniden adlandırılacak ve tutarlı bir adlandırma kuralı sağlanacaktır.
|
database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention.
|
||||||
database.submit=Yedeklemeyi İçe Aktar
|
database.submit=Import Backup
|
||||||
database.importIntoDatabaseSuccessed=Veri tabanına başarıyla aktarıldı
|
database.importIntoDatabaseSuccessed=Import into database successed
|
||||||
database.fileNotFound=Dosya bulunamadı
|
database.fileNotFound=File not Found
|
||||||
database.fileNullOrEmpty=Dosya yok veya boş olmamalıdır
|
database.fileNullOrEmpty=File must not be null or empty
|
||||||
database.failedImportFile=Dosya İçe Aktarılamadı
|
database.failedImportFile=Failed Import File
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
@@ -353,9 +353,9 @@ home.certSign.title=Sertifika ile İmzala
|
|||||||
home.certSign.desc=Bir PDF'i Sertifika/Anahtar (PEM/P12) ile imzalar
|
home.certSign.desc=Bir PDF'i Sertifika/Anahtar (PEM/P12) ile imzalar
|
||||||
certSign.tags=doğrula,PEM,P12,resmi,şifrele
|
certSign.tags=doğrula,PEM,P12,resmi,şifrele
|
||||||
|
|
||||||
home.removeCertSign.title=Sertifika İmzasını Kaldır
|
home.removeCertSign.title=Remove Certificate Sign
|
||||||
home.removeCertSign.desc=PDF'ten sertifika imzasını kaldırır
|
home.removeCertSign.desc=Remove certificate signature from PDF
|
||||||
removeCertSign.tags=doğrula,PEM,P12,resmi,şifre çöz
|
removeCertSign.tags=authenticate,PEM,P12,official,decrypt
|
||||||
|
|
||||||
home.pageLayout.title=Çoklu-Sayfa Düzeni
|
home.pageLayout.title=Çoklu-Sayfa Düzeni
|
||||||
home.pageLayout.desc=Bir PDF belgesinin çoklu sayfalarını tek bir sayfada birleştirir
|
home.pageLayout.desc=Bir PDF belgesinin çoklu sayfalarını tek bir sayfada birleştirir
|
||||||
@@ -477,12 +477,12 @@ login.locked=Hesabınız kilitlendi.
|
|||||||
login.signinTitle=Lütfen giriş yapınız.
|
login.signinTitle=Lütfen giriş yapınız.
|
||||||
login.ssoSignIn=Tek Oturum Açma ile Giriş Yap
|
login.ssoSignIn=Tek Oturum Açma ile Giriş Yap
|
||||||
login.oauth2AutoCreateDisabled=OAUTH2 Otomatik Oluşturma Kullanıcı Devre Dışı Bırakıldı
|
login.oauth2AutoCreateDisabled=OAUTH2 Otomatik Oluşturma Kullanıcı Devre Dışı Bırakıldı
|
||||||
login.oauth2RequestNotFound=Yetkilendirme isteği bulunamadı
|
login.oauth2RequestNotFound=Authorization request not found
|
||||||
login.oauth2InvalidUserInfoResponse=Geçersiz Kullanıcı Bilgisi Yanıtı
|
login.oauth2InvalidUserInfoResponse=Invalid User Info Response
|
||||||
login.oauth2invalidRequest=Geçersiz İstek
|
login.oauth2invalidRequest=Invalid Request
|
||||||
login.oauth2AccessDenied=Erişim Reddedildi
|
login.oauth2AccessDenied=Access Denied
|
||||||
login.oauth2InvalidTokenResponse=Geçersiz Belirteç Yanıtı
|
login.oauth2InvalidTokenResponse=Invalid Token Response
|
||||||
login.oauth2InvalidIdToken=Geçersiz Kimlik Belirteci
|
login.oauth2InvalidIdToken=Invalid Id Token
|
||||||
|
|
||||||
|
|
||||||
#auto-redact
|
#auto-redact
|
||||||
@@ -681,10 +681,10 @@ certSign.submit=PDF'i İmzala
|
|||||||
|
|
||||||
|
|
||||||
#removeCertSign
|
#removeCertSign
|
||||||
removeCertSign.title=Sertifika İmzasını Kaldır
|
removeCertSign.title=Remove Certificate Signature
|
||||||
removeCertSign.header=PDF'ten dijital sertifikayı kaldırın
|
removeCertSign.header=Remove the digital certificate from the PDF
|
||||||
removeCertSign.selectPDF=PDF dosyası seçin:
|
removeCertSign.selectPDF=Select a PDF file:
|
||||||
removeCertSign.submit=İmzayı Kaldır
|
removeCertSign.submit=Remove Signature
|
||||||
|
|
||||||
|
|
||||||
#removeBlanks
|
#removeBlanks
|
||||||
@@ -706,8 +706,8 @@ removeAnnotations.submit=Kaldır
|
|||||||
#compare
|
#compare
|
||||||
compare.title=Karşılaştır
|
compare.title=Karşılaştır
|
||||||
compare.header=PDF'leri Karşılaştır
|
compare.header=PDF'leri Karşılaştır
|
||||||
compare.highlightColor.1=Vurgu Rengi 1:
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
compare.highlightColor.2=Vurgu Rengi 2:
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=Belge 1
|
compare.document.1=Belge 1
|
||||||
compare.document.2=Belge 2
|
compare.document.2=Belge 2
|
||||||
compare.submit=Karşılaştır
|
compare.submit=Karşılaştır
|
||||||
@@ -744,7 +744,7 @@ repair.submit=Onar
|
|||||||
#flatten
|
#flatten
|
||||||
flatten.title=Düzleştir
|
flatten.title=Düzleştir
|
||||||
flatten.header=PDF'leri Düzleştir
|
flatten.header=PDF'leri Düzleştir
|
||||||
flatten.flattenOnlyForms=Yalnızca formları düzleştir
|
flatten.flattenOnlyForms=Flatten only forms
|
||||||
flatten.submit=Düzleştir
|
flatten.submit=Düzleştir
|
||||||
|
|
||||||
|
|
||||||
@@ -822,7 +822,7 @@ merge.title=Birleştir
|
|||||||
merge.header=Çoklu PDF'leri Birleştir (2+)
|
merge.header=Çoklu PDF'leri Birleştir (2+)
|
||||||
merge.sortByName=İsme göre sırala
|
merge.sortByName=İsme göre sırala
|
||||||
merge.sortByDate=Tarihe göre sırala
|
merge.sortByDate=Tarihe göre sırala
|
||||||
merge.removeCertSign=Birleştirilen dosyadaki dijital imza kaldırılsın mı?
|
merge.removeCertSign=Remove digital signature in the merged file?
|
||||||
merge.submit=Birleştir
|
merge.submit=Birleştir
|
||||||
|
|
||||||
|
|
||||||
@@ -840,7 +840,7 @@ pdfOrganiser.mode.6=Tek-Çift Ayrımı
|
|||||||
pdfOrganiser.mode.7=İlk Önce Kaldır
|
pdfOrganiser.mode.7=İlk Önce Kaldır
|
||||||
pdfOrganiser.mode.8=Sonuncuyu Kaldır
|
pdfOrganiser.mode.8=Sonuncuyu Kaldır
|
||||||
pdfOrganiser.mode.9=İlk ve Sonu Kaldır
|
pdfOrganiser.mode.9=İlk ve Sonu Kaldır
|
||||||
pdfOrganiser.mode.10=Tek-Çift Birleştirme
|
pdfOrganiser.mode.10=Odd-Even Merge
|
||||||
pdfOrganiser.placeholder=(örn. 1,3,2 veya 4-8,2,10-12 veya 2n-1)
|
pdfOrganiser.placeholder=(örn. 1,3,2 veya 4-8,2,10-12 veya 2n-1)
|
||||||
|
|
||||||
|
|
||||||
@@ -1099,17 +1099,17 @@ licenses.nav=Lisanslar
|
|||||||
licenses.title=3. Taraf Lisansları
|
licenses.title=3. Taraf Lisansları
|
||||||
licenses.header=3. Taraf Lisansları
|
licenses.header=3. Taraf Lisansları
|
||||||
licenses.module=Modül
|
licenses.module=Modül
|
||||||
licenses.version=Sürüm
|
licenses.version=Versiyon
|
||||||
licenses.license=Lisans
|
licenses.license=Lisans
|
||||||
|
|
||||||
#survey
|
#survey
|
||||||
survey.nav=Anket
|
survey.nav=Survey
|
||||||
survey.title=Stirling-PDF Anketi
|
survey.title=Stirling-PDF Survey
|
||||||
survey.description=Stirling-PDF'te izleme yok, bu yüzden Stirling-PDF'i iyileştirmek için kullanıcılarımızdan geri bildirim almak istiyoruz!
|
survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF!
|
||||||
survey.please=Lütfen anketimize katılmayı düşünün!
|
survey.please=Please consider taking our survey!
|
||||||
survey.disabled=(Anket açılır penceresi sonraki güncellemelerde devre dışı bırakılacak ancak sayfanın alt kısmında yer alacaktır)
|
survey.disabled=(Survey popup will be disabled in following updates but available at foot of page)
|
||||||
survey.button=Ankete Katıl
|
survey.button=Take Survey
|
||||||
survey.dontShowAgain=Tekrar gösterme
|
survey.dontShowAgain=Don't show again
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
|
|||||||
@@ -906,7 +906,7 @@
|
|||||||
{
|
{
|
||||||
"moduleName": "org.springframework.boot:spring-boot-devtools",
|
"moduleName": "org.springframework.boot:spring-boot-devtools",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-boot",
|
"moduleUrl": "https://spring.io/projects/spring-boot",
|
||||||
"moduleVersion": "3.3.2",
|
"moduleVersion": "3.3.0",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
@@ -920,7 +920,7 @@
|
|||||||
{
|
{
|
||||||
"moduleName": "org.springframework.boot:spring-boot-starter-actuator",
|
"moduleName": "org.springframework.boot:spring-boot-starter-actuator",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-boot",
|
"moduleUrl": "https://spring.io/projects/spring-boot",
|
||||||
"moduleVersion": "3.3.2",
|
"moduleVersion": "3.3.0",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
@@ -934,7 +934,7 @@
|
|||||||
{
|
{
|
||||||
"moduleName": "org.springframework.boot:spring-boot-starter-data-jpa",
|
"moduleName": "org.springframework.boot:spring-boot-starter-data-jpa",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-boot",
|
"moduleUrl": "https://spring.io/projects/spring-boot",
|
||||||
"moduleVersion": "3.3.2",
|
"moduleVersion": "3.3.0",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
@@ -948,7 +948,7 @@
|
|||||||
{
|
{
|
||||||
"moduleName": "org.springframework.boot:spring-boot-starter-jetty",
|
"moduleName": "org.springframework.boot:spring-boot-starter-jetty",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-boot",
|
"moduleUrl": "https://spring.io/projects/spring-boot",
|
||||||
"moduleVersion": "3.3.2",
|
"moduleVersion": "3.3.0",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
@@ -969,28 +969,28 @@
|
|||||||
{
|
{
|
||||||
"moduleName": "org.springframework.boot:spring-boot-starter-oauth2-client",
|
"moduleName": "org.springframework.boot:spring-boot-starter-oauth2-client",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-boot",
|
"moduleUrl": "https://spring.io/projects/spring-boot",
|
||||||
"moduleVersion": "3.3.2",
|
"moduleVersion": "3.3.0",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.boot:spring-boot-starter-security",
|
"moduleName": "org.springframework.boot:spring-boot-starter-security",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-boot",
|
"moduleUrl": "https://spring.io/projects/spring-boot",
|
||||||
"moduleVersion": "3.3.2",
|
"moduleVersion": "3.3.0",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.boot:spring-boot-starter-thymeleaf",
|
"moduleName": "org.springframework.boot:spring-boot-starter-thymeleaf",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-boot",
|
"moduleUrl": "https://spring.io/projects/spring-boot",
|
||||||
"moduleVersion": "3.3.2",
|
"moduleVersion": "3.3.0",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.boot:spring-boot-starter-web",
|
"moduleName": "org.springframework.boot:spring-boot-starter-web",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-boot",
|
"moduleUrl": "https://spring.io/projects/spring-boot",
|
||||||
"moduleVersion": "3.3.2",
|
"moduleVersion": "3.3.0",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 900 600"><g fill-rule="evenodd" stroke-width="1pt"><path fill="#a51931" d="M0 0h900v600H0z"/><path fill="#fff" d="M0 120h900v360H0z"/><path fill="#241d4f" d="M0 240h900v120H0z"/></g></svg>
|
|
||||||
|
Before Width: | Height: | Size: 241 B |
@@ -12,7 +12,7 @@ $(document).ready(function () {
|
|||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
firstErrorOccurred = false;
|
firstErrorOccurred = false;
|
||||||
const url = this.action;
|
const url = this.action;
|
||||||
const files = $("#fileInput-input")[0].files;
|
var files = $("#fileInput-input")[0].files;
|
||||||
const formData = new FormData(this);
|
const formData = new FormData(this);
|
||||||
|
|
||||||
// Remove empty file entries
|
// Remove empty file entries
|
||||||
@@ -36,6 +36,17 @@ $(document).ready(function () {
|
|||||||
}, 5000);
|
}, 5000);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
|
if (!url.includes("remove-password")) {
|
||||||
|
// Check if any PDF files are encrypted and handle decryption if necessary
|
||||||
|
const decryptedFiles = await checkAndDecryptFiles(url ,files);
|
||||||
|
files = decryptedFiles
|
||||||
|
// Append decrypted files to formData
|
||||||
|
decryptedFiles.forEach((file, index) => {
|
||||||
|
formData.set(`fileInput`, file);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (remoteCall === true) {
|
if (remoteCall === true) {
|
||||||
if (override === "multi" || (!multiple && files.length > 1 && override !== "single")) {
|
if (override === "multi" || (!multiple && files.length > 1 && override !== "single")) {
|
||||||
await submitMultiPdfForm(url, files);
|
await submitMultiPdfForm(url, files);
|
||||||
@@ -45,24 +56,24 @@ $(document).ready(function () {
|
|||||||
}
|
}
|
||||||
clearTimeout(timeoutId);
|
clearTimeout(timeoutId);
|
||||||
$("#submitBtn").text(originalButtonText);
|
$("#submitBtn").text(originalButtonText);
|
||||||
|
|
||||||
// After process finishes, check for boredWaiting and gameDialog open status
|
// After process finishes, check for boredWaiting and gameDialog open status
|
||||||
const boredWaiting = localStorage.getItem("boredWaiting") || "disabled";
|
const boredWaiting = localStorage.getItem("boredWaiting") || "disabled";
|
||||||
const gameDialog = document.getElementById('game-container-wrapper');
|
const gameDialog = document.getElementById('game-container-wrapper');
|
||||||
if (boredWaiting === "enabled" && gameDialog && gameDialog.open) {
|
if (boredWaiting === "enabled" && gameDialog && gameDialog.open) {
|
||||||
// Display a green banner at the bottom of the screen saying "Download complete"
|
// Display a green banner at the bottom of the screen saying "Download complete"
|
||||||
let downloadCompleteText = "Download Complete";
|
let downloadCompleteText = "Download Complete";
|
||||||
if(window.downloadCompleteText){
|
if (window.downloadCompleteText) {
|
||||||
downloadCompleteText = window.downloadCompleteText;
|
downloadCompleteText = window.downloadCompleteText;
|
||||||
}
|
}
|
||||||
$("body").append('<div id="download-complete-banner" style="position:fixed;bottom:0;left:0;width:100%;background-color:green;color:white;text-align:center;padding:10px;font-size:16px;z-index:1000;">'+ downloadCompleteText + '</div>');
|
$("body").append('<div id="download-complete-banner" style="position:fixed;bottom:0;left:0;width:100%;background-color:green;color:white;text-align:center;padding:10px;font-size:16px;z-index:1000;">' + downloadCompleteText + '</div>');
|
||||||
setTimeout(function() {
|
setTimeout(function () {
|
||||||
$("#download-complete-banner").fadeOut("slow", function() {
|
$("#download-complete-banner").fadeOut("slow", function () {
|
||||||
$(this).remove(); // Remove the banner after fading out
|
$(this).remove(); // Remove the banner after fading out
|
||||||
});
|
});
|
||||||
}, 5000); // Banner will fade out after 5 seconds
|
}, 5000); // Banner will fade out after 5 seconds
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
clearTimeout(timeoutId);
|
clearTimeout(timeoutId);
|
||||||
handleDownloadError(error);
|
handleDownloadError(error);
|
||||||
@@ -72,6 +83,97 @@ $(document).ready(function () {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
async function checkAndDecryptFiles(url, files) {
|
||||||
|
const decryptedFiles = [];
|
||||||
|
pdfjsLib.GlobalWorkerOptions.workerSrc = './pdfjs-legacy/pdf.worker.mjs';
|
||||||
|
|
||||||
|
// Extract the base URL
|
||||||
|
const baseUrl = new URL(url);
|
||||||
|
let removePasswordUrl = `${baseUrl.origin}`;
|
||||||
|
|
||||||
|
// Check if there's a path before /api/
|
||||||
|
const apiIndex = baseUrl.pathname.indexOf('/api/');
|
||||||
|
if (apiIndex > 0) {
|
||||||
|
removePasswordUrl += baseUrl.pathname.substring(0, apiIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Append the new endpoint
|
||||||
|
removePasswordUrl += '/api/v1/security/remove-password';
|
||||||
|
|
||||||
|
console.log(`Remove password URL: ${removePasswordUrl}`);
|
||||||
|
|
||||||
|
|
||||||
|
for (const file of files) {
|
||||||
|
console.log(`Processing file: ${file.name}`);
|
||||||
|
if (file.type !== 'application/pdf') {
|
||||||
|
console.log(`Skipping non-PDF file: ${file.name}`);
|
||||||
|
decryptedFiles.push(file);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
const arrayBuffer = await file.arrayBuffer();
|
||||||
|
const loadingTask = pdfjsLib.getDocument({ data: arrayBuffer });
|
||||||
|
|
||||||
|
console.log(`Attempting to load PDF: ${file.name}`);
|
||||||
|
const pdf = await loadingTask.promise;
|
||||||
|
console.log(`File is not encrypted: ${file.name}`);
|
||||||
|
decryptedFiles.push(file); // If no error, file is not encrypted
|
||||||
|
} catch (error) {
|
||||||
|
if (error.name === 'PasswordException' && error.code === 1) {
|
||||||
|
console.log(`PDF requires password: ${file.name}`, error);
|
||||||
|
console.log(`Attempting to remove password from PDF: ${file.name} with password.`);
|
||||||
|
const password = prompt(`This PDF (${file.name}) is encrypted. Please enter the password:`);
|
||||||
|
|
||||||
|
if (!password) {
|
||||||
|
console.error(`No password provided for encrypted PDF: ${file.name}`);
|
||||||
|
showErrorBanner(`No password provided for encrypted PDF: ${file.name}`, 'Please enter a valid password.');
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Prepare FormData for the decryption request
|
||||||
|
const formData = new FormData();
|
||||||
|
formData.append('fileInput', file);
|
||||||
|
formData.append('password', password);
|
||||||
|
|
||||||
|
// Use handleSingleDownload to send the request
|
||||||
|
const decryptionResult = await fetch(removePasswordUrl, { method: "POST", body: formData });
|
||||||
|
|
||||||
|
if (decryptionResult && decryptionResult.blob) {
|
||||||
|
const decryptedBlob = await decryptionResult.blob();
|
||||||
|
const decryptedFile = new File([decryptedBlob], file.name, { type: 'application/pdf' });
|
||||||
|
|
||||||
|
/* // Create a link element to download the file
|
||||||
|
const link = document.createElement('a');
|
||||||
|
link.href = URL.createObjectURL(decryptedBlob);
|
||||||
|
link.download = 'test.pdf';
|
||||||
|
document.body.appendChild(link);
|
||||||
|
link.click();
|
||||||
|
document.body.removeChild(link);
|
||||||
|
*/
|
||||||
|
decryptedFiles.push(decryptedFile);
|
||||||
|
console.log(`Successfully decrypted PDF: ${file.name}`);
|
||||||
|
} else {
|
||||||
|
throw new Error('Decryption failed: No valid response from server');
|
||||||
|
}
|
||||||
|
} catch (decryptError) {
|
||||||
|
console.error(`Failed to decrypt PDF: ${file.name}`, decryptError);
|
||||||
|
showErrorBanner(`Failed to decrypt PDF: ${file.name}`, 'Incorrect password or unsupported encryption.');
|
||||||
|
throw decryptError;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.log(`Error loading PDF: ${file.name}`, error);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return decryptedFiles;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
async function handleSingleDownload(url, formData, isMulti = false, isZip = false) {
|
async function handleSingleDownload(url, formData, isMulti = false, isZip = false) {
|
||||||
try {
|
try {
|
||||||
const response = await fetch(url, { method: "POST", body: formData });
|
const response = await fetch(url, { method: "POST", body: formData });
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label th:text="#{PDFToWord.selectText.1}"></label>
|
<label th:text="#{PDFToWord.selectText.1}"></label>
|
||||||
<select class="form-control" name="outputFormat">
|
<select class="form-control" name="outputFormat">
|
||||||
<option value="docx">DocX</option>
|
<option value="docx">DocX</option>
|
||||||
<option value="doc">Doc</option>
|
<option value="doc">Doc</option>
|
||||||
<option value="odt">Odt</option>
|
<option value="odt">Odt</option>
|
||||||
</select>
|
</select>
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
<p th:text="#{error.contactTip}"></p>
|
<p th:text="#{error.contactTip}"></p>
|
||||||
<div id="button-group">
|
<div id="button-group">
|
||||||
<a href="https://github.com/Stirling-Tools/Stirling-PDF/issues" id="github-button" class="btn btn-primary" target="_blank" th:text="#{error.github}"></a>
|
<a href="https://github.com/Stirling-Tools/Stirling-PDF/issues" id="github-button" class="btn btn-primary" target="_blank" th:text="#{error.github}"></a>
|
||||||
<a href="https://discord.gg/Cn8pWhQRxZ" id="discord-button" class="btn btn-primary" target="_blank" th:text="#{joinDiscord}"></a>
|
<a href="https://discord.gg/HYmhKj45pU" id="discord-button" class="btn btn-primary" target="_blank" th:text="#{joinDiscord}"></a>
|
||||||
</div>
|
</div>
|
||||||
<a th:href="@{'/'}" id="home-button" class="home-button btn btn-primary" th:text="#{goHomepage}"></a>
|
<a th:href="@{'/'}" id="home-button" class="home-button btn btn-primary" th:text="#{goHomepage}"></a>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<!-- Buttons to submit a ticket on GitHub and join Discord server -->
|
<!-- Buttons to submit a ticket on GitHub and join Discord server -->
|
||||||
<a href="https://github.com/Stirling-Tools/Stirling-PDF/issues" id="github-button" target="_blank" th:text="#{error.github}"></a>
|
<a href="https://github.com/Stirling-Tools/Stirling-PDF/issues" id="github-button" target="_blank" th:text="#{error.github}"></a>
|
||||||
<a href="https://discord.gg/Cn8pWhQRxZ" id="discord-button" target="_blank" th:text="#{joinDiscord}"></a>
|
<a href="https://discord.gg/HYmhKj45pU" id="discord-button" target="_blank" th:text="#{joinDiscord}"></a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script>
|
<script>
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
<p th:text="#{error.contactTip}"></p>
|
<p th:text="#{error.contactTip}"></p>
|
||||||
<div id="button-group">
|
<div id="button-group">
|
||||||
<a href="https://github.com/Stirling-Tools/Stirling-PDF/issues" id="github-button" target="_blank" th:text="#{error.githubSubmit}"></a>
|
<a href="https://github.com/Stirling-Tools/Stirling-PDF/issues" id="github-button" target="_blank" th:text="#{error.githubSubmit}"></a>
|
||||||
<a href="https://discord.gg/Cn8pWhQRxZ" id="discord-button" target="_blank" th:text="#{error.discordSubmit}"></a>
|
<a href="https://discord.gg/HYmhKj45pU" id="discord-button" target="_blank" th:text="#{error.discordSubmit}"></a>
|
||||||
</div>
|
</div>
|
||||||
<a th:href="@{'/'}" class="home-button" th:text="#{goHomepage}"></a>
|
<a th:href="@{'/'}" class="home-button" th:text="#{goHomepage}"></a>
|
||||||
<a data-bs-dismiss="modal" class="home-button" th:text="#{close}"></a>
|
<a data-bs-dismiss="modal" class="home-button" th:text="#{close}"></a>
|
||||||
|
|||||||
@@ -31,5 +31,4 @@
|
|||||||
<a class="dropdown-item lang_dropdown-item" href="" data-bs-language-code="cs_CZ"> <img th:src="@{'/images/flags/cz.svg'}" alt="icon" width="20" height="15"> Česky</a>
|
<a class="dropdown-item lang_dropdown-item" href="" data-bs-language-code="cs_CZ"> <img th:src="@{'/images/flags/cz.svg'}" alt="icon" width="20" height="15"> Česky</a>
|
||||||
<a class="dropdown-item lang_dropdown-item" href="" data-bs-language-code="hr_HR"> <img th:src="@{'/images/flags/hr.svg'}" alt="icon" width="20" height="15"> Hrvatski</a>
|
<a class="dropdown-item lang_dropdown-item" href="" data-bs-language-code="hr_HR"> <img th:src="@{'/images/flags/hr.svg'}" alt="icon" width="20" height="15"> Hrvatski</a>
|
||||||
<a class="dropdown-item lang_dropdown-item" href="" data-bs-language-code="no_NB"> <img th:src="@{'/images/flags/no.svg'}" alt="icon" width="20" height="15"> Norsk</a>
|
<a class="dropdown-item lang_dropdown-item" href="" data-bs-language-code="no_NB"> <img th:src="@{'/images/flags/no.svg'}" alt="icon" width="20" height="15"> Norsk</a>
|
||||||
<a class="dropdown-item lang_dropdown-item" href="" data-bs-language-code="th_TH"> <img th:src="@{'/images/flags/th.svg'}" alt="icon" width="20" height="15"> ไทย</a>
|
|
||||||
</th:block>
|
</th:block>
|
||||||
|
|||||||
@@ -391,7 +391,7 @@
|
|||||||
<a href="https://hub.docker.com/r/frooodle/s-pdf" class="mx-1" role="button" th:title="#{seeDockerHub}">
|
<a href="https://hub.docker.com/r/frooodle/s-pdf" class="mx-1" role="button" th:title="#{seeDockerHub}">
|
||||||
<img th:src="@{'/images/docker.svg'}" alt="docker">
|
<img th:src="@{'/images/docker.svg'}" alt="docker">
|
||||||
</a>
|
</a>
|
||||||
<a href="https://discord.gg/Cn8pWhQRxZ" class="mx-1" role="button" th:title="#{joinDiscord}">
|
<a href="https://discord.gg/HYmhKj45pU" class="mx-1" role="button" th:title="#{joinDiscord}">
|
||||||
<img th:src="@{'/images/discord.svg'}" alt="discord">
|
<img th:src="@{'/images/discord.svg'}" alt="discord">
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/sponsors/Frooodle" class="mx-1" role="button" th:title="#{donate}">
|
<a href="https://github.com/sponsors/Frooodle" class="mx-1" role="button" th:title="#{donate}">
|
||||||
|
|||||||
@@ -264,9 +264,8 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
/*
|
|
||||||
document.addEventListener("DOMContentLoaded", function() {
|
document.addEventListener("DOMContentLoaded", function() {
|
||||||
const surveyVersion = "1.1";
|
<!-- const surveyVersion = "1.1";
|
||||||
const modal = new bootstrap.Modal(document.getElementById('surveyModal'));
|
const modal = new bootstrap.Modal(document.getElementById('surveyModal'));
|
||||||
const dontShowAgain = document.getElementById('dontShowAgain');
|
const dontShowAgain = document.getElementById('dontShowAgain');
|
||||||
const takeSurveyButton = document.getElementById('takeSurvey');
|
const takeSurveyButton = document.getElementById('takeSurvey');
|
||||||
@@ -294,8 +293,8 @@
|
|||||||
|
|
||||||
if (localStorage.getItem('dontShowSurvey')) {
|
if (localStorage.getItem('dontShowSurvey')) {
|
||||||
modal.hide();
|
modal.hide();
|
||||||
}
|
} -->
|
||||||
});*/
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -17,10 +17,8 @@
|
|||||||
<span class="tool-header-text" th:text="#{autoRedact.header}"></span>
|
<span class="tool-header-text" th:text="#{autoRedact.header}"></span>
|
||||||
</div>
|
</div>
|
||||||
<form action="api/v1/security/auto-redact" method="post" enctype="multipart/form-data">
|
<form action="api/v1/security/auto-redact" method="post" enctype="multipart/form-data">
|
||||||
<div class="mb-3">
|
<div th:replace="~{fragments/common :: fileSelector(name='fileInput', multiple=false, accept='application/pdf')}"></div>
|
||||||
<input type="file" class="form-control" id="fileInput" name="fileInput" required accept="application/pdf">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label for="listOfText" class="form-label" th:text="#{autoRedact.textsToRedactLabel}"></label>
|
<label for="listOfText" class="form-label" th:text="#{autoRedact.textsToRedactLabel}"></label>
|
||||||
<textarea class="form-control" id="listOfText" name="listOfText" rows="4" required th:placeholder="#{autoRedact.textsToRedactPlaceholder}"></textarea>
|
<textarea class="form-control" id="listOfText" name="listOfText" rows="4" required th:placeholder="#{autoRedact.textsToRedactPlaceholder}"></textarea>
|
||||||
|
|||||||
3
test.sh
3
test.sh
@@ -88,9 +88,6 @@ main() {
|
|||||||
passed_tests+=("Stirling-PDF-Regression")
|
passed_tests+=("Stirling-PDF-Regression")
|
||||||
else
|
else
|
||||||
failed_tests+=("Stirling-PDF-Regression")
|
failed_tests+=("Stirling-PDF-Regression")
|
||||||
echo "Printing docker logs of failed regression"
|
|
||||||
docker logs "Stirling-PDF"
|
|
||||||
echo "Printed docker logs of failed regression"
|
|
||||||
fi
|
fi
|
||||||
cd ..
|
cd ..
|
||||||
fi
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user