mirror of
https://github.com/Stirling-Tools/Stirling-PDF.git
synced 2025-09-18 01:19:24 +00:00
Auto split
This commit is contained in:
parent
a57373b968
commit
a6b210eca8
@ -697,7 +697,8 @@
|
|||||||
"bySize": "Split by File Size",
|
"bySize": "Split by File Size",
|
||||||
"byPageCount": "Split by Page Count",
|
"byPageCount": "Split by Page Count",
|
||||||
"byDocCount": "Split by Document Count",
|
"byDocCount": "Split by Document Count",
|
||||||
"byChapters": "Split by Chapters"
|
"byChapters": "Split by Chapters",
|
||||||
|
"byPageDivider": "Split by Page Divider"
|
||||||
},
|
},
|
||||||
"value": {
|
"value": {
|
||||||
"fileSize": {
|
"fileSize": {
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import { Stack, TextInput, Select, Checkbox } from '@mantine/core';
|
import { Stack, TextInput, Select, Checkbox, Anchor } from '@mantine/core';
|
||||||
|
import LocalIcon from '../../shared/LocalIcon';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { isSplitMethod, SPLIT_METHODS } from '../../../constants/splitConstants';
|
import { isSplitMethod, SPLIT_METHODS } from '../../../constants/splitConstants';
|
||||||
import { SplitParameters } from '../../../hooks/tools/split/useSplitParameters';
|
import { SplitParameters } from '../../../hooks/tools/split/useSplitParameters';
|
||||||
@ -113,6 +114,27 @@ const SplitSettings = ({
|
|||||||
</Stack>
|
</Stack>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const renderByPageDividerForm = () => (
|
||||||
|
<Stack gap="sm">
|
||||||
|
<Anchor
|
||||||
|
href="https://stirlingpdf.io/files/Auto%20Splitter%20Divider%20(with%20instructions).pdf"
|
||||||
|
target="_blank"
|
||||||
|
size="sm"
|
||||||
|
style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}
|
||||||
|
>
|
||||||
|
<LocalIcon icon="download-rounded" width="2rem" height="2rem" />
|
||||||
|
{t("autoSplitPDF.dividerDownload2", "Download 'Auto Splitter Divider (with instructions).pdf'")}
|
||||||
|
</Anchor>
|
||||||
|
|
||||||
|
<Checkbox
|
||||||
|
label={t("autoSplitPDF.duplexMode", "Duplex Mode (Front and back scanning)")}
|
||||||
|
checked={parameters.duplexMode}
|
||||||
|
onChange={(e) => onParameterChange('duplexMode', e.currentTarget.checked)}
|
||||||
|
disabled={disabled}
|
||||||
|
/>
|
||||||
|
</Stack>
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Stack gap="md">
|
<Stack gap="md">
|
||||||
{/* Method Selector */}
|
{/* Method Selector */}
|
||||||
@ -129,6 +151,7 @@ const SplitSettings = ({
|
|||||||
{ value: SPLIT_METHODS.BY_PAGE_COUNT, label: t("split.methods.byPageCount", "Split by Page Count") },
|
{ value: SPLIT_METHODS.BY_PAGE_COUNT, label: t("split.methods.byPageCount", "Split by Page Count") },
|
||||||
{ value: SPLIT_METHODS.BY_DOC_COUNT, label: t("split.methods.byDocCount", "Split by Document Count") },
|
{ value: SPLIT_METHODS.BY_DOC_COUNT, label: t("split.methods.byDocCount", "Split by Document Count") },
|
||||||
{ value: SPLIT_METHODS.BY_CHAPTERS, label: t("split.methods.byChapters", "Split by Chapters") },
|
{ value: SPLIT_METHODS.BY_CHAPTERS, label: t("split.methods.byChapters", "Split by Chapters") },
|
||||||
|
{ value: SPLIT_METHODS.BY_PAGE_DIVIDER, label: t("split.methods.byPageDivider", "Split by Page Divider") },
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
@ -139,6 +162,7 @@ const SplitSettings = ({
|
|||||||
parameters.method === SPLIT_METHODS.BY_PAGE_COUNT ||
|
parameters.method === SPLIT_METHODS.BY_PAGE_COUNT ||
|
||||||
parameters.method === SPLIT_METHODS.BY_DOC_COUNT) && renderSplitValueForm()}
|
parameters.method === SPLIT_METHODS.BY_DOC_COUNT) && renderSplitValueForm()}
|
||||||
{parameters.method === SPLIT_METHODS.BY_CHAPTERS && renderByChaptersForm()}
|
{parameters.method === SPLIT_METHODS.BY_CHAPTERS && renderByChaptersForm()}
|
||||||
|
{parameters.method === SPLIT_METHODS.BY_PAGE_DIVIDER && renderByPageDividerForm()}
|
||||||
</Stack>
|
</Stack>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -53,6 +53,17 @@ export const useSplitTips = (): TooltipContent => {
|
|||||||
t("split.tooltip.byChapters.bullet2", "Include Metadata: Preserve document properties"),
|
t("split.tooltip.byChapters.bullet2", "Include Metadata: Preserve document properties"),
|
||||||
t("split.tooltip.byChapters.bullet3", "Allow Duplicates: Handle repeated bookmark names")
|
t("split.tooltip.byChapters.bullet3", "Allow Duplicates: Handle repeated bookmark names")
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: t("split.tooltip.byPageDivider.title", "Split by Page Divider"),
|
||||||
|
description: t("split.tooltip.byPageDivider.text", "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together."),
|
||||||
|
bullets: [
|
||||||
|
t("split.tooltip.byPageDivider.bullet1", "Print divider sheets from the download link"),
|
||||||
|
t("split.tooltip.byPageDivider.bullet2", "Insert divider sheets between your documents"),
|
||||||
|
t("split.tooltip.byPageDivider.bullet3", "Scan all documents together as one PDF"),
|
||||||
|
t("split.tooltip.byPageDivider.bullet4", "Upload - divider pages are automatically detected and removed"),
|
||||||
|
t("split.tooltip.byPageDivider.bullet5", "Enable Duplex Mode if scanning both sides of divider sheets")
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
@ -4,7 +4,8 @@ export const SPLIT_METHODS = {
|
|||||||
BY_SIZE: 'bySize',
|
BY_SIZE: 'bySize',
|
||||||
BY_PAGE_COUNT: 'byPageCount',
|
BY_PAGE_COUNT: 'byPageCount',
|
||||||
BY_DOC_COUNT: 'byDocCount',
|
BY_DOC_COUNT: 'byDocCount',
|
||||||
BY_CHAPTERS: 'byChapters'
|
BY_CHAPTERS: 'byChapters',
|
||||||
|
BY_PAGE_DIVIDER: 'byPageDivider'
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
|
|
||||||
@ -14,7 +15,8 @@ export const ENDPOINTS = {
|
|||||||
[SPLIT_METHODS.BY_SIZE]: 'split-by-size-or-count',
|
[SPLIT_METHODS.BY_SIZE]: 'split-by-size-or-count',
|
||||||
[SPLIT_METHODS.BY_PAGE_COUNT]: 'split-by-size-or-count',
|
[SPLIT_METHODS.BY_PAGE_COUNT]: 'split-by-size-or-count',
|
||||||
[SPLIT_METHODS.BY_DOC_COUNT]: 'split-by-size-or-count',
|
[SPLIT_METHODS.BY_DOC_COUNT]: 'split-by-size-or-count',
|
||||||
[SPLIT_METHODS.BY_CHAPTERS]: 'split-pdf-by-chapters'
|
[SPLIT_METHODS.BY_CHAPTERS]: 'split-pdf-by-chapters',
|
||||||
|
[SPLIT_METHODS.BY_PAGE_DIVIDER]: 'auto-split-pdf'
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export type SplitMethod = typeof SPLIT_METHODS[keyof typeof SPLIT_METHODS];
|
export type SplitMethod = typeof SPLIT_METHODS[keyof typeof SPLIT_METHODS];
|
||||||
|
@ -38,6 +38,9 @@ export const buildSplitFormData = (parameters: SplitParameters, file: File): For
|
|||||||
formData.append("includeMetadata", parameters.includeMetadata.toString());
|
formData.append("includeMetadata", parameters.includeMetadata.toString());
|
||||||
formData.append("allowDuplicates", parameters.allowDuplicates.toString());
|
formData.append("allowDuplicates", parameters.allowDuplicates.toString());
|
||||||
break;
|
break;
|
||||||
|
case SPLIT_METHODS.BY_PAGE_DIVIDER:
|
||||||
|
formData.append("duplexMode", parameters.duplexMode.toString());
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
throw new Error(`Unknown split method: ${parameters.method}`);
|
throw new Error(`Unknown split method: ${parameters.method}`);
|
||||||
}
|
}
|
||||||
@ -57,6 +60,8 @@ export const getSplitEndpoint = (parameters: SplitParameters): string => {
|
|||||||
return "/api/v1/general/split-by-size-or-count";
|
return "/api/v1/general/split-by-size-or-count";
|
||||||
case SPLIT_METHODS.BY_CHAPTERS:
|
case SPLIT_METHODS.BY_CHAPTERS:
|
||||||
return "/api/v1/general/split-pdf-by-chapters";
|
return "/api/v1/general/split-pdf-by-chapters";
|
||||||
|
case SPLIT_METHODS.BY_PAGE_DIVIDER:
|
||||||
|
return "/api/v1/misc/auto-split-pdf";
|
||||||
default:
|
default:
|
||||||
throw new Error(`Unknown split method: ${parameters.method}`);
|
throw new Error(`Unknown split method: ${parameters.method}`);
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ export interface SplitParameters extends BaseParameters {
|
|||||||
bookmarkLevel: string;
|
bookmarkLevel: string;
|
||||||
includeMetadata: boolean;
|
includeMetadata: boolean;
|
||||||
allowDuplicates: boolean;
|
allowDuplicates: boolean;
|
||||||
|
duplexMode: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type SplitParametersHook = BaseParametersHook<SplitParameters>;
|
export type SplitParametersHook = BaseParametersHook<SplitParameters>;
|
||||||
@ -26,6 +27,7 @@ export const defaultParameters: SplitParameters = {
|
|||||||
bookmarkLevel: '1',
|
bookmarkLevel: '1',
|
||||||
includeMetadata: false,
|
includeMetadata: false,
|
||||||
allowDuplicates: false,
|
allowDuplicates: false,
|
||||||
|
duplexMode: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
export const useSplitParameters = (): SplitParametersHook => {
|
export const useSplitParameters = (): SplitParametersHook => {
|
||||||
@ -49,6 +51,8 @@ export const useSplitParameters = (): SplitParametersHook => {
|
|||||||
return params.splitValue.trim() !== "";
|
return params.splitValue.trim() !== "";
|
||||||
case SPLIT_METHODS.BY_CHAPTERS:
|
case SPLIT_METHODS.BY_CHAPTERS:
|
||||||
return params.bookmarkLevel !== "";
|
return params.bookmarkLevel !== "";
|
||||||
|
case SPLIT_METHODS.BY_PAGE_DIVIDER:
|
||||||
|
return true; // No required parameters
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user