<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.comfac.net/index.php?action=history&amp;feed=atom&amp;title=Resume_CV_Renamer_Pipeline</id>
	<title>Resume CV Renamer Pipeline - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.comfac.net/index.php?action=history&amp;feed=atom&amp;title=Resume_CV_Renamer_Pipeline"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.comfac.net/index.php?title=Resume_CV_Renamer_Pipeline&amp;action=history"/>
	<updated>2026-08-04T11:33:57Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://mediawiki.comfac.net/index.php?title=Resume_CV_Renamer_Pipeline&amp;diff=266&amp;oldid=prev</id>
		<title>Justinaquino: Add Resume / CV Renamer Pipeline tool article (intake, OCR/vision-OCR, AI extraction, rename, VCF export)</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.comfac.net/index.php?title=Resume_CV_Renamer_Pipeline&amp;diff=266&amp;oldid=prev"/>
		<updated>2026-07-31T14:25:40Z</updated>

		<summary type="html">&lt;p&gt;Add Resume / CV Renamer Pipeline tool article (intake, OCR/vision-OCR, AI extraction, rename, VCF export)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Resume / CV Renamer Pipeline =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f8f9fa; border:1px solid #ddd; border-radius:4px; padding:10px 16px; margin-bottom:16px;&amp;quot;&amp;gt;&lt;br /&gt;
