الميزة: إضافة مكونات تحسين محركات البحث لصفحات هبوط الأدوات، بما في ذلك قسم الأسئلة الشائعة وقسم الأدوات ذات الصلة.
- تم تنفيذ مكون قسم الأسئلة الشائعة لعرض الأسئلة المتكررة مع إجابات قابلة للتوسيع. - تم إنشاء مكون الأدوات ذات الصلة لعرض الأدوات المرتبطة بالأداة الحالية بناءً على بيانات تحسين محركات البحث. - تم تطوير مكون صفحة هبوط الأدوات لتغليف مكونات الأدوات ببيانات تعريف تحسين محركات البحث، والبيانات المنظمة، والمحتوى الإضافي. - تم إنشاء إعدادات مركزية لتحسين محركات البحث في ملف seoData.ts لإدارة بيانات تعريف الأدوات، والأسئلة الشائعة، والأدوات ذات الصلة. ---- feat: add SEO components for tool landing pages including FAQ and related tools sections - Implemented FAQSection component to display frequently asked questions with expandable answers. - Created RelatedTools component to show tools related to the current tool based on SEO data. - Developed ToolLandingPage component to wrap tool components with SEO metadata, structured data, and additional content. - Established central SEO configuration in seoData.ts for managing tool metadata, FAQs, and related tools.
This commit is contained in:
11
frontend/public/humans.txt
Normal file
11
frontend/public/humans.txt
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
/* TEAM */
|
||||||
|
Project: SaaS-PDF
|
||||||
|
Role: Full-Stack Development
|
||||||
|
Technology: React, TypeScript, Python, Flask, Celery
|
||||||
|
|
||||||
|
/* SITE */
|
||||||
|
Standards: HTML5, CSS3, ECMAScript 2020+
|
||||||
|
Components: React 18, Vite, Tailwind CSS, react-helmet-async
|
||||||
|
Backend: Flask, Celery, Redis
|
||||||
|
Languages: English, Arabic, French
|
||||||
|
Software: VS Code, Docker, GitHub
|
||||||
56
frontend/public/llms.txt
Normal file
56
frontend/public/llms.txt
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
# SaaS-PDF — llms.txt
|
||||||
|
# A description of this site for AI assistants and large language models.
|
||||||
|
|
||||||
|
> SaaS-PDF is a free, online document toolkit that lets users convert,
|
||||||
|
> compress, merge, split, edit, and process PDF files, images, and more —
|
||||||
|
> directly in the browser with no signup required.
|
||||||
|
|
||||||
|
## Tools Available
|
||||||
|
|
||||||
|
### PDF Tools
|
||||||
|
- [PDF to Word](/tools/pdf-to-word): Convert PDF documents to editable Word (DOCX) format
|
||||||
|
- [Word to PDF](/tools/word-to-pdf): Convert Word documents (DOC/DOCX) to PDF
|
||||||
|
- [Compress PDF](/tools/compress-pdf): Reduce PDF file size while maintaining quality
|
||||||
|
- [Merge PDF](/tools/merge-pdf): Combine multiple PDF files into one document
|
||||||
|
- [Split PDF](/tools/split-pdf): Split a PDF into separate pages or ranges
|
||||||
|
- [Rotate PDF](/tools/rotate-pdf): Rotate PDF pages by 90°, 180°, or 270°
|
||||||
|
- [PDF to Images](/tools/pdf-to-images): Convert PDF pages to PNG or JPG images
|
||||||
|
- [Images to PDF](/tools/images-to-pdf): Combine multiple images into a single PDF
|
||||||
|
- [Watermark PDF](/tools/watermark-pdf): Add custom text watermarks to PDF pages
|
||||||
|
- [Remove Watermark](/tools/remove-watermark-pdf): Remove text watermarks from PDFs
|
||||||
|
- [Protect PDF](/tools/protect-pdf): Add password protection and encryption to PDFs
|
||||||
|
- [Unlock PDF](/tools/unlock-pdf): Remove password protection from PDFs
|
||||||
|
- [Page Numbers](/tools/page-numbers): Add page numbers to PDF documents
|
||||||
|
- [Reorder PDF](/tools/reorder-pdf): Rearrange pages in a PDF document
|
||||||
|
- [Extract Pages](/tools/extract-pages): Extract specific pages from a PDF
|
||||||
|
- [PDF Editor](/tools/pdf-editor): Edit and optimize PDF documents online
|
||||||
|
|
||||||
|
### Image Tools
|
||||||
|
- [Image Converter](/tools/image-converter): Convert images between JPG, PNG, and WebP
|
||||||
|
- [Image Resize](/tools/image-resize): Resize images to exact dimensions
|
||||||
|
- [Compress Image](/tools/compress-image): Reduce image file size while keeping quality
|
||||||
|
- [Remove Background](/tools/remove-background): AI-powered background removal from images
|
||||||
|
|
||||||
|
### AI Tools
|
||||||
|
- [OCR](/tools/ocr): Extract text from images and scanned PDFs (English, Arabic, French)
|
||||||
|
- [Chat with PDF](/tools/chat-pdf): Ask questions about PDF documents using AI
|
||||||
|
- [Summarize PDF](/tools/summarize-pdf): Generate AI summaries of PDF documents
|
||||||
|
- [Translate PDF](/tools/translate-pdf): Translate PDF content to any language
|
||||||
|
- [Extract Tables](/tools/extract-tables): Detect and extract tables from PDF documents
|
||||||
|
- [PDF Flowchart](/tools/pdf-flowchart): Convert PDF procedures into interactive flowcharts
|
||||||
|
|
||||||
|
### Convert Tools
|
||||||
|
- [PDF to Excel](/tools/pdf-to-excel): Convert PDF tables to Excel spreadsheets
|
||||||
|
- [HTML to PDF](/tools/html-to-pdf): Convert HTML files to PDF documents
|
||||||
|
|
||||||
|
### Utility Tools
|
||||||
|
- [QR Code Generator](/tools/qr-code): Generate QR codes from text or URLs
|
||||||
|
- [Video to GIF](/tools/video-to-gif): Create animated GIFs from video clips
|
||||||
|
- [Word Counter](/tools/word-counter): Count words, characters, sentences, and paragraphs
|
||||||
|
- [Text Cleaner](/tools/text-cleaner): Clean up text formatting and whitespace
|
||||||
|
|
||||||
|
## Key Facts
|
||||||
|
- All tools are free to use with no signup required
|
||||||
|
- Files are automatically deleted within 30 minutes for privacy
|
||||||
|
- Available in English, Arabic, and French
|
||||||
|
- Works on any device with a modern web browser
|
||||||
@@ -2,5 +2,12 @@
|
|||||||
User-agent: *
|
User-agent: *
|
||||||
Allow: /
|
Allow: /
|
||||||
Disallow: /api/
|
Disallow: /api/
|
||||||
|
Disallow: /account
|
||||||
|
Disallow: /forgot-password
|
||||||
|
Disallow: /reset-password
|
||||||
|
|
||||||
|
# Sitemaps
|
||||||
Sitemap: https://yourdomain.com/sitemap.xml
|
Sitemap: https://yourdomain.com/sitemap.xml
|
||||||
|
|
||||||
|
# AI/LLM discoverability
|
||||||
|
# See also: /llms.txt
|
||||||
|
|||||||
50
frontend/public/sitemap.xml
Normal file
50
frontend/public/sitemap.xml
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||||
|
<!-- Pages -->
|
||||||
|
<url><loc>https://yourdomain.com/</loc><changefreq>daily</changefreq><priority>1.0</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/about</loc><changefreq>monthly</changefreq><priority>0.4</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/privacy</loc><changefreq>yearly</changefreq><priority>0.3</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/terms</loc><changefreq>yearly</changefreq><priority>0.3</priority></url>
|
||||||
|
|
||||||
|
<!-- PDF Tools -->
|
||||||
|
<url><loc>https://yourdomain.com/tools/pdf-to-word</loc><changefreq>weekly</changefreq><priority>0.9</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/tools/word-to-pdf</loc><changefreq>weekly</changefreq><priority>0.9</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/tools/compress-pdf</loc><changefreq>weekly</changefreq><priority>0.9</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/tools/merge-pdf</loc><changefreq>weekly</changefreq><priority>0.9</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/tools/split-pdf</loc><changefreq>weekly</changefreq><priority>0.8</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/tools/rotate-pdf</loc><changefreq>weekly</changefreq><priority>0.7</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/tools/pdf-to-images</loc><changefreq>weekly</changefreq><priority>0.8</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/tools/images-to-pdf</loc><changefreq>weekly</changefreq><priority>0.8</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/tools/watermark-pdf</loc><changefreq>weekly</changefreq><priority>0.7</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/tools/remove-watermark-pdf</loc><changefreq>weekly</changefreq><priority>0.7</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/tools/protect-pdf</loc><changefreq>weekly</changefreq><priority>0.8</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/tools/unlock-pdf</loc><changefreq>weekly</changefreq><priority>0.8</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/tools/page-numbers</loc><changefreq>weekly</changefreq><priority>0.7</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/tools/reorder-pdf</loc><changefreq>weekly</changefreq><priority>0.7</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/tools/extract-pages</loc><changefreq>weekly</changefreq><priority>0.7</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/tools/pdf-editor</loc><changefreq>weekly</changefreq><priority>0.8</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/tools/pdf-flowchart</loc><changefreq>weekly</changefreq><priority>0.7</priority></url>
|
||||||
|
|
||||||
|
<!-- Image Tools -->
|
||||||
|
<url><loc>https://yourdomain.com/tools/image-converter</loc><changefreq>weekly</changefreq><priority>0.8</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/tools/image-resize</loc><changefreq>weekly</changefreq><priority>0.8</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/tools/compress-image</loc><changefreq>weekly</changefreq><priority>0.8</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/tools/remove-background</loc><changefreq>weekly</changefreq><priority>0.8</priority></url>
|
||||||
|
|
||||||
|
<!-- AI Tools -->
|
||||||
|
<url><loc>https://yourdomain.com/tools/ocr</loc><changefreq>weekly</changefreq><priority>0.8</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/tools/chat-pdf</loc><changefreq>weekly</changefreq><priority>0.8</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/tools/summarize-pdf</loc><changefreq>weekly</changefreq><priority>0.8</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/tools/translate-pdf</loc><changefreq>weekly</changefreq><priority>0.8</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/tools/extract-tables</loc><changefreq>weekly</changefreq><priority>0.8</priority></url>
|
||||||
|
|
||||||
|
<!-- Convert Tools -->
|
||||||
|
<url><loc>https://yourdomain.com/tools/pdf-to-excel</loc><changefreq>weekly</changefreq><priority>0.8</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/tools/html-to-pdf</loc><changefreq>weekly</changefreq><priority>0.7</priority></url>
|
||||||
|
|
||||||
|
<!-- Utility Tools -->
|
||||||
|
<url><loc>https://yourdomain.com/tools/qr-code</loc><changefreq>weekly</changefreq><priority>0.7</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/tools/video-to-gif</loc><changefreq>weekly</changefreq><priority>0.7</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/tools/word-counter</loc><changefreq>weekly</changefreq><priority>0.6</priority></url>
|
||||||
|
<url><loc>https://yourdomain.com/tools/text-cleaner</loc><changefreq>weekly</changefreq><priority>0.6</priority></url>
|
||||||
|
</urlset>
|
||||||
@@ -3,6 +3,7 @@ import { Routes, Route, useLocation } from 'react-router-dom';
|
|||||||
import Header from '@/components/layout/Header';
|
import Header from '@/components/layout/Header';
|
||||||
import Footer from '@/components/layout/Footer';
|
import Footer from '@/components/layout/Footer';
|
||||||
import ErrorBoundary from '@/components/shared/ErrorBoundary';
|
import ErrorBoundary from '@/components/shared/ErrorBoundary';
|
||||||
|
import ToolLandingPage from '@/components/seo/ToolLandingPage';
|
||||||
import { useDirection } from '@/hooks/useDirection';
|
import { useDirection } from '@/hooks/useDirection';
|
||||||
import { initAnalytics, trackPageView } from '@/services/analytics';
|
import { initAnalytics, trackPageView } from '@/services/analytics';
|
||||||
import { useAuthStore } from '@/stores/authStore';
|
import { useAuthStore } from '@/stores/authStore';
|
||||||
@@ -91,52 +92,52 @@ export default function App() {
|
|||||||
<Route path="/terms" element={<TermsPage />} />
|
<Route path="/terms" element={<TermsPage />} />
|
||||||
|
|
||||||
{/* PDF Tools */}
|
{/* PDF Tools */}
|
||||||
<Route path="/tools/pdf-to-word" element={<PdfToWord />} />
|
<Route path="/tools/pdf-to-word" element={<ToolLandingPage slug="pdf-to-word"><PdfToWord /></ToolLandingPage>} />
|
||||||
<Route path="/tools/word-to-pdf" element={<WordToPdf />} />
|
<Route path="/tools/word-to-pdf" element={<ToolLandingPage slug="word-to-pdf"><WordToPdf /></ToolLandingPage>} />
|
||||||
<Route path="/tools/compress-pdf" element={<PdfCompressor />} />
|
<Route path="/tools/compress-pdf" element={<ToolLandingPage slug="compress-pdf"><PdfCompressor /></ToolLandingPage>} />
|
||||||
<Route path="/tools/merge-pdf" element={<MergePdf />} />
|
<Route path="/tools/merge-pdf" element={<ToolLandingPage slug="merge-pdf"><MergePdf /></ToolLandingPage>} />
|
||||||
<Route path="/tools/split-pdf" element={<SplitPdf />} />
|
<Route path="/tools/split-pdf" element={<ToolLandingPage slug="split-pdf"><SplitPdf /></ToolLandingPage>} />
|
||||||
<Route path="/tools/rotate-pdf" element={<RotatePdf />} />
|
<Route path="/tools/rotate-pdf" element={<ToolLandingPage slug="rotate-pdf"><RotatePdf /></ToolLandingPage>} />
|
||||||
<Route path="/tools/pdf-to-images" element={<PdfToImages />} />
|
<Route path="/tools/pdf-to-images" element={<ToolLandingPage slug="pdf-to-images"><PdfToImages /></ToolLandingPage>} />
|
||||||
<Route path="/tools/images-to-pdf" element={<ImagesToPdf />} />
|
<Route path="/tools/images-to-pdf" element={<ToolLandingPage slug="images-to-pdf"><ImagesToPdf /></ToolLandingPage>} />
|
||||||
<Route path="/tools/watermark-pdf" element={<WatermarkPdf />} />
|
<Route path="/tools/watermark-pdf" element={<ToolLandingPage slug="watermark-pdf"><WatermarkPdf /></ToolLandingPage>} />
|
||||||
<Route path="/tools/protect-pdf" element={<ProtectPdf />} />
|
<Route path="/tools/protect-pdf" element={<ToolLandingPage slug="protect-pdf"><ProtectPdf /></ToolLandingPage>} />
|
||||||
<Route path="/tools/unlock-pdf" element={<UnlockPdf />} />
|
<Route path="/tools/unlock-pdf" element={<ToolLandingPage slug="unlock-pdf"><UnlockPdf /></ToolLandingPage>} />
|
||||||
<Route path="/tools/page-numbers" element={<AddPageNumbers />} />
|
<Route path="/tools/page-numbers" element={<ToolLandingPage slug="page-numbers"><AddPageNumbers /></ToolLandingPage>} />
|
||||||
<Route path="/tools/pdf-editor" element={<PdfEditor />} />
|
<Route path="/tools/pdf-editor" element={<ToolLandingPage slug="pdf-editor"><PdfEditor /></ToolLandingPage>} />
|
||||||
<Route path="/tools/pdf-flowchart" element={<PdfFlowchart />} />
|
<Route path="/tools/pdf-flowchart" element={<ToolLandingPage slug="pdf-flowchart"><PdfFlowchart /></ToolLandingPage>} />
|
||||||
|
|
||||||
{/* Image Tools */}
|
{/* Image Tools */}
|
||||||
<Route path="/tools/image-converter" element={<ImageConverter />} />
|
<Route path="/tools/image-converter" element={<ToolLandingPage slug="image-converter"><ImageConverter /></ToolLandingPage>} />
|
||||||
<Route path="/tools/image-resize" element={<ImageResize />} />
|
<Route path="/tools/image-resize" element={<ToolLandingPage slug="image-resize"><ImageResize /></ToolLandingPage>} />
|
||||||
<Route path="/tools/compress-image" element={<CompressImage />} />
|
<Route path="/tools/compress-image" element={<ToolLandingPage slug="compress-image"><CompressImage /></ToolLandingPage>} />
|
||||||
<Route path="/tools/ocr" element={<OcrTool />} />
|
<Route path="/tools/ocr" element={<ToolLandingPage slug="ocr"><OcrTool /></ToolLandingPage>} />
|
||||||
<Route path="/tools/remove-background" element={<RemoveBackground />} />
|
<Route path="/tools/remove-background" element={<ToolLandingPage slug="remove-background"><RemoveBackground /></ToolLandingPage>} />
|
||||||
|
|
||||||
{/* Convert Tools */}
|
{/* Convert Tools */}
|
||||||
<Route path="/tools/pdf-to-excel" element={<PdfToExcel />} />
|
<Route path="/tools/pdf-to-excel" element={<ToolLandingPage slug="pdf-to-excel"><PdfToExcel /></ToolLandingPage>} />
|
||||||
<Route path="/tools/html-to-pdf" element={<HtmlToPdf />} />
|
<Route path="/tools/html-to-pdf" element={<ToolLandingPage slug="html-to-pdf"><HtmlToPdf /></ToolLandingPage>} />
|
||||||
|
|
||||||
{/* PDF Extra Tools */}
|
{/* PDF Extra Tools */}
|
||||||
<Route path="/tools/remove-watermark-pdf" element={<RemoveWatermark />} />
|
<Route path="/tools/remove-watermark-pdf" element={<ToolLandingPage slug="remove-watermark-pdf"><RemoveWatermark /></ToolLandingPage>} />
|
||||||
<Route path="/tools/reorder-pdf" element={<ReorderPdf />} />
|
<Route path="/tools/reorder-pdf" element={<ToolLandingPage slug="reorder-pdf"><ReorderPdf /></ToolLandingPage>} />
|
||||||
<Route path="/tools/extract-pages" element={<ExtractPages />} />
|
<Route path="/tools/extract-pages" element={<ToolLandingPage slug="extract-pages"><ExtractPages /></ToolLandingPage>} />
|
||||||
|
|
||||||
{/* AI Tools */}
|
{/* AI Tools */}
|
||||||
<Route path="/tools/chat-pdf" element={<ChatPdf />} />
|
<Route path="/tools/chat-pdf" element={<ToolLandingPage slug="chat-pdf"><ChatPdf /></ToolLandingPage>} />
|
||||||
<Route path="/tools/summarize-pdf" element={<SummarizePdf />} />
|
<Route path="/tools/summarize-pdf" element={<ToolLandingPage slug="summarize-pdf"><SummarizePdf /></ToolLandingPage>} />
|
||||||
<Route path="/tools/translate-pdf" element={<TranslatePdf />} />
|
<Route path="/tools/translate-pdf" element={<ToolLandingPage slug="translate-pdf"><TranslatePdf /></ToolLandingPage>} />
|
||||||
<Route path="/tools/extract-tables" element={<TableExtractor />} />
|
<Route path="/tools/extract-tables" element={<ToolLandingPage slug="extract-tables"><TableExtractor /></ToolLandingPage>} />
|
||||||
|
|
||||||
{/* Other Tools */}
|
{/* Other Tools */}
|
||||||
<Route path="/tools/qr-code" element={<QrCodeGenerator />} />
|
<Route path="/tools/qr-code" element={<ToolLandingPage slug="qr-code"><QrCodeGenerator /></ToolLandingPage>} />
|
||||||
|
|
||||||
{/* Video Tools */}
|
{/* Video Tools */}
|
||||||
<Route path="/tools/video-to-gif" element={<VideoToGif />} />
|
<Route path="/tools/video-to-gif" element={<ToolLandingPage slug="video-to-gif"><VideoToGif /></ToolLandingPage>} />
|
||||||
|
|
||||||
{/* Text Tools */}
|
{/* Text Tools */}
|
||||||
<Route path="/tools/word-counter" element={<WordCounter />} />
|
<Route path="/tools/word-counter" element={<ToolLandingPage slug="word-counter"><WordCounter /></ToolLandingPage>} />
|
||||||
<Route path="/tools/text-cleaner" element={<TextCleaner />} />
|
<Route path="/tools/text-cleaner" element={<ToolLandingPage slug="text-cleaner"><TextCleaner /></ToolLandingPage>} />
|
||||||
|
|
||||||
{/* 404 */}
|
{/* 404 */}
|
||||||
<Route path="*" element={<NotFoundPage />} />
|
<Route path="*" element={<NotFoundPage />} />
|
||||||
|
|||||||
@@ -2,12 +2,68 @@ import { Link } from 'react-router-dom';
|
|||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { FileText } from 'lucide-react';
|
import { FileText } from 'lucide-react';
|
||||||
|
|
||||||
|
const FOOTER_TOOLS = {
|
||||||
|
PDF: [
|
||||||
|
{ slug: 'pdf-to-word', label: 'PDF to Word' },
|
||||||
|
{ slug: 'compress-pdf', label: 'Compress PDF' },
|
||||||
|
{ slug: 'merge-pdf', label: 'Merge PDF' },
|
||||||
|
{ slug: 'split-pdf', label: 'Split PDF' },
|
||||||
|
{ slug: 'pdf-to-images', label: 'PDF to Images' },
|
||||||
|
{ slug: 'protect-pdf', label: 'Protect PDF' },
|
||||||
|
{ slug: 'watermark-pdf', label: 'Watermark PDF' },
|
||||||
|
{ slug: 'pdf-editor', label: 'PDF Editor' },
|
||||||
|
],
|
||||||
|
'Image & Convert': [
|
||||||
|
{ slug: 'compress-image', label: 'Compress Image' },
|
||||||
|
{ slug: 'image-converter', label: 'Image Converter' },
|
||||||
|
{ slug: 'image-resize', label: 'Image Resize' },
|
||||||
|
{ slug: 'remove-background', label: 'Remove Background' },
|
||||||
|
{ slug: 'word-to-pdf', label: 'Word to PDF' },
|
||||||
|
{ slug: 'html-to-pdf', label: 'HTML to PDF' },
|
||||||
|
{ slug: 'pdf-to-excel', label: 'PDF to Excel' },
|
||||||
|
],
|
||||||
|
'AI & Utility': [
|
||||||
|
{ slug: 'chat-pdf', label: 'Chat with PDF' },
|
||||||
|
{ slug: 'summarize-pdf', label: 'Summarize PDF' },
|
||||||
|
{ slug: 'translate-pdf', label: 'Translate PDF' },
|
||||||
|
{ slug: 'ocr', label: 'OCR' },
|
||||||
|
{ slug: 'qr-code', label: 'QR Code Generator' },
|
||||||
|
{ slug: 'video-to-gif', label: 'Video to GIF' },
|
||||||
|
{ slug: 'word-counter', label: 'Word Counter' },
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
export default function Footer() {
|
export default function Footer() {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<footer className="border-t border-slate-200 bg-slate-50 dark:border-slate-700 dark:bg-slate-900">
|
<footer className="border-t border-slate-200 bg-slate-50 dark:border-slate-700 dark:bg-slate-900">
|
||||||
<div className="mx-auto max-w-7xl px-4 py-8 sm:px-6 lg:px-8">
|
<div className="mx-auto max-w-7xl px-4 py-10 sm:px-6 lg:px-8">
|
||||||
|
{/* Tool link grid */}
|
||||||
|
<div className="mb-8 grid gap-8 sm:grid-cols-2 lg:grid-cols-3">
|
||||||
|
{Object.entries(FOOTER_TOOLS).map(([category, tools]) => (
|
||||||
|
<div key={category}>
|
||||||
|
<h3 className="mb-3 text-sm font-semibold uppercase tracking-wider text-slate-900 dark:text-white">
|
||||||
|
{category}
|
||||||
|
</h3>
|
||||||
|
<ul className="space-y-2">
|
||||||
|
{tools.map((tool) => (
|
||||||
|
<li key={tool.slug}>
|
||||||
|
<Link
|
||||||
|
to={`/tools/${tool.slug}`}
|
||||||
|
className="text-sm text-slate-500 transition-colors hover:text-primary-600 dark:text-slate-400 dark:hover:text-primary-400"
|
||||||
|
>
|
||||||
|
{tool.label}
|
||||||
|
</Link>
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Bottom bar */}
|
||||||
|
<div className="border-t border-slate-200 pt-6 dark:border-slate-700">
|
||||||
<div className="flex flex-col items-center justify-between gap-4 sm:flex-row">
|
<div className="flex flex-col items-center justify-between gap-4 sm:flex-row">
|
||||||
{/* Brand */}
|
{/* Brand */}
|
||||||
<div className="flex items-center gap-2 text-slate-600 dark:text-slate-400">
|
<div className="flex items-center gap-2 text-slate-600 dark:text-slate-400">
|
||||||
@@ -40,6 +96,7 @@ export default function Footer() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
49
frontend/src/components/seo/FAQSection.tsx
Normal file
49
frontend/src/components/seo/FAQSection.tsx
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
import { useState } from 'react';
|
||||||
|
import { ChevronDown, ChevronUp } from 'lucide-react';
|
||||||
|
import type { ToolFAQ } from '@/config/seoData';
|
||||||
|
|
||||||
|
interface FAQSectionProps {
|
||||||
|
faqs: ToolFAQ[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function FAQSection({ faqs }: FAQSectionProps) {
|
||||||
|
const [openIndex, setOpenIndex] = useState<number | null>(0);
|
||||||
|
|
||||||
|
if (!faqs || faqs.length === 0) return null;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section className="mt-12">
|
||||||
|
<h2 className="mb-6 text-xl font-bold text-slate-900 dark:text-white">
|
||||||
|
Frequently Asked Questions
|
||||||
|
</h2>
|
||||||
|
<div className="divide-y divide-slate-200 rounded-xl border border-slate-200 bg-white dark:divide-slate-700 dark:border-slate-700 dark:bg-slate-800">
|
||||||
|
{faqs.map((faq, idx) => {
|
||||||
|
const isOpen = openIndex === idx;
|
||||||
|
return (
|
||||||
|
<div key={idx}>
|
||||||
|
<button
|
||||||
|
onClick={() => setOpenIndex(isOpen ? null : idx)}
|
||||||
|
className="flex w-full items-center justify-between px-5 py-4 text-left transition-colors hover:bg-slate-50 dark:hover:bg-slate-700/50"
|
||||||
|
aria-expanded={isOpen}
|
||||||
|
>
|
||||||
|
<span className="pr-4 font-medium text-slate-800 dark:text-slate-200">
|
||||||
|
{faq.question}
|
||||||
|
</span>
|
||||||
|
{isOpen ? (
|
||||||
|
<ChevronUp className="h-5 w-5 shrink-0 text-slate-400" />
|
||||||
|
) : (
|
||||||
|
<ChevronDown className="h-5 w-5 shrink-0 text-slate-400" />
|
||||||
|
)}
|
||||||
|
</button>
|
||||||
|
{isOpen && (
|
||||||
|
<div className="px-5 pb-4 text-sm leading-relaxed text-slate-600 dark:text-slate-400">
|
||||||
|
{faq.answer}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
}
|
||||||
56
frontend/src/components/seo/RelatedTools.tsx
Normal file
56
frontend/src/components/seo/RelatedTools.tsx
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
import { Link } from 'react-router-dom';
|
||||||
|
import { getToolSEO } from '@/config/seoData';
|
||||||
|
|
||||||
|
interface RelatedToolsProps {
|
||||||
|
currentSlug: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const CATEGORY_COLORS: Record<string, string> = {
|
||||||
|
PDF: 'bg-red-50 text-red-700 dark:bg-red-900/20 dark:text-red-400',
|
||||||
|
Image: 'bg-emerald-50 text-emerald-700 dark:bg-emerald-900/20 dark:text-emerald-400',
|
||||||
|
AI: 'bg-violet-50 text-violet-700 dark:bg-violet-900/20 dark:text-violet-400',
|
||||||
|
Convert: 'bg-blue-50 text-blue-700 dark:bg-blue-900/20 dark:text-blue-400',
|
||||||
|
Utility: 'bg-amber-50 text-amber-700 dark:bg-amber-900/20 dark:text-amber-400',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function RelatedTools({ currentSlug }: RelatedToolsProps) {
|
||||||
|
const currentTool = getToolSEO(currentSlug);
|
||||||
|
if (!currentTool) return null;
|
||||||
|
|
||||||
|
const relatedTools = currentTool.relatedSlugs
|
||||||
|
.map((slug) => getToolSEO(slug))
|
||||||
|
.filter(Boolean);
|
||||||
|
|
||||||
|
if (relatedTools.length === 0) return null;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section className="mt-12">
|
||||||
|
<h2 className="mb-6 text-xl font-bold text-slate-900 dark:text-white">
|
||||||
|
Related Tools
|
||||||
|
</h2>
|
||||||
|
<div className="grid gap-4 sm:grid-cols-2">
|
||||||
|
{relatedTools.map((tool) => (
|
||||||
|
<Link
|
||||||
|
key={tool!.slug}
|
||||||
|
to={`/tools/${tool!.slug}`}
|
||||||
|
className="group rounded-xl border border-slate-200 bg-white p-4 transition-all hover:border-primary-300 hover:shadow-md dark:border-slate-700 dark:bg-slate-800 dark:hover:border-primary-600"
|
||||||
|
>
|
||||||
|
<div className="flex items-center justify-between">
|
||||||
|
<h3 className="font-semibold text-slate-800 group-hover:text-primary-600 dark:text-slate-200 dark:group-hover:text-primary-400">
|
||||||
|
{tool!.titleSuffix.replace(/^Free Online\s*/, '').replace(/\s*—.*$/, '')}
|
||||||
|
</h3>
|
||||||
|
<span
|
||||||
|
className={`rounded-full px-2 py-0.5 text-xs font-medium ${CATEGORY_COLORS[tool!.category] || ''}`}
|
||||||
|
>
|
||||||
|
{tool!.category}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<p className="mt-1 text-sm text-slate-500 dark:text-slate-400 line-clamp-2">
|
||||||
|
{tool!.metaDescription}
|
||||||
|
</p>
|
||||||
|
</Link>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
}
|
||||||
107
frontend/src/components/seo/ToolLandingPage.tsx
Normal file
107
frontend/src/components/seo/ToolLandingPage.tsx
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
import { Helmet } from 'react-helmet-async';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
|
import { CheckCircle } from 'lucide-react';
|
||||||
|
import { getToolSEO } from '@/config/seoData';
|
||||||
|
import { generateToolSchema, generateBreadcrumbs, generateFAQ } from '@/utils/seo';
|
||||||
|
import FAQSection from './FAQSection';
|
||||||
|
import RelatedTools from './RelatedTools';
|
||||||
|
|
||||||
|
interface ToolLandingPageProps {
|
||||||
|
/** The tool slug matching seoData.ts entries */
|
||||||
|
slug: string;
|
||||||
|
/** The actual tool component rendered inside the landing page */
|
||||||
|
children: React.ReactNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SEO wrapper that adds structured data, FAQ section, related tools,
|
||||||
|
* feature bullets, and proper meta tags around any tool component.
|
||||||
|
*/
|
||||||
|
export default function ToolLandingPage({ slug, children }: ToolLandingPageProps) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const seo = getToolSEO(slug);
|
||||||
|
|
||||||
|
// Fallback: just render tool without SEO wrapper
|
||||||
|
if (!seo) return <>{children}</>;
|
||||||
|
|
||||||
|
const toolTitle = t(`tools.${seo.i18nKey}.title`);
|
||||||
|
const toolDesc = t(`tools.${seo.i18nKey}.description`);
|
||||||
|
const origin = typeof window !== 'undefined' ? window.location.origin : '';
|
||||||
|
const canonicalUrl = `${origin}/tools/${slug}`;
|
||||||
|
|
||||||
|
const toolSchema = generateToolSchema({
|
||||||
|
name: toolTitle,
|
||||||
|
description: seo.metaDescription,
|
||||||
|
url: canonicalUrl,
|
||||||
|
category: seo.category === 'PDF' ? 'UtilitiesApplication' : 'WebApplication',
|
||||||
|
});
|
||||||
|
|
||||||
|
const breadcrumbSchema = generateBreadcrumbs([
|
||||||
|
{ name: t('common.appName'), url: origin },
|
||||||
|
{ name: seo.category, url: `${origin}/#${seo.category.toLowerCase()}` },
|
||||||
|
{ name: toolTitle, url: canonicalUrl },
|
||||||
|
]);
|
||||||
|
|
||||||
|
const faqSchema = seo.faqs.length > 0 ? generateFAQ(seo.faqs) : null;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Helmet>
|
||||||
|
<title>{toolTitle} — {seo.titleSuffix} | {t('common.appName')}</title>
|
||||||
|
<meta name="description" content={seo.metaDescription} />
|
||||||
|
<meta name="keywords" content={seo.keywords} />
|
||||||
|
<link rel="canonical" href={canonicalUrl} />
|
||||||
|
|
||||||
|
{/* Open Graph */}
|
||||||
|
<meta property="og:title" content={`${toolTitle} — ${seo.titleSuffix}`} />
|
||||||
|
<meta property="og:description" content={seo.metaDescription} />
|
||||||
|
<meta property="og:url" content={canonicalUrl} />
|
||||||
|
<meta property="og:type" content="website" />
|
||||||
|
|
||||||
|
{/* Twitter */}
|
||||||
|
<meta name="twitter:card" content="summary" />
|
||||||
|
<meta name="twitter:title" content={`${toolTitle} — ${seo.titleSuffix}`} />
|
||||||
|
<meta name="twitter:description" content={seo.metaDescription} />
|
||||||
|
|
||||||
|
{/* Structured Data */}
|
||||||
|
<script type="application/ld+json">{JSON.stringify(toolSchema)}</script>
|
||||||
|
<script type="application/ld+json">{JSON.stringify(breadcrumbSchema)}</script>
|
||||||
|
{faqSchema && (
|
||||||
|
<script type="application/ld+json">{JSON.stringify(faqSchema)}</script>
|
||||||
|
)}
|
||||||
|
</Helmet>
|
||||||
|
|
||||||
|
{/* Tool Interface */}
|
||||||
|
{children}
|
||||||
|
|
||||||
|
{/* SEO Content Below Tool */}
|
||||||
|
<div className="mx-auto mt-16 max-w-3xl">
|
||||||
|
{/* Feature bullets */}
|
||||||
|
{seo.features.length > 0 && (
|
||||||
|
<section className="mb-12">
|
||||||
|
<h2 className="mb-4 text-xl font-bold text-slate-900 dark:text-white">
|
||||||
|
Why Use Our {toolTitle}?
|
||||||
|
</h2>
|
||||||
|
<p className="mb-6 text-slate-600 dark:text-slate-400">
|
||||||
|
{toolDesc}
|
||||||
|
</p>
|
||||||
|
<ul className="space-y-3">
|
||||||
|
{seo.features.map((feature, idx) => (
|
||||||
|
<li key={idx} className="flex items-start gap-3">
|
||||||
|
<CheckCircle className="mt-0.5 h-5 w-5 shrink-0 text-green-500" />
|
||||||
|
<span className="text-slate-700 dark:text-slate-300">{feature}</span>
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{/* FAQ Section */}
|
||||||
|
<FAQSection faqs={seo.faqs} />
|
||||||
|
|
||||||
|
{/* Related Tools */}
|
||||||
|
<RelatedTools currentSlug={slug} />
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
677
frontend/src/config/seoData.ts
Normal file
677
frontend/src/config/seoData.ts
Normal file
@@ -0,0 +1,677 @@
|
|||||||
|
/**
|
||||||
|
* Central SEO configuration for all tools.
|
||||||
|
* Single source of truth for meta, FAQ schema, related tools, and landing page content.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export interface ToolFAQ {
|
||||||
|
question: string;
|
||||||
|
answer: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ToolSEO {
|
||||||
|
/** i18n key (matches tools.xxx in en.json) */
|
||||||
|
i18nKey: string;
|
||||||
|
/** URL slug under /tools/ */
|
||||||
|
slug: string;
|
||||||
|
/** SEO-optimized page title suffix (after tool name) */
|
||||||
|
titleSuffix: string;
|
||||||
|
/** Full meta description for search engines */
|
||||||
|
metaDescription: string;
|
||||||
|
/** Category for structured data */
|
||||||
|
category: 'PDF' | 'Image' | 'AI' | 'Convert' | 'Utility';
|
||||||
|
/** Slugs of related tools for internal linking */
|
||||||
|
relatedSlugs: string[];
|
||||||
|
/** FAQ items for FAQPage schema */
|
||||||
|
faqs: ToolFAQ[];
|
||||||
|
/** Short feature bullets for the landing page */
|
||||||
|
features: string[];
|
||||||
|
/** Keywords for meta tag */
|
||||||
|
keywords: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const TOOLS_SEO: ToolSEO[] = [
|
||||||
|
// ─── PDF TOOLS ──────────────────────────────────────────────
|
||||||
|
{
|
||||||
|
i18nKey: 'pdfToWord',
|
||||||
|
slug: 'pdf-to-word',
|
||||||
|
titleSuffix: 'Free Online PDF to Word Converter',
|
||||||
|
metaDescription: 'Convert PDF to Word documents online for free. No signup required. Preserve formatting and layout with our fast PDF to DOCX converter.',
|
||||||
|
category: 'PDF',
|
||||||
|
relatedSlugs: ['word-to-pdf', 'pdf-to-excel', 'compress-pdf', 'merge-pdf'],
|
||||||
|
keywords: 'pdf to word, pdf to docx, convert pdf to word, pdf converter, free pdf to word',
|
||||||
|
features: [
|
||||||
|
'Convert PDF to editable Word documents instantly',
|
||||||
|
'Preserve original formatting and layout',
|
||||||
|
'No signup or installation required',
|
||||||
|
'Process files securely — auto-deleted after 30 minutes',
|
||||||
|
'Supports large PDF files up to 20MB',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'How do I convert a PDF to Word?', answer: 'Simply upload your PDF file to our converter, and it will automatically convert it to an editable Word document (DOCX format). Click download when the conversion is complete.' },
|
||||||
|
{ question: 'Is this PDF to Word converter free?', answer: 'Yes, our PDF to Word converter is completely free to use with no hidden costs or signup required.' },
|
||||||
|
{ question: 'Will my PDF formatting be preserved?', answer: 'Our converter preserves the original formatting, fonts, and layout of your PDF as closely as possible in the Word output.' },
|
||||||
|
{ question: 'Is my file secure?', answer: 'Yes. All uploaded files are automatically deleted from our servers within 30 minutes. We never share or store your documents.' },
|
||||||
|
{ question: 'What is the maximum file size?', answer: 'You can upload PDF files up to 20MB for conversion.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
i18nKey: 'wordToPdf',
|
||||||
|
slug: 'word-to-pdf',
|
||||||
|
titleSuffix: 'Free Online Word to PDF Converter',
|
||||||
|
metaDescription: 'Convert Word documents to PDF online for free. DOC and DOCX to PDF with perfect formatting. No signup required.',
|
||||||
|
category: 'Convert',
|
||||||
|
relatedSlugs: ['pdf-to-word', 'html-to-pdf', 'compress-pdf', 'merge-pdf'],
|
||||||
|
keywords: 'word to pdf, docx to pdf, doc to pdf, convert word to pdf, free word to pdf converter',
|
||||||
|
features: [
|
||||||
|
'Convert DOC and DOCX files to PDF instantly',
|
||||||
|
'Perfect formatting preservation',
|
||||||
|
'Free with no registration needed',
|
||||||
|
'Secure processing — files auto-deleted',
|
||||||
|
'Works on any device with a browser',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'How do I convert Word to PDF?', answer: 'Upload your Word file (.doc or .docx), and our converter will instantly create a high-quality PDF while preserving all formatting.' },
|
||||||
|
{ question: 'Is the Word to PDF converter free?', answer: 'Yes, it is completely free with no limits on the number of conversions.' },
|
||||||
|
{ question: 'Can I convert DOC files, not just DOCX?', answer: 'Yes, both older DOC format and modern DOCX format are fully supported.' },
|
||||||
|
{ question: 'Will images in my Word document be included?', answer: 'Yes, all images, tables, and graphical elements in your Word document will be faithfully reproduced in the PDF.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
i18nKey: 'compressPdf',
|
||||||
|
slug: 'compress-pdf',
|
||||||
|
titleSuffix: 'Free Online PDF Compressor — Reduce File Size',
|
||||||
|
metaDescription: 'Compress PDF files online for free. Reduce PDF size by up to 90% while maintaining quality. Fast and secure PDF compression.',
|
||||||
|
category: 'PDF',
|
||||||
|
relatedSlugs: ['merge-pdf', 'split-pdf', 'pdf-to-word', 'compress-image'],
|
||||||
|
keywords: 'compress pdf, reduce pdf size, pdf compressor, shrink pdf, make pdf smaller',
|
||||||
|
features: [
|
||||||
|
'Reduce PDF file size by up to 90%',
|
||||||
|
'Choose your compression level (low, medium, high)',
|
||||||
|
'Maintain text quality and readability',
|
||||||
|
'Free with no file count limits',
|
||||||
|
'Process files securely on our servers',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'How does PDF compression work?', answer: 'Our tool optimizes images, removes unnecessary metadata, and compresses internal structures to reduce file size while maintaining visual quality.' },
|
||||||
|
{ question: 'Will compression affect text quality?', answer: 'No. Text remains crisp and searchable. Mainly images within the PDF are optimized to reduce file size.' },
|
||||||
|
{ question: 'How much can I reduce my PDF size?', answer: 'Depending on the content, you can typically reduce file size by 50-90%, especially for PDFs with many images.' },
|
||||||
|
{ question: 'Is there a file size limit?', answer: 'You can compress PDFs up to 20MB in size.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
i18nKey: 'mergePdf',
|
||||||
|
slug: 'merge-pdf',
|
||||||
|
titleSuffix: 'Free Online PDF Merger — Combine PDF Files',
|
||||||
|
metaDescription: 'Merge multiple PDF files into one document online for free. Combine PDFs quickly and securely with no signup required.',
|
||||||
|
category: 'PDF',
|
||||||
|
relatedSlugs: ['split-pdf', 'compress-pdf', 'reorder-pdf', 'page-numbers'],
|
||||||
|
keywords: 'merge pdf, combine pdf, join pdf, pdf merger, merge pdf files online free',
|
||||||
|
features: [
|
||||||
|
'Combine multiple PDF files into a single document',
|
||||||
|
'Drag and drop to reorder files before merging',
|
||||||
|
'No limit on the number of files',
|
||||||
|
'Maintains original formatting and quality',
|
||||||
|
'Fast processing with secure file handling',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'How do I merge PDF files?', answer: 'Upload two or more PDF files, arrange them in the desired order, and click merge. Your combined PDF will be ready to download instantly.' },
|
||||||
|
{ question: 'Is there a limit on how many PDFs I can merge?', answer: 'No, you can merge as many PDF files as you need in a single operation.' },
|
||||||
|
{ question: 'Will the merged PDF maintain quality?', answer: 'Yes, merging is a lossless operation — all pages retain their original quality and formatting.' },
|
||||||
|
{ question: 'Can I rearrange pages before merging?', answer: 'Yes, you can drag and drop to reorder the files before combining them.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
i18nKey: 'splitPdf',
|
||||||
|
slug: 'split-pdf',
|
||||||
|
titleSuffix: 'Free Online PDF Splitter — Extract Pages',
|
||||||
|
metaDescription: 'Split PDF files into individual pages or extract specific page ranges online for free. Fast, secure, and no signup needed.',
|
||||||
|
category: 'PDF',
|
||||||
|
relatedSlugs: ['merge-pdf', 'extract-pages', 'rotate-pdf', 'reorder-pdf'],
|
||||||
|
keywords: 'split pdf, pdf splitter, extract pages from pdf, separate pdf pages, divide pdf',
|
||||||
|
features: [
|
||||||
|
'Split a PDF into individual pages',
|
||||||
|
'Extract specific page ranges',
|
||||||
|
'Fast and completely free',
|
||||||
|
'No software installation required',
|
||||||
|
'Secure — files deleted after processing',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'How do I split a PDF?', answer: 'Upload your PDF, specify the pages or ranges you want to extract, and click split. Download the resulting PDF instantly.' },
|
||||||
|
{ question: 'Can I extract specific pages?', answer: 'Yes, you can specify individual pages (e.g., 1, 3, 5) or ranges (e.g., 1-5) to extract.' },
|
||||||
|
{ question: 'Is splitting a PDF free?', answer: 'Yes, our PDF splitter is completely free with no limitations.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
i18nKey: 'rotatePdf',
|
||||||
|
slug: 'rotate-pdf',
|
||||||
|
titleSuffix: 'Free Online PDF Rotator',
|
||||||
|
metaDescription: 'Rotate PDF pages by 90°, 180° or 270° online for free. Fix page orientation quickly with no software needed.',
|
||||||
|
category: 'PDF',
|
||||||
|
relatedSlugs: ['merge-pdf', 'split-pdf', 'reorder-pdf', 'compress-pdf'],
|
||||||
|
keywords: 'rotate pdf, rotate pdf pages, pdf rotator, turn pdf pages, flip pdf',
|
||||||
|
features: [
|
||||||
|
'Rotate all pages by 90°, 180°, or 270°',
|
||||||
|
'Fix scanned documents with wrong orientation',
|
||||||
|
'Instant processing',
|
||||||
|
'Free and no signup needed',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'How do I rotate a PDF?', answer: 'Upload your PDF, choose the rotation angle (90°, 180°, or 270°), and download the rotated file.' },
|
||||||
|
{ question: 'Can I rotate specific pages?', answer: 'Currently, the tool rotates all pages by the same angle. For selective rotation, split the PDF first.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
i18nKey: 'pdfToImages',
|
||||||
|
slug: 'pdf-to-images',
|
||||||
|
titleSuffix: 'Free Online PDF to Image Converter',
|
||||||
|
metaDescription: 'Convert PDF pages to high-quality images (PNG or JPG) online for free. Extract each page as a separate image file.',
|
||||||
|
category: 'PDF',
|
||||||
|
relatedSlugs: ['images-to-pdf', 'pdf-to-word', 'compress-image', 'image-converter'],
|
||||||
|
keywords: 'pdf to image, pdf to png, pdf to jpg, convert pdf to image, extract images from pdf',
|
||||||
|
features: [
|
||||||
|
'Convert each PDF page to a high-quality image',
|
||||||
|
'Choose PNG or JPG output format',
|
||||||
|
'Process multi-page PDFs automatically',
|
||||||
|
'Free with no registration',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'How do I convert a PDF to images?', answer: 'Upload your PDF and each page will be converted to a high-quality image. Download the images individually or as a ZIP file.' },
|
||||||
|
{ question: 'What image formats are supported?', answer: 'You can convert PDF pages to PNG or JPG format.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
i18nKey: 'imagesToPdf',
|
||||||
|
slug: 'images-to-pdf',
|
||||||
|
titleSuffix: 'Free Online Images to PDF Converter',
|
||||||
|
metaDescription: 'Combine multiple images into a single PDF document online for free. Supports JPG, PNG, and WebP formats.',
|
||||||
|
category: 'PDF',
|
||||||
|
relatedSlugs: ['pdf-to-images', 'merge-pdf', 'compress-image', 'image-resize'],
|
||||||
|
keywords: 'images to pdf, jpg to pdf, png to pdf, combine images to pdf, photo to pdf',
|
||||||
|
features: [
|
||||||
|
'Combine multiple images into one PDF',
|
||||||
|
'Supports JPG, PNG, and WebP formats',
|
||||||
|
'Arrange image order before converting',
|
||||||
|
'Free and no account required',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'How do I convert images to PDF?', answer: 'Upload your images (JPG, PNG, or WebP), arrange them in the desired order, and click convert. Your combined PDF will be ready to download.' },
|
||||||
|
{ question: 'How many images can I combine?', answer: 'You can combine as many images as needed into a single PDF document.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
i18nKey: 'watermarkPdf',
|
||||||
|
slug: 'watermark-pdf',
|
||||||
|
titleSuffix: 'Free Online PDF Watermark Tool',
|
||||||
|
metaDescription: 'Add custom text watermarks to your PDF documents online for free. Protect your documents with branded watermarks.',
|
||||||
|
category: 'PDF',
|
||||||
|
relatedSlugs: ['remove-watermark-pdf', 'protect-pdf', 'compress-pdf', 'merge-pdf'],
|
||||||
|
keywords: 'watermark pdf, add watermark to pdf, pdf watermark, stamp pdf, brand pdf',
|
||||||
|
features: [
|
||||||
|
'Add custom text watermarks to every page',
|
||||||
|
'Customize font size, color, and opacity',
|
||||||
|
'Prevent unauthorized use of your documents',
|
||||||
|
'Free with no installation needed',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'How do I add a watermark to a PDF?', answer: 'Upload your PDF, enter your watermark text, customize the appearance, and download the watermarked file.' },
|
||||||
|
{ question: 'Can I customize the watermark appearance?', answer: 'Yes, you can adjust the text, size, color, opacity, and rotation angle of the watermark.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
i18nKey: 'removeWatermark',
|
||||||
|
slug: 'remove-watermark-pdf',
|
||||||
|
titleSuffix: 'Free Online PDF Watermark Remover',
|
||||||
|
metaDescription: 'Remove text watermarks from PDF files online for free. Clean up your PDFs by removing unwanted watermark text.',
|
||||||
|
category: 'PDF',
|
||||||
|
relatedSlugs: ['watermark-pdf', 'compress-pdf', 'pdf-to-word', 'pdf-editor'],
|
||||||
|
keywords: 'remove watermark pdf, delete watermark, pdf watermark remover, clean pdf',
|
||||||
|
features: [
|
||||||
|
'Remove text watermarks from PDF pages',
|
||||||
|
'Automatic watermark detection',
|
||||||
|
'Preserves document content and layout',
|
||||||
|
'Free and secure',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'Can this tool remove any watermark?', answer: 'Our tool works best with text-based watermarks. Image-based or embedded watermarks may require additional processing.' },
|
||||||
|
{ question: 'Will removing the watermark affect document quality?', answer: 'No, only the watermark text is removed. All other content remains intact.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
i18nKey: 'protectPdf',
|
||||||
|
slug: 'protect-pdf',
|
||||||
|
titleSuffix: 'Free Online PDF Password Protector',
|
||||||
|
metaDescription: 'Add password protection to your PDF files online for free. Secure your documents with encryption to prevent unauthorized access.',
|
||||||
|
category: 'PDF',
|
||||||
|
relatedSlugs: ['unlock-pdf', 'watermark-pdf', 'compress-pdf', 'merge-pdf'],
|
||||||
|
keywords: 'protect pdf, password protect pdf, encrypt pdf, secure pdf, lock pdf',
|
||||||
|
features: [
|
||||||
|
'Add password protection to any PDF',
|
||||||
|
'Prevent unauthorized access',
|
||||||
|
'Strong encryption for sensitive documents',
|
||||||
|
'Free and no signup required',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'How do I password-protect a PDF?', answer: 'Upload your PDF, set a password, and download the encrypted file. Only people with the password can open it.' },
|
||||||
|
{ question: 'How secure is the encryption?', answer: 'We use industry-standard PDF encryption to protect your documents.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
i18nKey: 'unlockPdf',
|
||||||
|
slug: 'unlock-pdf',
|
||||||
|
titleSuffix: 'Free Online PDF Unlocker',
|
||||||
|
metaDescription: 'Remove password protection from PDF files online for free. Unlock your PDFs to edit, print, or copy content.',
|
||||||
|
category: 'PDF',
|
||||||
|
relatedSlugs: ['protect-pdf', 'compress-pdf', 'pdf-to-word', 'merge-pdf'],
|
||||||
|
keywords: 'unlock pdf, remove pdf password, pdf unlocker, decrypt pdf, open locked pdf',
|
||||||
|
features: [
|
||||||
|
'Remove password protection from PDFs',
|
||||||
|
'Unlock PDFs for editing, printing, and copying',
|
||||||
|
'Fast and free',
|
||||||
|
'Secure processing',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'How do I unlock a PDF?', answer: 'Upload your protected PDF, enter the current password, and download the unlocked version.' },
|
||||||
|
{ question: 'Can I unlock a PDF without the password?', answer: 'No, you need to know the current password to unlock it. This is by design for security.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
i18nKey: 'pageNumbers',
|
||||||
|
slug: 'page-numbers',
|
||||||
|
titleSuffix: 'Free Online PDF Page Number Tool',
|
||||||
|
metaDescription: 'Add page numbers to your PDF documents online for free. Choose position, starting number, and format.',
|
||||||
|
category: 'PDF',
|
||||||
|
relatedSlugs: ['merge-pdf', 'reorder-pdf', 'watermark-pdf', 'compress-pdf'],
|
||||||
|
keywords: 'add page numbers to pdf, pdf page numbers, number pdf pages, pdf page numbering',
|
||||||
|
features: [
|
||||||
|
'Add page numbers to every page',
|
||||||
|
'Choose header or footer position',
|
||||||
|
'Set custom starting number',
|
||||||
|
'Free and no installation needed',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'How do I add page numbers to a PDF?', answer: 'Upload your PDF, choose the position (top or bottom, left/center/right), set the starting number, and download.' },
|
||||||
|
{ question: 'Can I start numbering from a specific page?', answer: 'Yes, you can set the starting page number to any value.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
i18nKey: 'reorderPdf',
|
||||||
|
slug: 'reorder-pdf',
|
||||||
|
titleSuffix: 'Free Online PDF Page Reorder Tool',
|
||||||
|
metaDescription: 'Rearrange pages in your PDF document online for free. Drag and drop to reorder pages in any sequence.',
|
||||||
|
category: 'PDF',
|
||||||
|
relatedSlugs: ['merge-pdf', 'split-pdf', 'extract-pages', 'rotate-pdf'],
|
||||||
|
keywords: 'reorder pdf pages, rearrange pdf, sort pdf pages, move pdf pages, organize pdf',
|
||||||
|
features: [
|
||||||
|
'Drag-and-drop page reordering',
|
||||||
|
'Visual page thumbnails for easy arrangement',
|
||||||
|
'Free with no registration',
|
||||||
|
'Process any PDF document',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'How do I reorder PDF pages?', answer: 'Upload your PDF, then drag and drop page thumbnails to arrange them in your desired order. Click save to download the reordered PDF.' },
|
||||||
|
{ question: 'Can I delete pages while reordering?', answer: 'For deleting pages, use our Extract Pages tool which lets you select specific pages to keep.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
i18nKey: 'extractPages',
|
||||||
|
slug: 'extract-pages',
|
||||||
|
titleSuffix: 'Free Online PDF Page Extractor',
|
||||||
|
metaDescription: 'Extract specific pages from a PDF into a new document online for free. Select the exact pages you need.',
|
||||||
|
category: 'PDF',
|
||||||
|
relatedSlugs: ['split-pdf', 'merge-pdf', 'reorder-pdf', 'compress-pdf'],
|
||||||
|
keywords: 'extract pdf pages, pdf page extractor, select pages from pdf, copy pdf pages',
|
||||||
|
features: [
|
||||||
|
'Extract specific pages from any PDF',
|
||||||
|
'Select individual pages or ranges',
|
||||||
|
'Create a new PDF with only the pages you need',
|
||||||
|
'Free and completely secure',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'How do I extract pages from a PDF?', answer: 'Upload your PDF, select the pages you want (e.g., 1, 3, 5-10), and download the new PDF containing only those pages.' },
|
||||||
|
{ question: 'What is the difference between Split and Extract?', answer: 'Split divides a PDF at a specific point, while Extract lets you pick any combination of pages.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
i18nKey: 'pdfEditor',
|
||||||
|
slug: 'pdf-editor',
|
||||||
|
titleSuffix: 'Free Online PDF Editor & Optimizer',
|
||||||
|
metaDescription: 'Edit and optimize PDF documents online for free. Add text annotations and create optimized copies of your PDFs.',
|
||||||
|
category: 'PDF',
|
||||||
|
relatedSlugs: ['compress-pdf', 'pdf-to-word', 'watermark-pdf', 'merge-pdf'],
|
||||||
|
keywords: 'pdf editor, edit pdf online, pdf optimizer, modify pdf, annotate pdf',
|
||||||
|
features: [
|
||||||
|
'Add text annotations to PDF pages',
|
||||||
|
'Optimize PDF file structure',
|
||||||
|
'Free online PDF editing',
|
||||||
|
'No software download required',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'Can I edit text in a PDF?', answer: 'You can add text annotations and overlays to your PDF. For full text editing, convert to Word first using our PDF to Word tool.' },
|
||||||
|
{ question: 'Is the PDF editor free?', answer: 'Yes, our online PDF editor is completely free to use.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
i18nKey: 'pdfFlowchart',
|
||||||
|
slug: 'pdf-flowchart',
|
||||||
|
titleSuffix: 'Free Online PDF to Flowchart Converter',
|
||||||
|
metaDescription: 'Convert PDF procedures into interactive flowcharts automatically using AI. Visualize processes and workflows from PDF documents.',
|
||||||
|
category: 'AI',
|
||||||
|
relatedSlugs: ['summarize-pdf', 'chat-pdf', 'pdf-to-word', 'extract-tables'],
|
||||||
|
keywords: 'pdf to flowchart, process flowchart, workflow diagram, visualize pdf, ai flowchart',
|
||||||
|
features: [
|
||||||
|
'AI-powered procedure extraction',
|
||||||
|
'Interactive flowchart visualization',
|
||||||
|
'Export flowcharts as images',
|
||||||
|
'Edit and customize generated flowcharts',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'How does PDF to Flowchart work?', answer: 'Upload a PDF with procedures or workflows, and our AI analyzes the content to generate an interactive flowchart with decision points and process steps.' },
|
||||||
|
{ question: 'What types of PDFs work best?', answer: 'PDFs containing step-by-step procedures, SOPs, workflows, and process documentation produce the best results.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
|
||||||
|
// ─── IMAGE TOOLS ────────────────────────────────────────────
|
||||||
|
{
|
||||||
|
i18nKey: 'imageConvert',
|
||||||
|
slug: 'image-converter',
|
||||||
|
titleSuffix: 'Free Online Image Format Converter',
|
||||||
|
metaDescription: 'Convert images between JPG, PNG, and WebP formats instantly online for free. Fast, secure image conversion with no quality loss.',
|
||||||
|
category: 'Image',
|
||||||
|
relatedSlugs: ['compress-image', 'image-resize', 'remove-background', 'images-to-pdf'],
|
||||||
|
keywords: 'image converter, jpg to png, png to jpg, webp to jpg, convert image format',
|
||||||
|
features: [
|
||||||
|
'Convert between JPG, PNG, and WebP',
|
||||||
|
'No quality loss during conversion',
|
||||||
|
'Instant processing',
|
||||||
|
'Batch conversion support',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'What image formats are supported?', answer: 'You can convert between JPG, PNG, and WebP formats.' },
|
||||||
|
{ question: 'Does conversion reduce image quality?', answer: 'No, our converter maintains the original image quality during format conversion.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
i18nKey: 'imageResize',
|
||||||
|
slug: 'image-resize',
|
||||||
|
titleSuffix: 'Free Online Image Resizer',
|
||||||
|
metaDescription: 'Resize images to exact dimensions online for free. Maintain aspect ratio or set custom width and height. Supports JPG, PNG, WebP.',
|
||||||
|
category: 'Image',
|
||||||
|
relatedSlugs: ['compress-image', 'image-converter', 'remove-background', 'images-to-pdf'],
|
||||||
|
keywords: 'resize image, image resizer, change image size, scale image, reduce image dimensions',
|
||||||
|
features: [
|
||||||
|
'Resize to exact pixel dimensions',
|
||||||
|
'Maintain or override aspect ratio',
|
||||||
|
'Choose output format (JPG, PNG, WebP)',
|
||||||
|
'Free with no file limits',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'How do I resize an image?', answer: 'Upload your image, enter the desired width and height (or use percentage), and download the resized image.' },
|
||||||
|
{ question: 'Can I maintain the aspect ratio?', answer: 'Yes, you can lock the aspect ratio so the image resizes proportionally.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
i18nKey: 'compressImage',
|
||||||
|
slug: 'compress-image',
|
||||||
|
titleSuffix: 'Free Online Image Compressor',
|
||||||
|
metaDescription: 'Compress images online for free. Reduce image file size while maintaining quality. Supports PNG, JPG, and WebP formats.',
|
||||||
|
category: 'Image',
|
||||||
|
relatedSlugs: ['compress-pdf', 'image-resize', 'image-converter', 'remove-background'],
|
||||||
|
keywords: 'compress image, reduce image size, image compressor, optimize image, shrink image',
|
||||||
|
features: [
|
||||||
|
'Reduce image file size significantly',
|
||||||
|
'Maintain visual quality',
|
||||||
|
'Supports PNG, JPG, and WebP',
|
||||||
|
'Choose compression level',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'How does image compression work?', answer: 'Our tool reduces the file size of your image by optimizing encoding and removing unnecessary metadata while preserving visual quality.' },
|
||||||
|
{ question: 'Which format compresses best?', answer: 'WebP typically achieves the best compression ratios, followed by JPG for photos and PNG for graphics with transparency.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
i18nKey: 'removeBg',
|
||||||
|
slug: 'remove-background',
|
||||||
|
titleSuffix: 'Free Online AI Background Remover',
|
||||||
|
metaDescription: 'Remove image backgrounds automatically using AI. Get transparent PNG images in seconds. Free online background removal tool.',
|
||||||
|
category: 'Image',
|
||||||
|
relatedSlugs: ['compress-image', 'image-resize', 'image-converter', 'images-to-pdf'],
|
||||||
|
keywords: 'remove background, background remover, transparent background, remove bg, ai background removal',
|
||||||
|
features: [
|
||||||
|
'AI-powered automatic background removal',
|
||||||
|
'Get transparent PNG output',
|
||||||
|
'Works with photos, products, portraits',
|
||||||
|
'Free and instant processing',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'How does background removal work?', answer: 'Our AI model automatically detects the subject in your image and removes the background, producing a transparent PNG file.' },
|
||||||
|
{ question: 'What types of images work best?', answer: 'The tool works best with clear subjects — product photos, portraits, and objects with distinct edges.' },
|
||||||
|
{ question: 'What format is the output?', answer: 'The output is always a PNG file with a transparent background.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
i18nKey: 'ocr',
|
||||||
|
slug: 'ocr',
|
||||||
|
titleSuffix: 'Free Online OCR — Text Recognition Tool',
|
||||||
|
metaDescription: 'Extract text from images and scanned PDFs using OCR (Optical Character Recognition). Supports English, Arabic, and French. Free online.',
|
||||||
|
category: 'AI',
|
||||||
|
relatedSlugs: ['pdf-to-word', 'summarize-pdf', 'translate-pdf', 'pdf-to-excel'],
|
||||||
|
keywords: 'ocr, optical character recognition, extract text from image, scan to text, image to text',
|
||||||
|
features: [
|
||||||
|
'Extract text from images and scanned PDFs',
|
||||||
|
'Supports English, Arabic, and French',
|
||||||
|
'High accuracy with Tesseract OCR engine',
|
||||||
|
'Free with no signup needed',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'What is OCR?', answer: 'OCR (Optical Character Recognition) is a technology that converts images of text into editable, searchable text data.' },
|
||||||
|
{ question: 'What languages are supported?', answer: 'We currently support English, Arabic, and French for text recognition.' },
|
||||||
|
{ question: 'Can I OCR a scanned PDF?', answer: 'Yes, you can upload scanned PDF documents and extract text from all pages.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
|
||||||
|
// ─── CONVERT TOOLS ──────────────────────────────────────────
|
||||||
|
{
|
||||||
|
i18nKey: 'pdfToExcel',
|
||||||
|
slug: 'pdf-to-excel',
|
||||||
|
titleSuffix: 'Free Online PDF to Excel Converter',
|
||||||
|
metaDescription: 'Convert PDF tables to Excel spreadsheets online for free. Extract tabular data from PDF files into editable XLSX format.',
|
||||||
|
category: 'Convert',
|
||||||
|
relatedSlugs: ['pdf-to-word', 'extract-tables', 'pdf-to-images', 'compress-pdf'],
|
||||||
|
keywords: 'pdf to excel, pdf to xlsx, convert pdf to excel, extract tables from pdf, pdf spreadsheet',
|
||||||
|
features: [
|
||||||
|
'Extract tables from PDF to Excel',
|
||||||
|
'Preserve table structure and data',
|
||||||
|
'Download as XLSX format',
|
||||||
|
'Free and secure',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'How do I convert a PDF to Excel?', answer: 'Upload your PDF containing tables. Our tool detects and extracts the tabular data, converting it into an editable Excel spreadsheet.' },
|
||||||
|
{ question: 'Does it work with scanned PDFs?', answer: 'The tool works best with digitally-created PDFs. For scanned documents, use our OCR tool first to extract text.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
i18nKey: 'htmlToPdf',
|
||||||
|
slug: 'html-to-pdf',
|
||||||
|
titleSuffix: 'Free Online HTML to PDF Converter',
|
||||||
|
metaDescription: 'Convert HTML files to PDF documents online for free. Full CSS styling support, perfect for web page archival and printing.',
|
||||||
|
category: 'Convert',
|
||||||
|
relatedSlugs: ['pdf-to-word', 'word-to-pdf', 'compress-pdf', 'watermark-pdf'],
|
||||||
|
keywords: 'html to pdf, convert html to pdf, webpage to pdf, html pdf converter, save html as pdf',
|
||||||
|
features: [
|
||||||
|
'Convert HTML to PDF with full CSS support',
|
||||||
|
'Preserve page layout and styles',
|
||||||
|
'Perfect for web page archival',
|
||||||
|
'Free and instant',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'How do I convert HTML to PDF?', answer: 'Upload your HTML file and our converter will render it with full CSS support and produce a professional PDF document.' },
|
||||||
|
{ question: 'Are CSS styles preserved?', answer: 'Yes, our converter supports CSS styling including fonts, colors, layouts, and media queries.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
|
||||||
|
// ─── AI TOOLS ───────────────────────────────────────────────
|
||||||
|
{
|
||||||
|
i18nKey: 'chatPdf',
|
||||||
|
slug: 'chat-pdf',
|
||||||
|
titleSuffix: 'Chat with PDF — AI Document Assistant',
|
||||||
|
metaDescription: 'Ask questions about your PDF documents and get instant AI-powered answers. Free online PDF chat assistant.',
|
||||||
|
category: 'AI',
|
||||||
|
relatedSlugs: ['summarize-pdf', 'translate-pdf', 'extract-tables', 'pdf-to-word'],
|
||||||
|
keywords: 'chat with pdf, ai pdf reader, ask pdf questions, pdf chat, ai document reader',
|
||||||
|
features: [
|
||||||
|
'Ask questions about any PDF document',
|
||||||
|
'Get accurate AI-powered answers',
|
||||||
|
'Understands context and meaning',
|
||||||
|
'Free and private',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'How does Chat with PDF work?', answer: 'Upload your PDF and type a question. Our AI reads the document content and provides accurate answers based on what is in the document.' },
|
||||||
|
{ question: 'Can it answer questions in other languages?', answer: 'Yes, the AI responds in the same language you use for your question.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
i18nKey: 'summarizePdf',
|
||||||
|
slug: 'summarize-pdf',
|
||||||
|
titleSuffix: 'Free Online AI PDF Summarizer',
|
||||||
|
metaDescription: 'Get instant AI-generated summaries of your PDF documents. Choose short, medium, or detailed summaries. Free online tool.',
|
||||||
|
category: 'AI',
|
||||||
|
relatedSlugs: ['chat-pdf', 'translate-pdf', 'extract-tables', 'pdf-to-word'],
|
||||||
|
keywords: 'summarize pdf, pdf summary, ai pdf summarizer, document summary, tldr pdf',
|
||||||
|
features: [
|
||||||
|
'AI-generated document summaries',
|
||||||
|
'Choose summary length (short, medium, long)',
|
||||||
|
'Covers key points and conclusions',
|
||||||
|
'Free and instant',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'How does PDF summarization work?', answer: 'Upload your PDF and choose a summary length. Our AI analyzes the full document and generates a concise summary covering the main points.' },
|
||||||
|
{ question: 'What summary lengths are available?', answer: 'You can choose short (2-3 sentences), medium (1-2 paragraphs), or long (detailed coverage of all key points).' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
i18nKey: 'translatePdf',
|
||||||
|
slug: 'translate-pdf',
|
||||||
|
titleSuffix: 'Free Online AI PDF Translator',
|
||||||
|
metaDescription: 'Translate PDF documents to any language using AI. Free online PDF translation with preserved formatting.',
|
||||||
|
category: 'AI',
|
||||||
|
relatedSlugs: ['chat-pdf', 'summarize-pdf', 'ocr', 'pdf-to-word'],
|
||||||
|
keywords: 'translate pdf, pdf translator, document translation, ai translation, multilingual pdf',
|
||||||
|
features: [
|
||||||
|
'Translate PDF content to any language',
|
||||||
|
'AI-powered accurate translation',
|
||||||
|
'Preserves document context',
|
||||||
|
'Free and secure',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'How do I translate a PDF?', answer: 'Upload your PDF, select the target language, and our AI will translate the content while maintaining the original meaning and context.' },
|
||||||
|
{ question: 'What languages are supported?', answer: 'You can translate to and from virtually any language including English, Arabic, French, Spanish, German, Chinese, and many more.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
i18nKey: 'tableExtractor',
|
||||||
|
slug: 'extract-tables',
|
||||||
|
titleSuffix: 'Free Online PDF Table Extractor',
|
||||||
|
metaDescription: 'Extract tables from PDF documents into structured data online for free. Detect and export tabular data from any PDF.',
|
||||||
|
category: 'AI',
|
||||||
|
relatedSlugs: ['pdf-to-excel', 'chat-pdf', 'summarize-pdf', 'pdf-to-word'],
|
||||||
|
keywords: 'extract tables from pdf, pdf table extractor, pdf to table, detect pdf tables, table data extraction',
|
||||||
|
features: [
|
||||||
|
'Automatic table detection in PDFs',
|
||||||
|
'Extract structured tabular data',
|
||||||
|
'View tables with headers and rows',
|
||||||
|
'Free and easy to use',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'How does table extraction work?', answer: 'Upload a PDF and our tool automatically detects tables on each page, extracting headers and data into a structured view you can review.' },
|
||||||
|
{ question: 'Can I export extracted tables?', answer: 'Yes, the extracted data is displayed in a structured format. For Excel export, use our PDF to Excel tool.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
|
||||||
|
// ─── UTILITY TOOLS ──────────────────────────────────────────
|
||||||
|
{
|
||||||
|
i18nKey: 'qrCode',
|
||||||
|
slug: 'qr-code',
|
||||||
|
titleSuffix: 'Free Online QR Code Generator',
|
||||||
|
metaDescription: 'Generate QR codes from text, URLs, or any data. Customize size and download as PNG. Free online QR code maker.',
|
||||||
|
category: 'Utility',
|
||||||
|
relatedSlugs: ['compress-image', 'image-converter', 'html-to-pdf', 'pdf-to-images'],
|
||||||
|
keywords: 'qr code generator, create qr code, qr code maker, generate qr, qr code free',
|
||||||
|
features: [
|
||||||
|
'Generate QR codes from any text or URL',
|
||||||
|
'Customize QR code size',
|
||||||
|
'Download as high-quality PNG',
|
||||||
|
'Instant generation, free forever',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'How do I create a QR code?', answer: 'Enter your text, URL, or data in the input field, choose the desired size, and click generate. Your QR code will be ready to download instantly.' },
|
||||||
|
{ question: 'What can I encode in a QR code?', answer: 'You can encode any text, URLs, email addresses, phone numbers, Wi-Fi credentials, and more.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
i18nKey: 'videoToGif',
|
||||||
|
slug: 'video-to-gif',
|
||||||
|
titleSuffix: 'Free Online Video to GIF Converter',
|
||||||
|
metaDescription: 'Create animated GIFs from video clips online for free. Customize start time, duration, and quality.',
|
||||||
|
category: 'Utility',
|
||||||
|
relatedSlugs: ['compress-image', 'image-converter', 'image-resize'],
|
||||||
|
keywords: 'video to gif, convert video to gif, gif maker, create gif from video, animated gif',
|
||||||
|
features: [
|
||||||
|
'Convert video clips to animated GIFs',
|
||||||
|
'Customize start time and duration',
|
||||||
|
'Adjust output quality',
|
||||||
|
'Free and no registration',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'How do I create a GIF from a video?', answer: 'Upload a video file, set the start time and duration, choose the quality level, and download your animated GIF.' },
|
||||||
|
{ question: 'What video formats are supported?', answer: 'Most common video formats are supported including MP4, MOV, AVI, and WebM.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
i18nKey: 'wordCounter',
|
||||||
|
slug: 'word-counter',
|
||||||
|
titleSuffix: 'Free Online Word Counter Tool',
|
||||||
|
metaDescription: 'Count words, characters, sentences, and paragraphs in your text instantly. Free online word counter and text analyzer.',
|
||||||
|
category: 'Utility',
|
||||||
|
relatedSlugs: ['text-cleaner', 'summarize-pdf', 'translate-pdf'],
|
||||||
|
keywords: 'word counter, character counter, word count, text counter, letter counter',
|
||||||
|
features: [
|
||||||
|
'Count words, characters, sentences, paragraphs',
|
||||||
|
'Real-time counting as you type',
|
||||||
|
'Reading time estimate',
|
||||||
|
'Free with no limits',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'How does the word counter work?', answer: 'Simply paste or type your text in the input area. Word count, character count, sentence count, and paragraph count update in real time.' },
|
||||||
|
{ question: 'Does it count spaces?', answer: 'Character count is shown both with and without spaces.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
i18nKey: 'textCleaner',
|
||||||
|
slug: 'text-cleaner',
|
||||||
|
titleSuffix: 'Free Online Text Cleaner & Formatter',
|
||||||
|
metaDescription: 'Clean up your text by removing extra spaces, converting case, and formatting. Free online text cleaning tool.',
|
||||||
|
category: 'Utility',
|
||||||
|
relatedSlugs: ['word-counter', 'ocr', 'summarize-pdf'],
|
||||||
|
keywords: 'text cleaner, clean text, remove extra spaces, text formatter, text cleanup tool',
|
||||||
|
features: [
|
||||||
|
'Remove extra whitespace and line breaks',
|
||||||
|
'Convert text case (upper, lower, title)',
|
||||||
|
'Clean up pasted text from various sources',
|
||||||
|
'Instant results, free forever',
|
||||||
|
],
|
||||||
|
faqs: [
|
||||||
|
{ question: 'What does the text cleaner do?', answer: 'It removes extra spaces, normalizes whitespace, converts text case, and cleans up formatting issues common when copying text from various sources.' },
|
||||||
|
{ question: 'Can I convert text to uppercase?', answer: 'Yes, you can convert text to uppercase, lowercase, or title case with a single click.' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
/** Look up a tool's SEO data by slug */
|
||||||
|
export function getToolSEO(slug: string): ToolSEO | undefined {
|
||||||
|
return TOOLS_SEO.find((t) => t.slug === slug);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Get all tool slugs for sitemap generation */
|
||||||
|
export function getAllToolSlugs(): string[] {
|
||||||
|
return TOOLS_SEO.map((t) => t.slug);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user