Auto split

This commit is contained in:
Connor Yoh 2025-09-15 17:30:06 +01:00
parent a57373b968
commit a6b210eca8
6 changed files with 51 additions and 4 deletions

View File

@ -697,7 +697,8 @@
"bySize": "Split by File Size",
"byPageCount": "Split by Page Count",
"byDocCount": "Split by Document Count",
"byChapters": "Split by Chapters"
"byChapters": "Split by Chapters",
"byPageDivider": "Split by Page Divider"
},
"value": {
"fileSize": {

View File

@ -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 { isSplitMethod, SPLIT_METHODS } from '../../../constants/splitConstants';
import { SplitParameters } from '../../../hooks/tools/split/useSplitParameters';
@ -113,6 +114,27 @@ const SplitSettings = ({
</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 (
<Stack gap="md">
{/* 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_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_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_DOC_COUNT) && renderSplitValueForm()}
{parameters.method === SPLIT_METHODS.BY_CHAPTERS && renderByChaptersForm()}
{parameters.method === SPLIT_METHODS.BY_PAGE_DIVIDER && renderByPageDividerForm()}
</Stack>
);
}

View File

@ -53,6 +53,17 @@ export const useSplitTips = (): TooltipContent => {
t("split.tooltip.byChapters.bullet2", "Include Metadata: Preserve document properties"),
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")
]
}
]
};

View File

@ -4,7 +4,8 @@ export const SPLIT_METHODS = {
BY_SIZE: 'bySize',
BY_PAGE_COUNT: 'byPageCount',
BY_DOC_COUNT: 'byDocCount',
BY_CHAPTERS: 'byChapters'
BY_CHAPTERS: 'byChapters',
BY_PAGE_DIVIDER: 'byPageDivider'
} as const;
@ -14,7 +15,8 @@ export const ENDPOINTS = {
[SPLIT_METHODS.BY_SIZE]: '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_CHAPTERS]: 'split-pdf-by-chapters'
[SPLIT_METHODS.BY_CHAPTERS]: 'split-pdf-by-chapters',
[SPLIT_METHODS.BY_PAGE_DIVIDER]: 'auto-split-pdf'
} as const;
export type SplitMethod = typeof SPLIT_METHODS[keyof typeof SPLIT_METHODS];

View File

@ -38,6 +38,9 @@ export const buildSplitFormData = (parameters: SplitParameters, file: File): For
formData.append("includeMetadata", parameters.includeMetadata.toString());
formData.append("allowDuplicates", parameters.allowDuplicates.toString());
break;
case SPLIT_METHODS.BY_PAGE_DIVIDER:
formData.append("duplexMode", parameters.duplexMode.toString());
break;
default:
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";
case SPLIT_METHODS.BY_CHAPTERS:
return "/api/v1/general/split-pdf-by-chapters";
case SPLIT_METHODS.BY_PAGE_DIVIDER:
return "/api/v1/misc/auto-split-pdf";
default:
throw new Error(`Unknown split method: ${parameters.method}`);
}

View File

@ -12,6 +12,7 @@ export interface SplitParameters extends BaseParameters {
bookmarkLevel: string;
includeMetadata: boolean;
allowDuplicates: boolean;
duplexMode: boolean;
}
export type SplitParametersHook = BaseParametersHook<SplitParameters>;
@ -26,6 +27,7 @@ export const defaultParameters: SplitParameters = {
bookmarkLevel: '1',
includeMetadata: false,
allowDuplicates: false,
duplexMode: false,
};
export const useSplitParameters = (): SplitParametersHook => {
@ -49,6 +51,8 @@ export const useSplitParameters = (): SplitParametersHook => {
return params.splitValue.trim() !== "";
case SPLIT_METHODS.BY_CHAPTERS:
return params.bookmarkLevel !== "";
case SPLIT_METHODS.BY_PAGE_DIVIDER:
return true; // No required parameters
default:
return false;
}