Automated resume ingestion, OCR, AI extraction, file renaming, and VCF contact export for recruitment workflows.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Location:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;/path/to/resume-renamer/&amp;lt;/code&amp;gt; (configure to your local HR/resume folder)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Upstream docs:&amp;#039;&amp;#039;&amp;#039; [[Frappe HRMS - Ch01 Recruitment]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== What It Does ==&lt;br /&gt;
&lt;br /&gt;
# Drop a resume file (PDF, DOCX, JPG, PNG) into the folder.&lt;br /&gt;
# The scanner detects the new file and extracts text with &amp;lt;code&amp;gt;pdftotext&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Image files or image-based PDFs are converted with &amp;lt;code&amp;gt;img2pdf&amp;lt;/code&amp;gt; and OCR&amp;#039;d with &amp;lt;code&amp;gt;ocrmypdf&amp;lt;/code&amp;gt; if available.&lt;br /&gt;
# If OCR fails or is unavailable, the scanner falls back to &amp;#039;&amp;#039;&amp;#039;vision OCR&amp;#039;&amp;#039;&amp;#039; using a local VLM (e.g. &amp;lt;code&amp;gt;glm-ocr:bf16&amp;lt;/code&amp;gt;).&lt;br /&gt;
# A local LLM extracts structured candidate data.&lt;br /&gt;
# The file is renamed to: &amp;lt;code&amp;gt;YYMMDD Full Name Degree.pdf&amp;lt;/code&amp;gt;&lt;br /&gt;
# A &amp;lt;code&amp;gt;YYMMDD-HHMMSS_Bulk_Import.vcf&amp;lt;/code&amp;gt; file is generated for contact import.&lt;br /&gt;
&lt;br /&gt;
The single source of truth is the SQLite database &amp;lt;code&amp;gt;resumes.db&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Supported Inputs ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Format !! Handling&lt;br /&gt;
|-&lt;br /&gt;
| PDF with text || Direct extraction&lt;br /&gt;
|-&lt;br /&gt;
| Image-based PDF || &amp;lt;code&amp;gt;ocrmypdf&amp;lt;/code&amp;gt; → vision OCR fallback&lt;br /&gt;
|-&lt;br /&gt;
| JPG / PNG || &amp;lt;code&amp;gt;img2pdf&amp;lt;/code&amp;gt; → vision OCR fallback&lt;br /&gt;
|-&lt;br /&gt;
| DOCX || Detected; convert to PDF manually if needed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Quick Start ==&lt;br /&gt;
&lt;br /&gt;
=== Run once manually ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /path/to/resume-renamer&lt;br /&gt;
source ./venv/bin/activate&lt;br /&gt;
python cv_auto_scanner.py --once&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dry-run preview ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python cv_auto_scanner.py --once --dry-run&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Daemon mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python cv_auto_scanner.py --daemon --interval 900  # 15 minutes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Force a full re-scan ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rm -f .scanner_state.json&lt;br /&gt;
python cv_auto_scanner.py --once&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Common Issues ==&lt;br /&gt;
&lt;br /&gt;
=== Degree shows &amp;quot;General&amp;quot; or is empty ===&lt;br /&gt;
&lt;br /&gt;
The scanner now explicitly accepts diplomas and certificates in the &amp;lt;code&amp;gt;degree&amp;lt;/code&amp;gt; field. If an older file still shows &amp;quot;General&amp;quot;, reset it and reprocess:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
source ./venv/bin/activate&lt;br /&gt;
python3 -c &amp;quot;&lt;br /&gt;
import resume_db&lt;br /&gt;
resume_db.init_db()&lt;br /&gt;
resume_db.upsert_candidate(&amp;#039;ORIGINAL_FILENAME.pdf&amp;#039;, status=&amp;#039;pending&amp;#039;, retry_count=0, last_error=None)&lt;br /&gt;
&amp;quot;&lt;br /&gt;
rm -f .scanner_state.json&lt;br /&gt;
python cv_auto_scanner.py --once&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;Text too short / unreadable&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
The scanner automatically tries OCR and vision OCR. If it still fails:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
source ./venv/bin/activate&lt;br /&gt;
python /path/to/rpdf-skills/vision_ocr.py FAILED_FILE.pdf --model glm-ocr:bf16 --format text -o extracted.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then rebuild a searchable PDF and re-run the scanner.&lt;br /&gt;
&lt;br /&gt;
=== venv broken after Python upgrade ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install python3.14-venv python3-pip&lt;br /&gt;
cd /path/to/resume-renamer&lt;br /&gt;
rm -rf venv&lt;br /&gt;
python3.14 -m venv venv&lt;br /&gt;
source ./venv/bin/activate&lt;br /&gt;
pip install --upgrade pip&lt;br /&gt;
pip install img2pdf requests pdfplumber psycopg2-binary fpdf2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== VCF Import ==&lt;br /&gt;
&lt;br /&gt;
New &amp;lt;code&amp;gt;*_Bulk_Import.vcf&amp;lt;/code&amp;gt; files are generated automatically. Import them into your contacts app:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Google Contacts:&amp;#039;&amp;#039;&amp;#039; contacts.google.com → Import → Select VCF&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Android:&amp;#039;&amp;#039;&amp;#039; Copy VCF to phone → Contacts → Settings → Import&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Thunderbird:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;thunderbird -compose &amp;quot;to=hr@example.com,subject=Contact Card,attachment=/path/to/YYMMDD-HHMMSS_Bulk_Import.vcf&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The VCF uses a non-standard layout for multi-part names:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! vCard Field !! Value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; (Last Name) || Role context, e.g. &amp;lt;code&amp;gt;Electrical Applicant 260616&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; (First Name) || Candidate&amp;#039;s full name&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;FN&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;{Full Name} - {Context}&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
To specify the context for a batch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python cv_auto_scanner.py --vcf-context &amp;quot;Electrical Applicant 260616&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Related Pages ==&lt;br /&gt;
&lt;br /&gt;
* [[Frappe HRMS]]&lt;br /&gt;
* [[Frappe HRMS - Ch01 Recruitment]]&lt;br /&gt;
* [[Steps to Repair and OCR a Scanned or Corrupted PDF in Ubuntu]]&lt;br /&gt;
* [[🧠 Process: Selecting and Installing the Right Ollama Model for Your Hardware]]&lt;br /&gt;
&lt;br /&gt;
[[Category:HR]]&lt;br /&gt;
[[Category:Recruitment]]&lt;br /&gt;
[[Category:Automation]]&lt;br /&gt;
[[Category:Comfac]]&lt;br /&gt;
[[Category:IT Operations]]&lt;/div&gt;</summary>
		<author><name>Justinaquino</name></author>
	</entry>
</feed>