mirror of
https://github.com/arsvendg/Stirling-PDF.git
synced 2026-07-16 19:33:11 +02:00
minor changes (#5419)
# Description of Changes OLD (MEMBER tag) <img width="690" height="167" alt="image" src="https://github.com/user-attachments/assets/079a32b6-2483-46a6-a307-8cacb664cbc8" /> <img width="719" height="158" alt="image" src="https://github.com/user-attachments/assets/cba625f6-56de-4b32-b6ea-22cee59fffbd" /> NEW <img width="748" height="248" alt="image" src="https://github.com/user-attachments/assets/d3c556da-1859-4241-89c6-d0b96fd6072a" /> <img width="752" height="416" alt="image" src="https://github.com/user-attachments/assets/ddeb7f0d-cccb-4690-b05a-7243695e9b61" /> --- ## Checklist ### General - [ ] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [ ] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md) (if applicable) - [ ] I have performed a self-review of my own code - [ ] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### Translations (if applicable) - [ ] I ran [`scripts/counter_translation.py`](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/docs/counter_translation.md) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md#6-testing) for more details.
This commit is contained in:
+36
@@ -29,6 +29,7 @@ import io.swagger.v3.oas.annotations.Operation;
|
|||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
import stirling.software.SPDF.model.SplitTypes;
|
import stirling.software.SPDF.model.SplitTypes;
|
||||||
import stirling.software.SPDF.model.api.SplitPdfBySectionsRequest;
|
import stirling.software.SPDF.model.api.SplitPdfBySectionsRequest;
|
||||||
@@ -40,6 +41,7 @@ import stirling.software.common.util.TempFile;
|
|||||||
import stirling.software.common.util.TempFileManager;
|
import stirling.software.common.util.TempFileManager;
|
||||||
import stirling.software.common.util.WebResponseUtils;
|
import stirling.software.common.util.WebResponseUtils;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/api/v1/general")
|
@RequestMapping("/api/v1/general")
|
||||||
@Tag(name = "General", description = "General APIs")
|
@Tag(name = "General", description = "General APIs")
|
||||||
@@ -98,6 +100,9 @@ public class SplitPdfBySectionsController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
mergedDoc.save(out);
|
mergedDoc.save(out);
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("Error creating merged PDF document", e);
|
||||||
|
throw e;
|
||||||
}
|
}
|
||||||
return WebResponseUtils.pdfFileToWebResponse(tempFile, filename + ".pdf");
|
return WebResponseUtils.pdfFileToWebResponse(tempFile, filename + ".pdf");
|
||||||
} else {
|
} else {
|
||||||
@@ -132,6 +137,13 @@ public class SplitPdfBySectionsController {
|
|||||||
+ sectionNum
|
+ sectionNum
|
||||||
+ ".pdf";
|
+ ".pdf";
|
||||||
saveDocToZip(subDoc, zipOut, entryName);
|
saveDocToZip(subDoc, zipOut, entryName);
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error(
|
||||||
|
"Error creating section {} for page {}",
|
||||||
|
(i * verti + j + 1),
|
||||||
|
pageNum,
|
||||||
|
e);
|
||||||
|
throw e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -141,12 +153,21 @@ public class SplitPdfBySectionsController {
|
|||||||
addPageToTarget(sourceDocument, pageIndex, subDoc, subLayerUtility);
|
addPageToTarget(sourceDocument, pageIndex, subDoc, subLayerUtility);
|
||||||
String entryName = filename + "_" + pageNum + "_1.pdf";
|
String entryName = filename + "_" + pageNum + "_1.pdf";
|
||||||
saveDocToZip(subDoc, zipOut, entryName);
|
saveDocToZip(subDoc, zipOut, entryName);
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("Error processing unsplit page {}", pageNum, e);
|
||||||
|
throw e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("Error creating ZIP file with split PDF sections", e);
|
||||||
|
throw e;
|
||||||
}
|
}
|
||||||
return WebResponseUtils.zipFileToWebResponse(zipTempFile, filename + ".zip");
|
return WebResponseUtils.zipFileToWebResponse(zipTempFile, filename + ".zip");
|
||||||
}
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("Error splitting PDF file: {}", file.getOriginalFilename(), e);
|
||||||
|
throw e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,6 +182,9 @@ public class SplitPdfBySectionsController {
|
|||||||
try (PDPageContentStream contentStream =
|
try (PDPageContentStream contentStream =
|
||||||
new PDPageContentStream(targetDoc, newPage, AppendMode.APPEND, true, true)) {
|
new PDPageContentStream(targetDoc, newPage, AppendMode.APPEND, true, true)) {
|
||||||
contentStream.drawForm(form);
|
contentStream.drawForm(form);
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("Error adding page {} to target document", pageIndex, e);
|
||||||
|
throw e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -198,6 +222,10 @@ public class SplitPdfBySectionsController {
|
|||||||
contentStream.transform(new Matrix(1, 0, 0, 1, translateX, translateY));
|
contentStream.transform(new Matrix(1, 0, 0, 1, translateX, translateY));
|
||||||
contentStream.drawForm(form);
|
contentStream.drawForm(form);
|
||||||
contentStream.restoreGraphicsState();
|
contentStream.restoreGraphicsState();
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error(
|
||||||
|
"Error adding split section ({}, {}) for page {}", i, j, pageIndex, e);
|
||||||
|
throw e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -234,6 +262,14 @@ public class SplitPdfBySectionsController {
|
|||||||
contentStream.transform(new Matrix(1, 0, 0, 1, translateX, translateY));
|
contentStream.transform(new Matrix(1, 0, 0, 1, translateX, translateY));
|
||||||
contentStream.drawForm(form);
|
contentStream.drawForm(form);
|
||||||
contentStream.restoreGraphicsState();
|
contentStream.restoreGraphicsState();
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error(
|
||||||
|
"Error adding single section ({}, {}) for page {} to target",
|
||||||
|
horizIndex,
|
||||||
|
vertIndex,
|
||||||
|
pageIndex,
|
||||||
|
e);
|
||||||
|
throw e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -353,12 +353,12 @@ export default function PeopleSection() {
|
|||||||
|
|
||||||
{/* License Information - Compact */}
|
{/* License Information - Compact */}
|
||||||
{licenseInfo && (
|
{licenseInfo && (
|
||||||
<Group gap="md" c="dimmed" style={{ fontSize: '0.875rem' }}>
|
<Group gap="md" style={{ fontSize: '0.875rem' }}>
|
||||||
<Text size="sm" span>
|
<Text size="sm" span c="dimmed">
|
||||||
<Text component="span" fw={600} c="inherit">{licenseInfo.totalUsers}</Text>
|
<Text component="span" fw={600} c="inherit">{licenseInfo.totalUsers}</Text>
|
||||||
<Text component="span" c="dimmed"> / </Text>
|
<Text component="span" c="dimmed"> / </Text>
|
||||||
<Text component="span" fw={600} c="inherit">{licenseInfo.maxAllowedUsers}</Text>
|
<Text component="span" fw={600} c="inherit">{licenseInfo.maxAllowedUsers}</Text>
|
||||||
<Text component="span" c="dimmed" ml={4}>{t('workspace.people.license.users', 'users')}</Text>
|
<Text component="span" c="dimmed"> {t('workspace.people.license.users', 'users')}</Text>
|
||||||
</Text>
|
</Text>
|
||||||
|
|
||||||
{licenseInfo.availableSlots === 0 && (
|
{licenseInfo.availableSlots === 0 && (
|
||||||
@@ -518,7 +518,7 @@ export default function PeopleSection() {
|
|||||||
<Badge
|
<Badge
|
||||||
size="sm"
|
size="sm"
|
||||||
variant="light"
|
variant="light"
|
||||||
color={(user.rolesAsString || '').includes('ROLE_ADMIN') ? 'blue' : 'gray'}
|
color={(user.rolesAsString || '').includes('ROLE_ADMIN') ? 'blue' : 'cyan'}
|
||||||
>
|
>
|
||||||
{(user.rolesAsString || '').includes('ROLE_ADMIN')
|
{(user.rolesAsString || '').includes('ROLE_ADMIN')
|
||||||
? t('workspace.people.admin', 'Admin')
|
? t('workspace.people.admin', 'Admin')
|
||||||
|
|||||||
+1
-1
@@ -362,7 +362,7 @@ export default function TeamDetailsSection({ teamId, onBack }: TeamDetailsSectio
|
|||||||
<Table.Td w={100}>
|
<Table.Td w={100}>
|
||||||
<Badge
|
<Badge
|
||||||
size="sm"
|
size="sm"
|
||||||
color={(user.rolesAsString || '').includes('ROLE_ADMIN') ? 'blue' : 'gray'}
|
color={(user.rolesAsString || '').includes('ROLE_ADMIN') ? 'blue' : 'cyan'}
|
||||||
variant="light"
|
variant="light"
|
||||||
>
|
>
|
||||||
{(user.rolesAsString || '').includes('ROLE_ADMIN')
|
{(user.rolesAsString || '').includes('ROLE_ADMIN')
|
||||||
|
|||||||
@@ -280,7 +280,6 @@ export default function TeamsSection() {
|
|||||||
<Text
|
<Text
|
||||||
size="sm"
|
size="sm"
|
||||||
fw={500}
|
fw={500}
|
||||||
c="dark"
|
|
||||||
maw={200}
|
maw={200}
|
||||||
style={{
|
style={{
|
||||||
overflow: 'hidden',
|
overflow: 'hidden',
|
||||||
|
|||||||
@@ -298,7 +298,7 @@ def save_generated_pdf(context, filename):
|
|||||||
def step_send_get_request(context, endpoint):
|
def step_send_get_request(context, endpoint):
|
||||||
base_url = "http://localhost:8080"
|
base_url = "http://localhost:8080"
|
||||||
full_url = f"{base_url}{endpoint}"
|
full_url = f"{base_url}{endpoint}"
|
||||||
response = requests.get(full_url, headers=API_HEADERS)
|
response = requests.get(full_url, headers=API_HEADERS, timeout=60)
|
||||||
context.response = response
|
context.response = response
|
||||||
|
|
||||||
|
|
||||||
@@ -307,7 +307,7 @@ def step_send_get_request_with_params(context, endpoint):
|
|||||||
base_url = "http://localhost:8080"
|
base_url = "http://localhost:8080"
|
||||||
params = {row["parameter"]: row["value"] for row in context.table}
|
params = {row["parameter"]: row["value"] for row in context.table}
|
||||||
full_url = f"{base_url}{endpoint}"
|
full_url = f"{base_url}{endpoint}"
|
||||||
response = requests.get(full_url, params=params, headers=API_HEADERS)
|
response = requests.get(full_url, params=params, headers=API_HEADERS, timeout=60)
|
||||||
context.response = response
|
context.response = response
|
||||||
|
|
||||||
|
|
||||||
@@ -337,7 +337,9 @@ def step_send_api_request(context, endpoint):
|
|||||||
print(f"form_data {file.name} with {mime_type}")
|
print(f"form_data {file.name} with {mime_type}")
|
||||||
form_data.append((key, (file.name, file, mime_type)))
|
form_data.append((key, (file.name, file, mime_type)))
|
||||||
|
|
||||||
response = requests.post(url, files=form_data, headers=API_HEADERS)
|
# Set timeout to 300 seconds (5 minutes) to prevent infinite hangs
|
||||||
|
print(f"Sending POST request to {endpoint} with timeout=300s")
|
||||||
|
response = requests.post(url, files=form_data, headers=API_HEADERS, timeout=300)
|
||||||
context.response = response
|
context.response = response
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user