Fixed multiple page issue
This commit is contained in:
@@ -54,10 +54,12 @@ class DocumentProcessingService:
|
|||||||
|
|
||||||
# Step 2: Analyze layout
|
# Step 2: Analyze layout
|
||||||
layout_results = self.layout_service.analyze_document_layout(document)
|
layout_results = self.layout_service.analyze_document_layout(document)
|
||||||
document.document_metadata = document.document_metadata or {}
|
metadata = document.document_metadata or {}
|
||||||
document.document_metadata["layout"] = layout_results
|
metadata["layout"] = layout_results
|
||||||
|
document.document_metadata = metadata
|
||||||
|
|
||||||
# Step 3: Generate template
|
# Step 3: Generate template
|
||||||
|
self.db.refresh(document)
|
||||||
template = self.template_service.generate_template(document)
|
template = self.template_service.generate_template(document)
|
||||||
|
|
||||||
# Step 4: Update document status
|
# Step 4: Update document status
|
||||||
|
|||||||
@@ -13,20 +13,24 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="preview-area"
|
<div class="preview-area p-4" style="overflow-y: auto;">
|
||||||
id="document-layout-list"
|
|
||||||
cdkDropList
|
|
||||||
[cdkDropListData]="layoutNodes"
|
|
||||||
[cdkDropListConnectedTo]="getConnectedDropLists()"
|
|
||||||
(cdkDropListDropped)="drop($event)">
|
|
||||||
|
|
||||||
<div *ngIf="layoutNodes.length === 0" class="empty-state">
|
<div *ngIf="layoutNodes.length === 0" class="empty-state">
|
||||||
<i class="pi pi-file-pdf text-4xl mb-3"></i>
|
<i class="pi pi-file-pdf text-4xl mb-3"></i>
|
||||||
<p>Upload a document to view its extracted layout structure.</p>
|
<p>Upload a document to view its extracted layout structure.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="document-canvas" [style.aspect-ratio]="pageWidth + ' / ' + pageHeight">
|
<div *ngFor="let page of pages; let i = index" class="document-page-container mb-5">
|
||||||
<div *ngFor="let node of layoutNodes"
|
<div class="page-header text-sm font-semibold text-gray-500 mb-2">Page {{ page.page_number }}</div>
|
||||||
|
|
||||||
|
<div class="document-canvas"
|
||||||
|
[id]="'document-layout-list-' + i"
|
||||||
|
cdkDropList
|
||||||
|
[cdkDropListData]="page.nodes"
|
||||||
|
[cdkDropListConnectedTo]="getConnectedDropLists()"
|
||||||
|
(cdkDropListDropped)="drop($event)"
|
||||||
|
[style.aspect-ratio]="page.width + ' / ' + page.height">
|
||||||
|
|
||||||
|
<div *ngFor="let node of page.nodes"
|
||||||
cdkDrag
|
cdkDrag
|
||||||
class="layout-node"
|
class="layout-node"
|
||||||
[ngClass]="node.block_type.toLowerCase()"
|
[ngClass]="node.block_type.toLowerCase()"
|
||||||
@@ -40,6 +44,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
|
||||||
<!-- RIGHT PANEL: TEMPLATE MAPPING -->
|
<!-- RIGHT PANEL: TEMPLATE MAPPING -->
|
||||||
@@ -73,7 +78,7 @@
|
|||||||
[id]="'field-' + field.pk_template_field_id"
|
[id]="'field-' + field.pk_template_field_id"
|
||||||
cdkDropList
|
cdkDropList
|
||||||
[cdkDropListData]="mappings[field.pk_template_field_id]"
|
[cdkDropListData]="mappings[field.pk_template_field_id]"
|
||||||
[cdkDropListConnectedTo]="['document-layout-list']"
|
[cdkDropListConnectedTo]="getCanvasDropLists()"
|
||||||
(cdkDropListDropped)="drop($event, field.pk_template_field_id)">
|
(cdkDropListDropped)="drop($event, field.pk_template_field_id)">
|
||||||
|
|
||||||
<div class="placeholder" *ngIf="mappings[field.pk_template_field_id].length === 0">
|
<div class="placeholder" *ngIf="mappings[field.pk_template_field_id].length === 0">
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ export class TemplatesComponent implements OnInit {
|
|||||||
// Document State
|
// Document State
|
||||||
documentId: string | null = null;
|
documentId: string | null = null;
|
||||||
layoutNodes: DocumentLayout[] = [];
|
layoutNodes: DocumentLayout[] = [];
|
||||||
|
pages: { page_number: number, nodes: DocumentLayout[], width: number, height: number }[] = [];
|
||||||
pageWidth: number = 800;
|
pageWidth: number = 800;
|
||||||
pageHeight: number = 1100;
|
pageHeight: number = 1100;
|
||||||
|
|
||||||
@@ -90,9 +91,26 @@ export class TemplatesComponent implements OnInit {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.layoutNodes = layouts;
|
this.layoutNodes = layouts;
|
||||||
if (layouts.length > 0) {
|
|
||||||
this.pageWidth = layouts[0].page_width;
|
const pageMap = new Map<number, { page_number: number, nodes: DocumentLayout[], width: number, height: number }>();
|
||||||
this.pageHeight = layouts[0].page_height;
|
|
||||||
|
layouts.forEach(node => {
|
||||||
|
if (!pageMap.has(node.page_no)) {
|
||||||
|
pageMap.set(node.page_no, {
|
||||||
|
page_number: node.page_no,
|
||||||
|
nodes: [],
|
||||||
|
width: node.page_width,
|
||||||
|
height: node.page_height
|
||||||
|
});
|
||||||
|
}
|
||||||
|
pageMap.get(node.page_no)!.nodes.push(node);
|
||||||
|
});
|
||||||
|
|
||||||
|
this.pages = Array.from(pageMap.values()).sort((a, b) => a.page_number - b.page_number);
|
||||||
|
|
||||||
|
if (this.pages.length > 0) {
|
||||||
|
this.pageWidth = this.pages[0].width;
|
||||||
|
this.pageHeight = this.pages[0].height;
|
||||||
}
|
}
|
||||||
// Trigger auto-recognition
|
// Trigger auto-recognition
|
||||||
this.autoRecognize();
|
this.autoRecognize();
|
||||||
@@ -165,4 +183,8 @@ export class TemplatesComponent implements OnInit {
|
|||||||
// Return all field ID strings as drop lists
|
// Return all field ID strings as drop lists
|
||||||
return this.templateFields.map(f => 'field-' + f.pk_template_field_id);
|
return this.templateFields.map(f => 'field-' + f.pk_template_field_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getCanvasDropLists() {
|
||||||
|
return this.pages.map((_, i) => 'document-layout-list-' + i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user