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", "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": {

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 { 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>
); );
} }

View File

@ -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")
]
} }
] ]
}; };

View File

@ -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];

View File

@ -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}`);
} }

View File

@ -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;
} }